我经常看到这个把戏
after = +after;
将变量强制after
为一个数字。通过阅读Node.JS 源代码,我发现了另一种方法:
after *= 1; // coalesce to number or NaN
这两种方法的行为是否严格相同?
我经常看到这个把戏
after = +after;
将变量强制after
为一个数字。通过阅读Node.JS 源代码,我发现了另一种方法:
after *= 1; // coalesce to number or NaN
这两种方法的行为是否严格相同?
是的。一元运算符+
和乘法运算符(例如*
(从复合赋值 中调用))都op=
调用内部ToNumber
算法。
您甚至可以通过静态调用Number
构造函数来使用第三个选项:
after = Number(after);
在快速谷歌以确保我的怀疑是真的之后,我得出了这个结论。使用+
运算符转换为数字更快,因为在类型转换之后不会发生数学运算,而使用该*=
方法意味着在after
转换之后,它将乘以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 使用字符串连接。因为 - 运算符没有等效的字符串,所以它回退到数字比较。
在将日期强制转换为数字进行比较时,我发现这很有用
是的,但是请注意,只有一元+ 运算符可以执行此操作。即10 + "10"
会给你"1010"
。
一个可能不太容易出错的选项是使用 asm.js 所做的:
10 + ("10"|0)
尽管不利的是,它确实需要括号。在任何情况下它都应该是最快的选择(可能等于一元+)。