我想知道JavaScript中的 = + _ 运算符是什么意思。它看起来像是分配。
示例:
hexbin.radius = function(_) {
if (!arguments.length)
return r;
r = +_;
dx = r * 2 * Math.sin(Math.PI / 3);
dy = r * 1.5;
return hexbin;
};
答案 0 :(得分:389)
r = +_;
+
尝试将任何_
投射到一个数字。_
只是变量名称(不是运算符),可以是a
,foo
等。示例:强>
+"1"
将“1”投射到纯数字1。
var _ = "1";
var r = +_;
r
现在是1
,而不是"1"
。
此外,根据MDN page on Arithmetic Operators:
一元加号运算符在其操作数之前,并计算其值 操作数,但尝试将其转换为数字,如果不是 已经即可。 [...] 它可以转换整数和字符串的表示形式 浮点数,以及非字符串值
true
,false
和null
。 十进制和十六进制("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
很少有差异:
""
的计算结果为0
,而parseInt()计算结果为NaN
答案 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
是更好的可读替代方案。