我正在阅读underscore.js图书馆,我发现了之前没有遇到的事情:
if (obj.length === +obj.length) { ... }
+
运营商在那里做什么?对于上下文,这里是文件该部分的direct link。
答案 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有两种类型的相等和不等式运算符:
3 === "3"
表示错误)。3 == "3"
表示为真)。严格的平等和不平等并不会强迫价值。因此,数字3
不等于字符串"3"
。正常的平等和不平等确实会强迫价值。因此,数字3
等于字符串"3"
。
现在,上面的代码只是使用obj.length
运算符将+
强制转换为数字,并严格检查强制之前和之后的值是否相同(即obj.length
输入number
)。它在逻辑上等同于以下代码(只是更简洁):
if (typeof obj.length === "number") {
// code
}