想不到的:js中加号(+)操作符

研究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