我正在检查一些用UnderscoreJS编写的Javascript代码。在这里,有很多JS代码的实例是这样编写的:
if(length === +length){ //do something}
或
if(length !== +length){ //do something }
这到底是什么计算的?我以前从未见过这个。
答案 0 :(得分:9)
if (length === +length)
确保length
实际上是一个数值。
这里要理解两件事,
The Strict equality operator, will evaluate to true
only when the objects are the same。在JavaScript中,数字和字符串是不可变的。因此,当您比较两个数字时,将比较数字值。
一元+
运算符将尝试获取任何对象的数值。如果对象已经是Number
类型,它将不会进行任何更改并按原样返回对象。
在这种情况下,如果length
实际上是字符串格式的数字,请说"1"
,表达式
"1" == +"1"
将评估为true
,因为"1"
会在内部强制转换为数字1
并进行比较。但
"1" === +"1"
将转换为
"1" === 1
并且不会进行强制,因为类型不同,===
会评估为false
。如果length
属于任何其他类型,===
会立即返回false
,因为右侧是数字。
您可以将此检查视为此
的简写版本if (Object.prototype.toString.call(length) === "[object Number]")
答案 1 :(得分:3)
这是一种测试值是否为数字的方法。请参阅此示例:
> length="string"
> length === +length
false
> length=2
> length === +length
true
一元+
将变量length
转换为数字类型,因此如果它已经是数字,那么将满足标识。
使用标识运算符===
而不是等于运算符==
在这里很重要,因为它严格比较了操作数的值和类型。
执行相同测试的方式可能更明确(但稍长一些):
typeof length === "number"