= + _在JavaScript中是什么意思


252

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

例:

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

57
让我想起了很好的旧进场算子-->
2013年

12
这里的+是一元运算符,以_作为其操作数。
Pieter Witvoet

44
看起来Perl程序员不能放弃默认变量;-)
Michael Wild

4
良好的语法突出显示将帮助您回答问题。
雨果·德·亨里格

18
您可以做个笑脸x= +_+ 0;
tckmn

Answers:


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

例:

+"1"

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

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

r现在1,不是"1"

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

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

还应注意

一元加号是将某物转换为数字的最快且首选的方式


2
+真的意味着要强制转换为数字,还是+_真的意味着0+_,在这种情况下_必须强制转换为0?
colincameron

3
@ c.cam108请参阅一元加运算符上的MDN页面
2013年

17
@ c.cam108-不,它们的行为不同。一元加号将值强制转换为数字,而二进制加号则不强制转换:(+'12' === 12结果为数字),但0 + '12' === '012'(结果为字符串)。但是请注意0 - '12' === -12
Kobi

1
@juzerali当然可以,但这不是好习惯。尝试使用加法;)
Izkata

看起来充满了perl的默认变量$ _
Matthew Lock

95

它不是赋值运算符。

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

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

请勿与+=运算符混淆


54

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

喜欢:

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

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

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

输出10

用途:因为其他原因,这里y为int 5=+

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

输出55

其中as _是变量。

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

输出10

另外, 很有趣的是,您也可以用~(如果string是int string (float将舍入为int的整数)) 实现相同的操作

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

也输出10

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


1
我经常x|0将double转换为int。但是,这以及使用'〜'都会限制数字<2 ^ 32。+“ 2e15”不。
Aki Suihkonen

@AkiSuihkonen是的,我相信x|0这会更快+。对好技术:)。(2)我~只是为了表明OP,+不仅可以使用符号(我本人+也可以使用)。
Grijesh Chauhan

很难说-尽管有一个jsperf可以衡量它。OTOH这两个运算符具有完全不同的含义。如果只需要一个数字(而不是整数),则“ +”短一个字符。
Aki Suihkonen

1
实际上,我只是对jsperf进行了测试-1800万个“ | 0”操作,1900万个“ +”操作;不同浏览器的性能可能会有所不同。jsperf.com/strtoint
Aki Suihkonen

1
@AkiSuihkonen哦,天哪,刚刚在Firefox中进行了jsperf测试,差别|很大。
Tapirboy

16

不是=+。在JavaScript中,+意味着将其更改为数字。

+'32' 返回32。

+'a' 返回NaN。

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


16

这是一个偷偷摸摸的。

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

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

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

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


1
+1,因为您是此处唯一明确指出_的变量。
TRiG

@TRiG Starx的答案又如何呢?
Mathletics


9

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


6

_只是一个变量名,作为function的参数传递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

回答得很晚,但是答案很好。
Grijesh Chauhan 2013年

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.

1
thanx 4帮助我写了一个答案。
阿曼德拉2013年

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

差异很小:


我想在第一行parseInr(_)而不是您要说parseFloat(_)
Grijesh Chauhan

1
不,我的意思是float因为parseInt将以非数字字符停止,所以parshFloat不会。经验值:parseFloat(2.4) = 2.4vs parseInt(2.4) = 2
布莱恩

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/


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

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


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是更好的可读性更好的选择。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.