强迫数字

时间:2013-04-07 17:19:42

标签: javascript

我经常看到这个伎俩

after = +after;

将变量after强制转换为数字。通过Node.JS source阅读,我发现了另一种方法:

after *= 1; // coalesce to number or NaN

两种方法的行为是否完全相同?

4 个答案:

答案 0 :(得分:25)

是。 *Unary Operator +op=(从Multiplicative Operators after = Number(after); 调用)都会调用内部Compound Assignment算法。

您甚至可以通过静态调用ToNumber

来使用第三个选项
{{1}}

答案 1 :(得分:5)

快速google to make sure my suspicions were true后,我得出了这个结论。使用+运算符转换为数字更快,因为在类型转换后没有发生数学运算,而使用*=方法意味着在after转换后,它将成倍增加1

答案 2 :(得分:1)

注意:在某些情况下,after = after-0会调用与after = after+0不同的行为。我注意到了日期。

仅在Chrome v39中进行测试:

var date = new Date(2000,0,1);
date += date; //"Sat Jan 01 2000 00:00:00 GMT+0000 (GMT Standard Time)Sat Jan 01 2000 00:00:00 GMT+0000 (GMT Standard Time)"
var date2 = new Date(2000,0,1);
date2 + 0; //"Sat Jan 01 2000 00:00:00 GMT+0000 (GMT Standard Time)0"
date2 - 0; //946684800000
date2 * 1; //946684800000

我不知道JS规范中定义了什么,但是使用日期,因为日期和数字都可以转换为字符串,而+运算符适用于字符串,然后Chrome使用字符串连接。因为 - 运算符没有等效的字符串,所以它会回退到数字比较。

在将日期强制转换为数字进行比较时,我发现这很有用

答案 3 :(得分:0)

是的,但请注意,只有一元 +运算符执行此操作。即10 + "10"将为您提供"1010"

可能不太容易出错的选项是使用asm.js的作用:

10 + ("10"|0)

虽然在下方但确实需要括号。在任何情况下它应该是最快的选择(可能等于一元+)。