Array / String lastIndexOf结果不一致

时间:2016-06-11 12:35:19

标签: javascript arrays string

代码是自我描述的

[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!

1 个答案:

答案 0 :(得分:3)

规范中的不同算法。

Array version对其第二个参数ToInteger()执行0,如果提供了一个,NaN代替ToNumber()

  
      
  1. 如果传递了fromIndex参数,则让n为ToInteger(fromIndex);否则让n为len-1。
  2.   

String version在其第二个参数上使用NaN,无论是否提供了一个Infinity,这将返回NaN而无需替换,因此算法会手动替换Array NaN

  
      
  1. 设numPos为ToNumber(位置)。 (如果未定义位置,则此步骤将生成值NaN)。
  2.   
  3. ReturnIfAbrupt(numPos)。
  4.   
  5. 如果numPos是NaN,则pos为+∞;否则,让pos为ToInteger(numPos)。
  6.   

至于为什么,我们只能猜测,但0版本是两个(ES5)中的较新版本,所以他们必须决定strcat将是最好更换为strncat,考虑到 falsey 评估(而不是它必然相关),这至少有点意义。。 p>