深刻理解 JS 中的類型轉化

哪些操做能致使類型轉換呢javascript

if 條件判斷

爲 false 的值 -> false undefined null 0 '' NaNjava

運算符操做

常見的運算符 + - * /
+ 比較特殊除了相加以外 還有字符串拼接的含義code

1)數字和非字符串相加對象

1 + null -> 0;

// undefined 比較特殊 表示未定義的,不是一個數字
1 + undefined -> NaN

// 會把空對象轉換成數字,若是轉換不成數字就變成字符串拼接
1 + {} -> 1[object object]

2)非數字相加ip

// 把兩邊都轉化成數字
true + true -> 2

// 若是有一方是字符串,則進行字符串拼接
true + {} -> true[object object]

valueOf / toString

對象的原型鏈上有 valueOf 和 toString 兩個方法原型鏈

let obj = {
  symbol[toPrimitive](){
    return 500
  },
  valueOf(){
    return 100
  },
  toString(){
    return 200
  }
}

// 兩邊都轉換成數字 obj 先調用 valueOf valueOf 若是返回不是數字 則繼續調用 toString 方法
true + obj -> 101

symbol[toPrimitive] 是對象內置屬性,當一個對象要轉換成對應的原始類型時,會調用此方法。字符串

總結下,當對象要進行類型轉換時,會依次調用 symbol[toPrimitive] valueOf toString 原型

+ 、- 、!

+ - 和 ! 同樣,能夠放在變量前面,進行快速類型轉換it

1 + +'1234' -> 1235

1 + '1234'  -> '11234'

比較元算 > = <

1)數字和數字直接比較console

2)字符串比較

// 字符串和字符串,比較的是 AscII 碼
console.log('a'.charCodeAt(0))
console.log('b'.charCodeAt(0))

'a' < 'b' -> true
'a' < 'bdede' -> true // 同樣的由於比的是第一位

// 數字和字符串相比,字符串先轉化成數字,若是轉化不成數字 這比較始終返回 false
1 < '123' -> true
1 < '1df' -> false

// 若是是對象和字符串相比,須要把對象先轉化成基本類型(字符串以後再比較)
[] == '' -> true
// [].valueOf 爲[],繼續調用 [].toString 爲 '',比較返回 true

3) == 比較

若是一方是數字,會先把另外一方轉換成數字 而後比較

若果其中一方是 boolean 類型 會把 boolean 類型轉換爲數字

null == undefined // true

null、undefined 和任何類型相比 == 都返回 false

NaN 和任何類型相比返回 false 包括它自己

舉例

console.log([] == ![]);
// [] == false  單目運算優先級最高 爲 false 的狀況 false undefined NaN null 0 ''
// [] == 0      [].valueOf()  -> [] 不是原始類型繼續調用 toSting 
// [] == 0      [].toString() -> ''
// '' == 0      Number('')
//  0 == 0      true

(完)

相關文章
相關標籤/搜索