257

我想知道= +_运算符在 JavaScript 中的含义。它看起来像是在做作业。

例子:

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

12 回答 12

405
r = +_;
  • +尝试将任何_内容转换为数字。
  • _只是一个变量名(不是运算符),它可以是afoo

例子:

+"1"

将“1”转换为纯数字 1。

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

r是现在1,不是"1"

此外,根据算术运算符的 MDN 页面

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

还注意到,

一元加法是将某物转换为数字的最快和首选方法

于 2013-02-28T06:44:08.977 回答
95

它不是赋值运算符。

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

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

不要将其与+=操作员混淆

于 2013-02-28T06:45:11.187 回答
54

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

像:

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

我的以下代码将帮助您展示=+字符串 转换为int的用法。
例子:

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

输出10

使用:所以这里y是 int5因为=+
否则:

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

输出55

as_是一个变量。

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

输出10

此外, 知道您也可以使用~(if string is int string (float will be round of to int) 来实现 同样的事情会很有趣

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

也输出10

~is bitwise NOT :反转其操作数的位。我做了两次,幅度没有变化。

于 2013-02-28T06:44:41.013 回答
16

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

+'32'返回 32。

+'a'返回 NaN。

所以你可以用isNaN()它来检查它是否可以变成数字。

于 2013-02-28T06:44:38.903 回答
16

这是一个偷偷摸摸的。

要理解的重要一点是,这里的下划线字符实际上是一个变量名,而不是一个运算符。

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

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

它可能不是故意写来混淆的,因为有经验的 Javascript 程序员通常会将下划线识别为变量。但是如果你不知道那肯定是很混乱的。我当然不会那样写。在最好的情况下,我不喜欢短的无意义的变量名——如果你想在 JS 代码中使用短的变量名来节省空间,请使用缩小器;不要以短变量开头。

于 2013-02-28T12:59:26.270 回答
12

= +_ 将 _ 转换为数字。

所以

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

会输出数字。

于 2013-02-28T06:50:49.807 回答
9

我想你的意思是r = +_;?在这种情况下,它是将参数转换为 a Number。说_是'12.3',然后+'12.3'返回12.3。所以在引用的语句+_中赋值给r.

于 2013-02-28T06:45:50.787 回答
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 boolean
1 number false
于 2013-03-01T07:41:56.613 回答
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
于 2013-02-28T06:45:48.313 回答
4

简单地说,+_ 相当于使用Number()构造函数。

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

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

演示:http: //jsfiddle.net/dirtyd77/GCLjd/


更多信息也可以在 MDN - 一元加号 (+) 部分找到:

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

于 2014-03-27T17:31:01.077 回答
3

+_几乎等同parseFloat(_)。请注意,parseInt它将停在非数字字符(例如点)处,而parshFloat不会。

经验:

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

经验:

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

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

很少有区别:

于 2013-07-17T03:42:01.613 回答
2

在这个表达式中:

r = +_;
  • '+' 在这里充当一元运算符,尝试转换右操作数的值。它不转换操作数,而是转换评估值。_如果原来是这样,那么将保持“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是更好的可读性替代方案。

于 2013-05-15T15:16:49.150 回答