console.log([] + []) // '' console.log([] + {}) // [object Object]console.log({} + {}) // [object Object][object Object]console.log(+ []) // 0
在JS中做一元操作符时,会先转换为原始类型 string number undefind null boolean ;
非原始类型会调用toPrimitive内部运算
toPrimitive(value,preferdType) preferdType 取值是number string defalut
当取值是number的时候
判断value是否为原始类型 是的话直接返回 否则调用valueOf() 如果能得到原始类型 则返回,否则调用toString()
当取值为string的时候
上面的2 3 步相反
当取值为defalut的时候 默认defalut是number 所以跟number的时候是一样的
运算符其中一个是字符串 那么 两边都需要转换为字符串 然后做拼接的操作 反正其中一个是字符串 就会做拼接的操作
console.log('12'+1); // 121
console.log('abc'+'def'); // abcdef
console.log('1'+true); //1true
console.log('1'+undefined); //1undefined
console.log('1'+null); //1null
运算符其中一是数字 则进行相加操作
console.log(1+1); // 2
console.log(1+'def'); // 1def
console.log(1+true); //2
console.log(1+undefined); //NaN
console.log(1+null);
当都是原始类型进行相加操作,那么都会转换为数字
console.log(true+true); // 2
console.log(true+null); // 1
console.log(true+undefined); //NaN
console.log(undefined+null); //NaN
console.log(undefined+undefined); //NaN
console.log(null+null); //0
一元加号运算时,唯一的运算元相当于强制求出数字值的Number([])运算。
console.log(+[]); // 0
console.log(+{}); // NaN
console.log(+null); //0
console.log(+true); //1
console.log(+undefined); //NaN