+;javascript中表达式之前的运算符:它做什么?
我在浏览图书馆时发现了一些我以前从未见过的东西:+;javascript中表达式之前的运算符:它做什么?,javascript,syntax,operator-keyword,unary-operator,Javascript,Syntax,Operator Keyword,Unary Operator,我在浏览图书馆时发现了一些我以前从未见过的东西: if (obj.length === +obj.length) { ... } 那个+操作员在那里干什么?对于上下文,这里是一个指向该文件部分的示例。这是一种确保obj.length是一个数字而不是一个潜在字符串的方法。原因是,如果长度(无论出于何种原因)是字符串变量,例如“3”,则===将失败。一元+运算符可用于在JavaScript中将值转换为数字。下划线似乎在测试.length属性是否是一个数字,否则它将不等于自身转换为一个数字。根据:
if (obj.length === +obj.length) { ... }
那个
+
操作员在那里干什么?对于上下文,这里是一个指向该文件部分的示例。这是一种确保obj.length是一个数字而不是一个潜在字符串的方法。原因是,如果长度(无论出于何种原因)是字符串变量,例如“3”,则===将失败。一元+
运算符可用于在JavaScript中将值转换为数字。下划线似乎在测试.length
属性是否是一个数字,否则它将不等于自身转换为一个数字。根据:
一元加号运算符位于其操作数之前,并计算为其
但尝试将其转换为数字(如果不是)
已经。例如,y=+x取x的值并将其赋值给
Y也就是说,如果x是3,y将得到值3,x将保留
值为3;但是如果x是字符串“3”,y也会得到值
3.虽然一元否定(-)也可以转换非数字,但一元加号是将某物转换为数字的最快和首选方式
编号,因为它不在上执行任何其他操作
号码。它可以转换整数和浮点数的字符串表示形式,
以及非字符串值true、false和null。整数
支持十进制和十六进制(“0x”-前缀)格式。
支持负数(但不支持十六进制)。如果不能
解析一个特定的值,它将计算为NaN
检查
obj.length
是否属于number
类型是一种很好的方法。您可以看到,+
操作符可以用于字符串强制。例如:
alert(+ "3" + 7); // alerts 10
这是可能的,因为+
运算符将字符串“3”
强制为数字3
。因此,结果是10
,而不是“37”
此外,JavaScript有两种类型的相等运算符和不相等运算符:
3==“3”
表示false)3==“3”
表示为真)3
不等于字符串“3”
。正常的相等和不相等会强制值。因此,数字3
等于字符串“3”
现在,上面的代码使用+
运算符将obj.length
强制为一个数字,并严格检查强制前后的值是否相同(即number
类型的obj.length
)。它在逻辑上等同于以下代码(只是更简洁):
它的可能重复是将strong转换为数字的另一种方式。您可以在这里使用它。使用
==
进行类型转换确实有点奇怪。@jfriend00有点奇怪。然而,我认为他们在任何地方都按照惯例使用=
,这是一种很好的做法。@DanielA.White这有点重复,但是我认为这个问题很有用,因为除非你已经知道‘一元加运算符’是什么,否则你不会找到另一个问题。obj.length===+obj.length
和typeof obj.length===“number”
之间的微妙区别在于typeof
检查将为NaN
返回true,与自身相比,作为一个数字是不可能的(NaN
不等于自身)。@MatthewCrumley-我不明白为什么会这样。是不是因为有两种类型的NaN:安静和信号?或者可能是因为NaN
值被视为对象?我认为这是因为从逻辑上讲,你不能说任何两个非数字的值必须相等。它还可以将诸如Math.sqrt(-1)===Math.sqrt(-2)
之类的表达式从求值变为true。此外,请注意(如果其他人将来找到此答案),除了接受的答案之外,还可以使用underline.js中的特定代码检查传入的obj是否是数组。在此上下文中,obj as数组返回true,obj as对象返回false。
if (typeof obj.length === "number") {
// code
}