今天收到一个问题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]
其余以此类推可得。
懂了没~