【克服 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 的時候也會被當成未輸入。

參考資料:

JavaScript 基礎二三事|2018 iT 邦幫忙鐵人賽

那克斯的學習筆記

TOP