今天收到一個問題code
var a = +[]
對象
別用控制檯,能說出來是多少?字符串
一下沒反應過來,不知道你說對了沒console
反正我說錯了,哈哈哈~class
好了,先公佈結果原理
console.log(+[]) // 0 console.log(0 + []) // '0' console.log(0 - []) // 0 console.log([] + []) // '' console.log({} + []) // '[object Object]'
下面好好分析分析究竟是啥原理。object
一、加號運算符只能用於原始數據類型,對於對象類型的值,須要進行數據轉換 數據類型
二、在轉換後,若是其中一個運算元出現原始數據類型是「字符串」類型值時,則另外一運算元強制轉換爲字符串,而後作字符串的鏈接運算方法
三、在其餘狀況時,全部運算元都會轉換爲原始數據類型的「數字」類型值,而後做數字的相加數據
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
,結果爲數字 00 + []
,獲得 0 + '' => '0'
,結果爲字符串 0{} + []
,獲得 '[object Object]' + '' => '[object Object]'
,結果爲字符串 [object Object]
其餘以此類推可得。
懂了沒~