我正在阅读underscore.js库,发现了一些我以前没有遇到过的东西:
if (obj.length === +obj.length) { ... }
那个+
接线员在那里做什么?对于上下文,这里是文件该部分的直接链接。
我正在阅读underscore.js库,发现了一些我以前没有遇到过的东西:
if (obj.length === +obj.length) { ... }
那个+
接线员在那里做什么?对于上下文,这里是文件该部分的直接链接。
一元运算+
符可用于将值转换为 JavaScript 中的数字。下划线似乎是在测试该.length
属性是一个数字,否则它将不等于 self-converted-to-a-number。
根据MDN:
一元加号运算符在其操作数之前并计算其操作数,但如果尚未转换为数字,则尝试将其转换为数字。例如,y = +x 获取 x 的值并将其分配给 y;也就是说,如果 x 为 3,则 y 将获得值 3,而 x 将保留值 3;但是如果 x 是字符串“3”,y 也将得到值 3。虽然一元否定 (-) 也可以转换非数字,但一元加号是将某物转换为数字的最快和首选方法,因为它不对该号码执行任何其他操作。它可以转换整数和浮点数的字符串表示形式,以及非字符串值 true、false 和 null。支持十进制和十六进制(“0x”前缀)格式的整数。支持负数(虽然不支持十六进制)。
这是一种确保 obj.length 是数字而不是潜在字符串的方法。这样做的原因是,如果长度(无论出于何种原因)是字符串变量,例如“3”,则 === 将失败。
检查是否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
}