【克服 JS 】第三章 型別與運算子
JavaScript 全攻略:克服 JS 的奇怪部分,第二章 型別與運算子 Typing and Operator,學習紀錄。
Udemy 課程連結:
JavaScript 全攻略:克服 JS 的奇怪部分
3-1 觀念小叮嚀:型別與 JavaScript
動態型別 Dynamic Typing,一個描述 JavaScript 處理型別方式的名詞,JavaScript 的變數不用預先設定是什麼型別,會在執行時自動判別。
3-2 純值 Primitive Types(又稱原始型別、基本型別)
基本型別是指一種資料的型別(型態),換句話說,純值(基本型別)不是物件,因為物件就是名稱/值配對的組合物。
JavaScript 有種六種基本型別:
- Undefined,未定義,剛建立的變數還沒賦值時,其值就是 undefined。
- Null,空值,代表不存在,要設定變數的值不存在時,可指定為 null,不要指定為 undefined。
- Boolean,布林值,只有兩個值 true 或 false。
- Number,數值(整數或浮點數),不像其他語言有分整數和浮點數,JavaScript 的數字型別就只有number。
- String,字串,由字符組成,可以用單引號或雙引號來表示。
- symbol,ES6 新增的型別,可以賦予變數獨特性、獨一性。
3-3 觀念小叮嚀:運算子 Operator
在 JavaScript 中有不少運算子種類:算術運算子、賦值運算子、比較運算子、邏輯運算子等等。
運算子其實也是函數的一種,例如: var a = 4 + 3
可以看成是
var a = +(4,3)
3-4 運算子的優先性(Precedence)與相依性(Associativity)
什麼決定運算子的執行順序? 看運算子的兩個特性,優先性與相依性來決定。
優先性
表示哪一個運算子被優先運算,當同一行程式有不只一個運算子時,具高優先性的運算子會先計算,然後依序算到排序等級低的運算子。
相依性
表示運算子被計算的順序,若是左到右計算的運算子就稱為左相依性,右到左則稱為右相依性。
若運算子的優先性都相同,那就是依據相依性來判斷順序,決定是左到右還是右到左運算。
參考資料
算子優先序|MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness
3-5 觀念小叮嚀:強制轉型(Coercion)
JavaScript 是動態型別 Dynamic Typing 語言,故非常容易發生強制型轉這件事,例如:
var a = 1 + '2'
console.log(a) // 12
typeof(a) // string
將一個數字 1
與字串
'2'
相加時,JavaScript 會先將數字 1 轉為字串
'1'
,+
號變成字串相連的運算子,輸出為
'12'
。
3-6 比較運算子
console.log(1 < 2 < 3) // true
console.log(3 < 2 < 1) // true
第一行好像合理,但為何第二行也是 true 呢?
當運算子優先性相同,就依據相依性來判斷是左到右執行還是右到左執行。
所以 3 < 2 < 1
的執行順序是先比較 3 和 2,再比較 1。
3 < 2
相比結果是 false
,接著再運行
false < 1
的相比較。
在 JavaScript 中,true
若被強制型轉成數值會是 1,false
被強制型轉成數值會是 0。
這裡的 false
因為與數值進行比較判斷,被 JavaScript 自動型轉成
0,變成 0 < 1
,而 0 < 1
成立,回傳結果
true
。
要判斷哪些東西會被轉型成數字可以用Number()這個內建函式:
Number(true) // 1
Number(false) // 0
Number('3') // 3
Number(undefined) // NaN
Number(null) // 0
NaN 在 JavaScript 中表示 Not a Number。
使用比較運算子,尤其是 ==
時,容易出現未預期的結果:
'3' == 3 // true
false == 0 // true
null == 0 // false
null < 1 // true
'' == 0 // true
'' == false // true
所以沒特別需求時,要比較變數是否相同時一律改用
===
,強制型別相同且值也相同時才會輸出 true
。
參考資料
相等性比較表格|MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness
3-7 存在 Existence 與布林 Boolean
JavaScript 常發生型別轉換這件事,可以用
Boolean()
這個內件函式,來判斷型別轉為布林的結果。
Boolean(undefined) // false
Boolean(null) // false
Boolean('') // false
各種代表沒有的值,都會輸出 false
。
可以利用強制型轉的特性,用 if
來判斷是否有取得值:
var a
if(a) {
console.log('a 取得某個值')
}
但要注意 Boolean(0)
也是輸出 false
。
var a
if(a || a === 0) {
console.log('a 取得某個值')
}
許多框架、函式庫、JS 套件利用這個特性來設計。
3-8 預設值
當函式呼叫時需要傳入參數,但呼叫的時候沒有輸入的時候,例如:
function greet(name) {
console.log('Hello ' + name)
}
greet('Tony') // 顯示 Hello Tony
greet() // 顯示 Hello undefined
沒有給輸入值時,JavaScript 不會出現錯誤,name
就變成一個有建立但沒有賦值的變數,預設的值就是 undefined
。
如果想要在 JavaScript 函數的輸入值設定預設值的話,可以這樣寫:
function greet(name) {
name = name || '<Your name here>'
console.log('Hello ' + name)
}
greet('Tony') // 顯示 Hello Tony
greet() // 顯示 Hello <Your name here>
這是利用了 ||
運算子與型別轉換的特性:
undefined || 'hello' // 輸出 'hello'
'hi' || 'hello' // 輸出 'hi'
0 || 1 // 輸出 1
null || 'hello' // 輸出 'hello'
'' || 'hello' // 輸出 'hello'
undefined
會被轉成 false
,而有值的東西會被轉為
true
,但也要注意輸入值若是數字 0 的時候也會被當成未輸入。