我在仔细阅读 underscore.js 图书馆和我发现了一些我之前没有遇到过的东西:
if (obj.length === +obj.length) { ... }
那是什么 +
那边的经营者?对于上下文,这是一个 直接链接 到该文件的那一部分。
我在仔细阅读 underscore.js 图书馆和我发现了一些我之前没有遇到过的东西:
if (obj.length === +obj.length) { ... }
那是什么 +
那边的经营者?对于上下文,这是一个 直接链接 到该文件的那一部分。
一元 +
运算符可用于将值转换为JavaScript中的数字。 Underscore似乎正在测试 .length
property是一个数字,否则它将不等于self-converted-to-a-number。
根据 MDN:
一元加运算符在其操作数之前,并计算其值 操作数但尝试将其转换为数字,如果不是 已经。例如,y = + x取x的值并将其赋值给 Ÿ;也就是说,如果x为3,y将得到值3,x将保留 价值3;但如果x是字符串“3”,y也会获得该值 虽然一元否定( - )也可以转换非数字,但是一元加号是将某些东西转换为非数字的最快和最优选的方法。 数字,因为它不执行任何其他操作 数。它可以转换整数和浮点数的字符串表示, 以及非字符串值true,false和null。整数 支持十进制和十六进制(“0x” - 前缀)格式。 支持负数(但不支持十六进制)。如果不能 解析一个特定的值,它将评估为NaN。
这是确保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
}