JS 加法知多少?

今天收到一個問題

var a = +[]

別用控制檯,能說出來是多少?

一下沒反應過來,不知道你說對了沒

反正我說錯了,哈哈哈~

好了,先公佈結果

console.log(+[]) // 0 
console.log(0 + []) // '0'
console.log(0 - []) // 0
console.log([] + []) // ''
console.log({} + []) // '[object Object]'

下面好好分析分析到底是啥原理。

加法運算

1、加號運算符只能用於原始數據類型,對於對象類型的值,需要進行數據轉換

2、在轉換後,如果其中一個運算元出現原始數據類型是“字符串”類型值時,則另一運算元強制轉換爲字符串,然後做字符串的連接運算

3、在其他情況時,所有運算元都會轉換爲原始數據類型的“數字”類型值,然後作數字的相加

Number() 轉換規則

  1. 如果是 Boolean 值,truefalse 將分別轉換爲 1 和 0。
  2. 如果是數字值,只是簡單的傳入和返回。
  3. 如果是 null 值,返回 0。
  4. 如果是 undefined ,返回 NaN
  5. 如果是字符串,遵循下列規則:

       (1) 如果字符串截去開頭和結尾的空白字符後,不是純數字字符串,那麼最終返回結果爲 `NaN`。 
    
       (2) 如果是字符串中只包含數字(包括前面帶正號或負號的情況),則將其轉換爲十進制數值,即“1”變成1,“123”會變成123,而“011”會變成11(前導的零被忽略了); 
    
       (3) 如果字符串中包含有效的浮點格式,如“1.1”,則將其轉換爲對應的浮點數值(同樣也會忽略前導零); 
    
       (4) 如果字符串中包含有效的十六進制格式,例如 `0xf`,則將其他轉換爲相同大小的十進制整數值; 
    
       (5) 如果字符串是空的(不包含任何字符),則將其轉換爲 0; 
    
       (6) 如果字符串中包含除上述格式之外的字符,則將其他轉換成 `NaN`。
    
  6. 如果是對象,則調用對象的 valueOf() 方法,然後依照前面的規則轉換返回的值。如果轉換的結果是 NaN,則調用對象的 toString()
    方法,然後再次依照前面的規則轉換返回的字符串值。

示例

console.log(Number(undefined)) // NaN
console.log(Number(null)) // 0
console.log(Number(NaN)) // NaN
console.log(Number('')) // 0
console.log(Number({})) // NaN
console.log(Number({a:1})) // NaN
console.log(Number([])) // 0
console.log(Number([1])) // 1
console.log(Number([1,2])) // NaN

console.log(String(undefined)) // 'undefined'
console.log(String(null)) // 'null'
console.log(String(NaN)) // 'NaN'
console.log(String({})) // '[object Object]'
console.log(String({a:1})) // '[object Object]'
console.log(String([])) // ''
console.log(String([1])) // '1'
console.log(String([1,2])) // '1,2'

分析

  1. +[][] 是對象,依據第六條規則,轉換的結果是 NaN,然後調用對象的 toString() 方法,得到 '' 空字符串,Number('') => 0,所以 +[] => 0,結果爲數字 0
  2. 0 + [],得到 0 + '' => '0' ,結果爲字符串 0
  3. {} + [],得到 '[object Object]' + '' => '[object Object]',結果爲字符串 [object Object]

其他以此類推可得。

懂了沒~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章