代码是自我描述的
[3, 1, 3].lastIndexOf(3)
2
[3, 1, 3].lastIndexOf(3, undefined)
0 // wtf?
//ok, lets compare with string
'313'.lastIndexOf(3)
2
'313'.lastIndexOf(3, undefined)
2 //wow!
答案 0 :(得分:3)
规范中的不同算法。
Array version对其第二个参数ToInteger()
执行0
,如果提供了一个,NaN
代替ToNumber()
。
- 如果传递了fromIndex参数,则让n为ToInteger(fromIndex);否则让n为len-1。
醇>
String version在其第二个参数上使用NaN
,无论是否提供了一个Infinity
,这将返回NaN
而无需替换,因此算法会手动替换Array
NaN
。
- 设numPos为ToNumber(位置)。 (如果未定义位置,则此步骤将生成值NaN)。
- ReturnIfAbrupt(numPos)。
- 如果numPos是NaN,则pos为+∞;否则,让pos为ToInteger(numPos)。
醇>
至于为什么,我们只能猜测,但0
版本是两个(ES5)中的较新版本,所以他们必须决定strcat
将是最好更换为strncat
,考虑到 falsey 评估(而不是它必然相关),这至少有点意义。。 p>