11

我正在阅读underscore.js库,发现了一些我以前没有遇到过的东西:

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

那个+接线员在那里做什么?对于上下文,这里是文件该部分的直接链接。

4

4 回答 4

7

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

于 2011-11-30T17:50:55.463 回答
4

根据MDN

一元加号运算符在其操作数之前并计算其操作数,但如果尚未转换为数字,则尝试将其转换为数字。例如,y = +x 获取 x 的值并将其分配给 y;也就是说,如果 x 为 3,则 y 将获得值 3,而 x 将保留值 3;但是如果 x 是字符串“3”,y 也将得到值 3。虽然一元否定 (-) 也可以转换非数字,但一元加号是将某物转换为数字的最快和首选方法,因为它不对该号码执行任何其他操作。它可以转换整数和浮点数的字符串表示形式,以及非字符串值 true、false 和 null。支持十进制和十六进制(“0x”前缀)格式的整数。支持负数(虽然不支持十六进制)。

于 2011-11-30T17:52:12.283 回答
3

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

于 2011-11-30T17:50:32.917 回答
2

检查是否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
}
于 2011-11-30T18:16:24.767 回答