研究 js 加号操作符的时候, 无意中试验了一个
console.log({}+"str");//NaN
发现结果居然是 NaN, 这让我百思不得其解
我查阅资料, js 高级编程里是这样总结的:
如果两个操作符都是数字, 执行常规的加法计算;(试验这句没毛病)
如果有一个操作数是字符串, 那么就要应用如下规则:
如果两个操作数都是字符串, 则将第二个操作数与第一个操作数拼接起来;(试验这句没毛病)
如果只有一个操作数是字符串, 则将另一个操作数转换为字符串, 然后再将两个字符串拼接起来
如果有一个操作数是对象数值或布尔值, 则调用他们的 toString()方法取得相应的字符串值, 然后再应用前面关于字符串的规则对于 undefined 和 null, 则分别调用 String()函数并取得字符串 "undefined" 和 "null"
正如我前面的试验, 有一个操作数是字符串, 一个操作数是对象, 按照这一规律理解, 计算步骤: 空对象{}.toString(), 得到字符串 "[object Object]", 然后再与字符串 "str" 进行拼接, 最后结果是字符串 "[object Object]str", 试验所得为 NaN, 显然摘抄自高级编程里的结论不适用
- console.log({}+1);//1
- console.log({};+"str");//NaN
对象与数字, 如果按照结论来, 应该是字符串 "[object Object]1", 而试验结果是数字 1; 有没有觉得奇怪这该如何理解
当然我想到的这些都是比较特殊的, 对于一般的字符串与数字相加, 不需要特殊处理
看一个比较正常的对象分别字符串和数字相加
- console.log(({})+"str");
- console.log(({})+2);
这两个用上面的规律, 没毛病, 结果如你所想
总结出的规律, 可以任意做实验:
+ 遇到字符串是字符串拼接(由于加引用类型值, 首先会转换为字符串, 所以也是字符串拼接), 如果遇不到字符串就是数学运算
{}+"str" 不是按照加法运算的, 它是先把 {} 当做一个块级作用域 (ES6 中的语法), 也就是浏览器是执行两个操作, 一个操作是{这里可以写任何代码} 的块级作用域, 一个是 +"str" 的操作, 注意这里的 + 并不是数学加, 也不是字符串连接, 而是正号,"str" 转换为 Number, 为 NaN
如果是 ({})+1 就是回归到数学字符串相加, 对象会变为字符串 '[object Object]1'
来源: https://www.cnblogs.com/coyote/p/8691542.html