25

我经常看到这个把戏

after = +after;

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

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

这两种方法的行为是否严格相同?

4

4 回答 4

35

是的。一元运算符+乘法运算符(例如*(从复合赋值 中调用))都op=调用内部ToNumber算法。

您甚至可以通过静态调用Number构造函数来使用第三个选项:

after = Number(after);
于 2013-04-07T17:30:33.033 回答
5

在快速谷歌以确保我的怀疑是真的之后,我得出了这个结论。使用+运算符转换为数字更快,因为在类型转换之后不会发生数学运算,而使用该*=方法意味着在after转换之后,它将乘以1

于 2013-04-07T17:25:45.733 回答
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 使用字符串连接。因为 - 运算符没有等效的字符串,所以它回退到数字比较。

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

于 2014-12-23T08:52:21.230 回答
1

是的,但是请注意,只有一元+ 运算符可以执行此操作。即10 + "10"会给你"1010"

一个可能不太容易出错的选项是使用 asm.js 所做的:

10 + ("10"|0)

尽管不利的是,它确实需要括号。在任何情况下它都应该是最快的选择(可能等于一元+)。

于 2015-06-10T09:30:34.200 回答