JavaScript中的= + _是什么意思

时间:2013-02-28 06:42:28

标签: javascript operators

我想知道JavaScript中的 = + _ 运算符是什么意思。它看起来像是分配。

示例:

hexbin.radius = function(_) {
   if (!arguments.length)
       return r;
   r = +_;
   dx = r * 2 * Math.sin(Math.PI / 3);
   dy = r * 1.5;
   return hexbin;
};

12 个答案:

答案 0 :(得分:389)

r = +_;
  • +尝试将任何_投射到一个数字。
  • _只是变量名称(不是运算符),可以是afoo等。

示例:

+"1"

将“1”投射到纯数字1。

var _ = "1";
var r = +_;

r现在是1,而不是"1"

此外,根据MDN page on Arithmetic Operators

  

一元加号运算符在其操作数之前,并计算其值   操作数,但尝试将其转换为数字,如果不是   已经即可。 [...] 它可以转换整数和字符串的表示形式   浮点数,以及非字符串值truefalsenull。   十进制和十六进制("0x" - 前缀)格式的整数是   支持的。支持负数(但不支持十六进制)。如果它   无法解析特定值,它将评估为NaN

还注意到

  

一元加号是将某些东西转换为数字的最快和首选方式

答案 1 :(得分:95)

它不是赋值运算符。

  • _只是传递给函数的参数。

    hexbin.radius = function(_) {
                    //       ^ It is passed here
        // ...
    };
    
  • 在下一行r = +_; + infront将该变量(_)转换为数字或整数值,并将其分配给变量r

请勿使用+=运算符

进行混淆

答案 2 :(得分:54)

=+实际上两个运算符=是赋值,+_是变量名。

喜欢:

i = + 5;
or 
j = + i;
or 
i = + _;

我的以下代码将帮助您显示使用=+字符串转换为 int
例如:

y = +'5'
x = y +5
alert(x);

输出 10

使用:因为y因此5=+ 否则:

y = '5'
x = y +5
alert(x);

输出 55

_是一个变量。

_ = + '5'
x = _ + 5
alert(x)

输出 10

<强>另外, 知道你也可以用~实现同样的事情(如果字符串是 int 字符串(浮点数将转为int)

y = ~~'5'  // notice used two time ~
x = y  + 5
alert(x);

还输出 10

~是按位NOT:反转其操作数的位。我做了两次没有改变幅度。

答案 3 :(得分:16)

不是=+。在JavaScript中,+表示将其更改为数字。

+'32'返回32。

+'a'返回NaN。

因此,您可以使用isNaN()检查是否可以将其更改为数字。

答案 4 :(得分:15)

这是一个偷偷摸摸的人。

要理解的重要一点是,中的下划线字符实际上是变量名称,而非操作符。

前面的加号是获得下划线的正数值 - 即有效地将下划线变量转换为int。您可以使用parseInt()获得相同的效果,但这里可能会使用加号转换,因为它更简洁。

这只是将等号作为标准变量赋值。

可能并非故意写入混淆,因为经验丰富的Javascript程序员通常会将下划线视为变量。但如果你不知道它肯定是非常令人困惑的。我当然不会这样写;在最好的情况下,我不喜欢简短无意义的变量名称 - 如果你想在JS代码中使用短变量名来节省空间,可以使用缩小器;不要用短变量来编写它。

答案 5 :(得分:12)

= + _会将_转换为数字。

所以

var _ = "1",
   r = +_;
console.log(typeof r)

会输出数字。

答案 6 :(得分:9)

我想你的意思是r = +_;?在这种情况下,它将参数转换为Number。说_是'12 .3',然后+'12.3'返回12.3。因此,引用的语句+_已分配给r

答案 7 :(得分:6)

_只是一个变量名称,作为函数hexbin.radius的参数传递,+将其转换为数字

让我像你的功能一样做一个例子。

var hexbin = {},r  ;

hexbin.radius = function(_) {
   if (!arguments.length)
      return r;
   console.log( _ , typeof _ )    
   r = +_;
   console.log( r , typeof r , isNaN(r) );   
}

并运行此示例函数..输出

hexbin.radius(“1”);

1 string
1 number false 

hexbin.radius(1);

1 number
1 number false

hexbin.radius([]);

[] object
0 number false

hexbin.radius('a');

a string
NaN number true

hexbin.radius({});

Object {} object
NaN number true

hexbin.radius(true);

true boolean
1 number false

答案 8 :(得分:5)

它会为左侧变量赋一个新值。

var a=10;
var b="asg";
var c=+a;//return 10
var d=-a;//return -10
var f="10";

var e=+b;
var g=-f;

console.log(e);//NAN
console.log(g);//-10

答案 9 :(得分:3)

+_几乎与parseFloat(_)等效。注意parseInt将停止在非数字字符(如点)上,而parshFloat则不会。

EXP:

    parseFloat(2.4) = 2.4 
vs 
    parseInt(2.4) = 2 
vs 
    +"2.4" = 2.4

Exp:

var _ = "3";
    _ = +_;

console.log(_); // will show an integer 3

很少有差异:

答案 10 :(得分:3)

简单地说,使用Number()构造函数,+_ 等同于

事实上,它甚至适用于日期:

var d = new Date('03/27/2014');
console.log(Number(d)) // returns 1395903600000
console.log(+d) // returns 1395903600000

样本: http://jsfiddle.net/dirtyd77/GCLjd/


还可以找到更多信息on MDN - Unary plus (+) section

  

一元加运算符在其操作数之前,并计算其操作数,但是如果它已经没有,则尝试将其转换为数字。虽然一元否定( - )也可以转换非数字,但是一元加号是将某些东西转换为数字的最快和首选方式,因为它不会对数字执行任何其他操作。它可以转换整数和浮点数的字符串表示形式,以及非字符串值true,false和null。支持十进制和十六进制(&#34; 0x&#34; -prefixed)格式的整数。支持负数(但不支持十六进制)。如果它无法解析特定值,它将评估为NaN。

答案 11 :(得分:2)

在这个表达式中:

r = +_;
  • '+'在此处作为一元运算符,尝试 转换 右操作数的值。它不转换操作数,而是转换评估值。因此_如果原来是{1}将保持“1”,但r将成为纯数。

考虑这些情况是否要将+应用于数字转换

+"-0" // 0, not -0
+"1" //1
+"-1" // -1
+"" // 0, in JS "" is converted to 0
+null // 0, in JS null is converted to 0
+undefined // NaN
+"yack!" // NaN
+"NaN" //NaN
+"3.14" // 3.14

var _ = "1"; +_;_ // "1"
var _ = "1"; +_;!!_ //true
var _ = "0"; +_;!!_ //true
var _ = null; +_;!!_ //false

尽管如此,它是最快的数字转换器,如果完全使用它,我几乎不推荐过度使用它。 parseInt/parseFloat是更好的可读替代方案。