在javascript中表达式之前的+运算符:它做了什么?

时间:2011-11-30 17:47:59

标签: javascript syntax operator-keyword unary-operator

我正在阅读underscore.js图书馆,我发现了之前没有遇到的事情:

if (obj.length === +obj.length) { ... }

+运营商在那里做什么?对于上下文,这里是文件该部分的direct link

4 个答案:

答案 0 :(得分:7)

一元+运算符可用于将值转换为JavaScript中的数字。下划线似乎测试.length属性是一个数字,否则它将不等于自己转换为数字。

答案 1 :(得分:4)

根据MDN

  

一元加号运算符在其操作数之前,并计算其值   操作数但尝试将其转换为数字,如果不是   已经。例如,y = + x取x的值并将其赋值给   Ÿ;也就是说,如果x为3,y将得到值3,x将保留   价值3;但如果x是字符串“3”,y也会获得该值   虽然一元否定( - )也可以转换非数字,但是一元加号是将某些东西转换成数字的最快和最优选的方式。   数字,因为它不执行任何其他操作   数。它可以转换整数和浮点数的字符串表示,   以及非字符串值true,false和null。整数   支持十进制和十六进制(“0x” - 前缀)格式。   支持负数(但不支持十六进制)。如果不能   解析一个特定的值,它将评估为NaN。

答案 2 :(得分:3)

这是确保obj.length是数字而不是潜在字符串的一种方法。这样做的原因是,如果长度(无论出于何种原因)是字符串变量,===将失败,例如“3”。

答案 3 :(得分:2)

检查obj.length是否属于number类型是一个很好的黑客。你看,+运算符可用于字符串强制。例如:

alert(+ "3" + 7); // alerts 10

这是可能的,因为+运算符会将字符串"3"强制转换为数字3。因此,结果为10而不是"37"

此外,JavaScript有两种类型的相等和不等式运算符:

  1. 严格的平等和不平等(例如3 === "3"表示错误)。
  2. 正常的平等和不平等(例如3 == "3"表示为真)。
  3. 严格的平等和不平等并不会强迫价值。因此,数字3不等于字符串"3"。正常的平等和不平等确实会强迫价值。因此,数字3等于字符串"3"

    现在,上面的代码只是使用obj.length运算符将+强制转换为数字,并严格检查强​​制之前和之后的值是否相同(即obj.length输入number)。它在逻辑上等同于以下代码(只是更简洁):

    if (typeof obj.length === "number") {
        // code
    }