我经常看到的伎俩强制进行编号
after = +after;
给变量after
强制为数字。通过Node.JS source阅读中,我发现了另一个方法:
after *= 1; // coalesce to number or NaN
是两种方法,他们的行为完全等同?
我经常看到的伎俩强制进行编号
after = +after;
给变量after
强制为数字。通过Node.JS source阅读中,我发现了另一个方法:
after *= 1; // coalesce to number or NaN
是两种方法,他们的行为完全等同?
是的。 Unary Operator +
和Multiplicative Operators(如*
(从Compound Assignmentop=
调用)都调用内部ToNumber
算法。
您甚至可以通过静态调用Number
constructor使用第三个选项:
after = Number(after);
经过快速google to make sure my suspicions were true,我得出这个结论。使用+
运算符转换为数字会更快,因为在进行类型转换后不会发生数学运算,而使用*=
方法意味着转换后after
将乘以1
。
所以没有行为差异,只是速度和语法? – Randomblue 2013-04-07 17:27:29
我不是专家,但与给定的语法有关的问题,我想我已经回答了。如果铸造与运营商有所不同,我不知道。这将需要一个极具权力的远超我的力量! – christopher 2013-04-07 17:28:17
注:在某些情况下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)
虽然在不利的方面它需要支架。无论如何,它应该是最快的选择(可能等于一元+)。
这会将数字转换为整数,而不仅仅是一个数字(即:'(“10.7”| 0) === 10')。如果您只想将字符串转换为数字,请使用一元加号('+“10.7”=== 10.7') – Jack 2015-07-24 05:57:49
第三个选项是目前最慢的,但是:http://jsperf.com/testing-number-coercion – Boldewyn 2014-12-23 09:02:14