2013-04-07 37 views
14

我经常看到的伎俩强制进行编号

after = +after; 

给变量after强制为数字。通过Node.JS source阅读中,我发现了另一个方法:

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

是两种方法,他们的行为完全等同?

回答

5

经过快速google to make sure my suspicions were true,我得出这个结论。使用+运算符转换为数字会更快,因为在进行类型转换后不会发生数学运算,而使用*=方法意味着转换后after将乘以1

+0

所以没有行为差异,只是速度和语法? – Randomblue 2013-04-07 17:27:29

+0

我不是专家,但与给定的语法有关的问题,我想我已经回答了。如果铸造与运营商有所不同,我不知道。这将需要一个极具权力的远超我的力量! – christopher 2013-04-07 17:28:17

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进行字符串连接。因为 - 运算符没有字符串等价物,所以它会回到数字比较。

强迫日期时,成号码比较

0

是我发现这个有用的,但是请注意,这仅仅是一元 +运营商做这个。即10 + "10"会给你"1010"

一个或许不容易出错的选择是使用什么asm.js做:

10 + ("10"|0) 

虽然在不利的方面它需要支架。无论如何,它应该是最快的选择(可能等于一元+)。

+3

这会将数字转换为整数,而不仅仅是一个数字(即:'(“10.7”| 0) === 10')。如果您只想将字符串转换为数字,请使用一元加号('+“10.7”=== 10.7') – Jack 2015-07-24 05:57:49