我经常看到这个伎俩
after = +after;
将变量after
强制转换为数字。通过Node.JS source阅读,我发现了另一种方法:
after *= 1; // coalesce to number or NaN
两种方法的行为是否完全相同?
答案 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)
虽然在下方但确实需要括号。在任何情况下它应该是最快的选择(可能等于一元+)。