JS 加法知多少?
今天收到一個問題
var a = +[]
別用控制檯,能說出來是多少?
一下沒反應過來,不知道你說對了沒
反正我說錯了,哈哈哈~
好了,先公佈結果
console.log(+[]) // 0 console.log(0 + []) // '0' console.log(0 - []) // 0 console.log([] + []) // '' console.log({} + []) // '[object Object]'
下面好好分析分析到底是啥原理。
加法運算
1、加號運算子只能用於原始資料型別,對於物件型別的值,需要進行資料轉換
2、在轉換後,如果其中一個運算元出現原始資料型別是“字串”型別值時,則另一運算元強制轉換為字串,然後做字串的連線運算
3、在其他情況時,所有運算元都會轉換為原始資料型別的“數字”型別值,然後作數字的相加
Number() 轉換規則
-
如果是
Boolean
值,true
和false
將分別轉換為 1 和 0。 - 如果是數字值,只是簡單的傳入和返回。
-
如果是
null
值,返回 0。 -
如果是
undefined
,返回NaN
。 -
如果是字串,遵循下列規則:
(1) 如果字串截去開頭和結尾的空白字元後,不是純數字字串,那麼最終返回結果為 `NaN`。 (2) 如果是字串中只包含數字(包括前面帶正號或負號的情況),則將其轉換為十進位制數值,即“1”變成1,“123”會變成123,而“011”會變成11(前導的零被忽略了); (3) 如果字串中包含有效的浮點格式,如“1.1”,則將其轉換為對應的浮點數值(同樣也會忽略前導零); (4) 如果字串中包含有效的十六進位制格式,例如 `0xf`,則將其他轉換為相同大小的十進位制整數值; (5) 如果字串是空的(不包含任何字元),則將其轉換為 0; (6) 如果字串中包含除上述格式之外的字元,則將其他轉換成 `NaN`。
-
如果是物件,則呼叫物件的
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'
分析
-
+[]
,[]
是物件,依據第六條規則,轉換的結果是NaN
,然後呼叫物件的toString()
方法,得到''
空字串,Number('') => 0
,所以+[] => 0
,結果為數字 0 -
0 + []
,得到0 + '' => '0'
,結果為字串 0 -
{} + []
,得到'[object Object]' + '' => '[object Object]'
,結果為字串[object Object]
其他以此類推可得。
懂了沒~