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


我在仔细阅读 underscore.js 图书馆和我发现了一些我之前没有遇到过的东西:

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

那是什么 + 那边的经营者?对于上下文,这是一个 直接链接 到该文件的那一部分。


8897
2017-11-30 17:47


起源

可能重复 什么是Unary Plus和Minus运营商的重要用途? - Daniel A. White
这是将强数转换为数字的另一种方法。你可以在这里玩 jsfiddle.net/wbednarski/uCm93 - Wojciech Bednarski
使用它似乎有点奇怪 ===带有类型转换。 - jfriend00
@ jfriend00一点点。但我认为他们使用 === 按惯例,这是一种很好的做法。 - Wojciech Bednarski
@DanielA.White这有点重复,但我认为这个问题很有用,因为除非你已经知道“一元加运算符”是什么,否则你找不到另一个问题。 - Ben Clayton


答案:


一元 + 运算符可用于将值转换为JavaScript中的数字。 Underscore似乎正在测试 .length property是一个数字,否则它将不等于self-converted-to-a-number。


7
2017-11-30 17:50



一个人 !! 用于强制转换为布尔值的“技巧”。 - Andrew Marshall
另请注意(如果其他人在将来找到此答案),除了接受的答案之外,还会使用underscore.js中的特定代码来检查传入的obj是否为数组。 obj作为此上下文中的数组返回true,obj作为对象返回false。 - CH Buckingham


根据 MDN

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


4
2017-11-30 17:52





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


3
2017-11-30 17:50





这是一个很好的黑客检查是否 obj.length 属于那种类型 number 或不。你明白了 + 运算符可用于字符串强制。例如:

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

这是可能的,因为 + 运算符强制字符串 "3" 这个数字 3。因此结果是 10 并不是 "37"

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

  1. 严格的平等和不平等(例如 3 === "3" 表示错误)。
  2. 正常的平等和不平等(例如 3 == "3" 表达真实)。

严格的平等和不平等并不会强迫价值。因此数量 3 不等于字符串 "3"。正常的平等和不平等确实会强迫价值。因此数量 3 等于字符串 "3"

现在,上面的代码只是强制执行 obj.length 用数字来表示 + 操作员,并严格检查强​​制之前和之后的值是否相同(即 obj.length 这种类型 number)。它在逻辑上等同于以下代码(仅更简洁):

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

2
2017-11-30 18:16



两者之间的细微差别 obj.length === +obj.length 和 typeof obj.length === "number" 是那个 typeof 检查将返回true NaN,比较自己作为数字不会(NaN 不等于自己)。 - Matthew Crumley
@MatthewCrumley - 我从来不明白为什么会这样。是因为有两种 NaN:安静和信号?或者也许是因为 NaN 值被视为对象? - Aadit M Shah
我认为这是因为从逻辑上讲,你不能说任何两个不是数字的值必须相等。它还保持表达式 Math.sqrt(-1) === Math.sqrt(-2) 从评估到真实。 - Matthew Crumley