JavaScript基礎篇[1] 變數與資料型別
JavaScript 基礎 – 變數與資料型別。
變數
可以將變數想像為一個盒子
,是用來存放資料
的。
在 JavaScript
中的變數宣告是有規則的,開頭必須是英文字母
、底線(_)
或錢字號($)
,後面可以接著英文字母
、底線(_)
或錢字號($)
以及數字。變數名稱不可以是保留字(Reserved Words)
與關鍵字(keyword)
。
JavaScript
是有區分大小寫的,變數 apple
與 Apple
將會被視為不同的兩個變數。且 1.3
版之後支援 Unicode
。代表著你可以用中文
來當變數名稱。
但還是避免使用非英文字母
來做變數名稱命名,用中文編碼
的話,其他語系系統開啟可能會造成亂碼的情況。
變數在使用前,可以透過 var
來進行宣告的動作。在 ES6 之後多了 let
與 const
兩種。
由於 JavaScript
是個 弱型別[註1] 的語言,變數本身無需宣告型別,型別的資訊只在值或物件本身。
1 | // 透過 var 宣告變數 apple 但沒賦予其值,此時 apple 的內容為 undefined。 |
若沒宣告變數就要使用的情況下,會出現 ReferenceError
。 如下:
1 | console.log(hello); |
或許你會發現,即便沒有用 var
進行變數宣告,仍可以定義變數並給予值。但強烈不建議這麼做。
因為,沒有使用 var
宣告的變數,全都會變成全域變數。
全域變數 後續再做解說。
1 | apple = 'apple'; |
註1: 程式語言中,是有型別系統(type system)
的。區分為強型別
、弱型別
。
強型別語言在定義變數時就必須給予變數指定型別,若這個變數做了錯誤型別運算,則會出現錯誤。弱型別語言則相反,雖然多了許多方便性,但要注意型別轉換時可能產生的非預期錯誤。
資料型別
變數沒有型別,值才有。
由於 JavaScript
是個弱型別的程式語言,嚴格來說,變數本身其實不帶有資料型別的資訊,其中的值或物件才有。
JavaScript
的型別主要可分為原始型別(Primitives)
與物件型別(Object)
。
原始型別包含了 string
、number
、boolean
、null
、undefined
。而在 ES6 中多了 Symbol
。
1 | typeof true; // 'boolean' |
string 字串
字串需用單引號 ' '
或雙引號 " "
包住,兩者不可混用,意思是誰開頭就要誰結尾。 單引號
與雙引號
的使用在 JavaScript
沒有什麼差異,依習慣使用即可。
1 | var str = '我是字串'; |
若引號不成雙對的話會出狀況,如:
1 | var str = 'Let's go!'; // Error |
如果真的非用單引號不可,則可用 \(跳脫字元 escape character)
處理:
1 | var str = 'Let\'s go!'; // OK |
組合字串用 +
:
1 | var str = 'Hello, ' + 'word.'; |
字串太長需換行銜接可用 \
:
1 | var str = '這是第一行 \ |
注意: \
後面不能有東西呦,包含空白。
number 數字
JavaScript
僅有的一種數值的型別,不管整數或小數點都是。
1 | var num = 1; |
特殊的數字 Infinity (無限大)
、-Infinity (負無限大)
,以及 NaN
。
備註: NaN
不是數值。
正數除以 0 會得到 Infinity (無限大)
,負數除以 0 會得到 -Infinity (負無限大)
。
1 | var num = 1 / 0; // Infinity |
那 0/0
呢? 結果是 NaN
。甚至是 Infinity / Infinity
或 -Infinity / -Infinity
也會都得到 NaN
。NaN
是個有趣的存在,字面上的意思是 Not a Number
。但用 typeof
來判斷,他又告訴你它是 number
。
1 | console.log(typeof NaN); // number |
NaN
無法做任何數字的運算,結果都會是 NaN
。也就是說 NaN
不屬於任何數字,甚至是自己。
1 | NaN === NaN; // false |
所以我們需要 isNaN
函示來檢查它:
1 | isNaN(NaN); // true |
順帶一提,JavaScript
的 number
也是基於 IEEE 754
來實作。
所以當你執行 0.1 + 0.2 == 0.3
時。
為什麼呢!?
這是因為… 自己看 Why 0.1 + 0.2 !== 0.3
不僅是 JavaScript
會產生這種問題,只要是採用 IEEE 754
的浮點數編碼方式來表示浮點數時,全都會產生這類問題。
boolean 布林值
JavaScript 中,所有的東西都可以轉換為 boolean。
boolean
就簡單多了,其值只有兩種: true
、false
。是由發明的科學家 George Boole 命名。
1 | var a = true; |
null & undefined
若使用 Boolean()
將 null
與 undefined
轉換為布林值,結果都會是 false
。但兩者間仍有意義上的差別,故將它們放在一起講。
兩者的共通點是都只有一種值,null
僅有 null
,undefined
僅有 undefined
。
1 | var a; // undefined, 宣告卻未給值。 |
-
undefined
代表的是**(此變數) 還沒有給值,所以不知道是什麼**。 -
null
代表的是此變數可能曾經有值),但現在沒有值。
也可以使用 Number()
強制轉換為數字來看出什麼。
1 | Number( null ); // 0 |
還有一點有趣的事,在非全域作用範圍下 undefined
允許被當成是變數使用。
1 | (function() { |
甚至是被當成參數來用:
1 | (function(undefined) { |
我看還是別這樣惡搞你的程式了吧。搞同事的就好!