Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
+;javascript中表达式之前的运算符:它做什么?_Javascript_Syntax_Operator Keyword_Unary Operator - Fatal编程技术网

+;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
    }