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

我想知道= + _操作符在JavaScript中是什么意思。它看起来像是在给变量赋值。

例子:

hexbin.radius = function(_) {
if (!arguments.length)
return r;
r = +_;
dx = r * 2 * Math.sin(Math.PI / 3);
dy = r * 1.5;
return hexbin;
};
30079 次浏览
r = +_;
  • +尝试将_转换为一个数字。
  • _只是一个变量名(不是一个操作符),它可以是afoo等。

例子:

+"1"

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

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

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

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

一元加号运算符位于其操作数之前,求值为its 操作数but 尝试将其转换为数字(如果不是) < / >强。[…]它可以转换整数和的字符串表示形式 浮点数,以及非字符串值truefalsenull。 十进制和十六进制(__abc0前缀)格式的整数都是 支持。支持负数(但不支持十六进制)。如果它 不能解析一个特定的值,它将计算为NaN

还注意到

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

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

+'32'返回32。

+'a'返回NaN。

所以你可以使用isNaN()来检查它是否可以改变为number。

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

如:

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

我的以下代码将帮助你展示使用=+字符串转换为int 例子:< / p >

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

输出10

所以这里y是int 5,因为=+
否则:< / >强

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

输出55

其中_是一个变量。

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

输出10

< >强另外, 有趣的是,你也可以用~(如果字符串是int字符串(浮点数为整轮))

实现同样的事情
y = ~~'5'  // notice used two time ~
x = y  + 5
alert(x);

还输出10

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

它不是赋值操作符。

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

    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

DO NOT CONFUSE IT WITH += operator

它将给左边变量一个数字赋新值。

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

我想你的意思是r = +_;?在这种情况下,它将参数转换为Number。假设_是'12.3',那么+'12.3'返回12.3。因此在引用语句中+_被赋值给r

= +_将_转换为一个数字。

所以

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

将输出数字。

这是一个鬼鬼祟祟的问题。

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

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

等号只是一个标准的变量赋值。

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

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

让我举一个和你的函数一样的例子。

var hexbin = {},r  ;


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

并运行这个示例函数..的输出

hexbin。半径(" 1 ");

1 string
1 number false

hexbin。半径(1);

1 number
1 number false

hexbin。半径([]);

[] object
0 number false

hexbin。半径('a');

a string
NaN number true

hexbin。半径({});

Object {} object
NaN number true

hexbin。半径(真);

true boolean
1 number false

在这个表达式中:

r = +_;
  • '+'在这里作为一元操作符,尝试< em > < / em >转换右操作数的值。它不转换操作数,而是转换被求值。因此,如果_最初是“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是可读性更好的替代品。

+_几乎是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

差别很小:

简单地说,+_ < em > < / em >是一样使用数量()构造函数。

事实上,它甚至适用于约会:

var d = new Date('03/27/2014');
console.log(Number(d)) // returns 1395903600000
console.log(+d) // returns 1395903600000
< p >演示: http://jsfiddle.net/dirtyd77/GCLjd/ < / p >

更多信息也可以找到MDN -一元加(+)节:

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