JavaScript中的= +_是什么意思?

260
我在想JavaScript中的=+_运算符是什么意思。它似乎执行赋值操作。
例子:
hexbin.radius = function(_) {
   if (!arguments.length)
       return r;
   r = +_;
   dx = r * 2 * Math.sin(Math.PI / 3);
   dy = r * 1.5;
   return hexbin;
};

58
让我想起了好旧的逼近运算符--> - Oleg
12
这里的 "+" 是一元运算符,它的操作数是下划线。 - Pieter Witvoet
45
看起来像是 Perl 程序员无法摆脱默认变量的影响 ;-) - Michael Wild
4
良好的语法高亮会帮助您回答这个问题。 - hugo der hungrige
19
你可以制作一个笑脸表情 x= +_+ 0; - tckmn
显示剩余10条评论
12个回答

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

示例:

+"1"

将字符串 "1" 转换为纯数字 1。
var _ = "1";
var r = +_;

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

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

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

还指出:

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


2
+ 真的意味着将其转换为数字,还是 +_ 真的意味着 0+_,在这种情况下,必须在添加到 0 之前对 _ 进行转换? - colincameron
3
请参考MDN上的一元正号运算符页面 - lonesomeday
17
不,它们的行为不同。一元加号将值转换为数字,但是二元加号不会:+'12' === 12(结果是一个数字),但是 0 + '12' === '012'(结果是一个字符串)。但是请注意,0 - '12' === -12 - Kobi
1
@juzerali 当然可以,但这不是好的编程实践。尝试使用加法吧 ;) - Izkata
@AlvinWong 我不这么认为。在大多数浏览器上,| 要快得多。可能在 IE 上会慢一些。 - Grijesh Chauhan
显示剩余7条评论

95

这不是一个赋值运算符。

  • _ is just a parameter passed to the function.

    hexbin.radius = function(_) {
                    //       ^ It is passed here
        // ...
    };
    
  • On the next line r = +_; + infront casts that variable (_) to a number or integer value and assigns it to variable r

不要将其与 += 运算符混淆


54

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

例如:

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

以下代码将帮助您展示如何使用=+将一个字符串转换为整数
示例:

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

输出结果为10

用法:在这里y是整数5,因为使用了=+
否则:

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

输出55

其中_是一个变量。

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

输出 10

此外, 如果字符串是一个整数字符串(如果是浮点数,则会四舍五入为整数),则您也可以使用~来实现同样的目标。

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

还会输出10

~ 是按位取反符号:翻转其操作数的所有位。我使用了两次,但并未改变幅度。


1
我经常使用 x|0 将双精度转换为整数;然而,这种方法以及使用 '~' 的缺点是限制在小于 2^32 的数字上。+"2e15" 则没有这个限制。 - Aki Suihkonen
@AkiSuihkonen 是的,我相信 x|0+ 更快。对吧?这是个好技巧 : )。 (2) 我使用 ~ 只是为了向 OP 表明 + 不仅仅是一个符号可以使用(我自己也使用 +)。 - Grijesh Chauhan
很难说 - 不过可以使用jsperf来测量。另一方面,这两个运算符具有完全不同的含义。如果只需要一个数字(而不是整数),'+'无论如何都比较短。 - Aki Suihkonen
@AkiSuihkonen 实际上,位运算符比任何其他运算符都要快。这就是原因! - Grijesh Chauhan
1
实际上我刚刚在jsperf上测试了一下——'|0'的操作速度为18M,'+'的操作速度为19M;性能可能会因浏览器而异。http://jsperf.com/strtoint - Aki Suihkonen
1
@AkiSuihkonen 哎呀,我刚在 Firefox 上进行了 jsperf 测试,速度差别很大.. | 快多了。 - J.G.Sebring

16

这并不是=+。在JavaScript中,+表示将其转换为数字。

+'32'返回32。

+'a'返回NaN。

因此,您可以使用isNaN()来检查它是否可以转换为数字。


16

这是一个狡猾的例子。

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

加号表示获取下划线的正数值 - 即有效地将下划线变量转换为int。您可以使用parseInt()实现相同的效果,但在这里使用加号转换更加简洁。

这只留下等号作为标准变量赋值。

这可能不是有意混淆的写法,因为有经验的Javascript程序员通常会将下划线识别为变量。但如果您不知道它是什么,那肯定非常令人困惑。我肯定不会像这样编写它;我从来不喜欢短小无意义的变量名 - 如果您想在JS代码中使用短小的变量名以节省空间,请使用缩小器;不要一开始就使用短小的变量名编写它。


1
+1,因为你是唯一一个明确指出“_”是变量的人。 - TRiG
1
@TRiG,Starx的回答怎么样?他的回答没有太长,但是解释得很清楚吗? - Evan Davis

12

= +_ 将 _ 转换为数字。

因此

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

会输出数字。

9

我想你指的是 r = +_;?如果是这样,那么它是将参数转换为一个Number。假设_是'12.3',那么+'12.3'返回12.3。所以在引用语句中,+_被赋值给r


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

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

你忘记在 b 前面加上 + 了。 - Attila O.

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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接