zoukankan      html  css  js  c++  java
  • 想不到的: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'
     
      
      转载请注明出处~~

        

  • 相关阅读:
    利用@media screen实现网页布局的自适应
    心得体悟帖---200315(任何时候,都不要为不值得的人,不值得的事,费时间,费心力)
    心得体悟帖---200315(急啥,复习什么录什么)
    vue项目目录结构详解
    日常英语---200313(npm WARN deprecated vue-cli@2.9.6: This package has been deprecated in favour of @vue/cli)
    vuex是干什么的
    石川es6课程---4、箭头函数
    石川es6课程---3、变量let和常量const
    vue参考---eslink编码规范检查
    vue参考---vue项目结构
  • 原文地址:https://www.cnblogs.com/coyote/p/8691542.html
Copyright © 2011-2022 走看看