传递未定义等同于不传递参数吗?

时间:2019-02-11 11:02:10

标签: javascript arguments undefined

奇怪的是,

['a', 'b', 'c'].lastIndexOf('b', undefined)

在以下情况下返回-1:

['a', b', 'c'].lastIndexOf('b')

返回1(至少在Firefox 65的暂存器上)。

我假设传递undefined的结果与不传递参数的结果相同。

但是看来

['a', 'b', 'c'].lastIndexOf('a', undefined)

返回预期的0,这使我相信我的undefined已转换为0。

我了解indexlastIndexOf参数的默认值指向数组的最后一个元素。 但是传递undefined的行为不应该与不传递参数的行为相同吗?

1 个答案:

答案 0 :(得分:2)

我以前写过comment来解释,根据MDN处的polyfill,undefinedArray.prototype.lastIndexOf的第二个参数(在polyfill中,名为{ {1}})实际上已通过以下步骤转换为n

  1. 0 =>将n = Number(undefined)转换为undefined
  2. NaN =>检查if(n != n) n = 0并将其转换为0。

NaN

由于这只是MDN的polyfill,所以在我看来这不值得一个正确的答案。但是,ECMA-International的规范对let n = Number(undefined); if (n != n) n = 0; console.log(n);表示相同:

  

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

Array.prototype.lastIndexOf(searchElement[,fromIndex])显然是数组的最后一个索引。然后,我们在len-1

  
      
  1. 让数字为ToNumber(参数)。
  2.   
  3. ReturnIfAbrupt(number)。
  4.   
  5. 如果数字为NaN,则返回+0。
  6.   

最后,您的ToInteger被转换为undefined,因此,将0作为undefined的第二个参数传递与不传递任何内容不同。

编辑

鉴于您的last comment,我认为您误会的原因很​​明显。您会看到,这里没有默认参数,整个问题都与此无关。让我解释一下:

如您所知,在JavaScript中,我们可以传递比参数更多的参数或传递比参数更少的参数。如果我们传递的参数太少,则缺少的参数为Array.prototype.lastIndexOf。这很容易显示:

undefined

如您所见,不传递任何内容或传递function foo(parameter1, parameter2) { console.log("parameter 2 is " + parameter2) }; foo("bar"); foo("bar", undefined);都具有相同的效果。但是,这不是不是。在polyfill中,函数使用伪数组undefined之类的伪参数来获取第二个参数,以测试arguments。因此,当您say ...

  

未定义的计数是否作为传递的参数?我以为没有。

当您考虑arguments.length > 1类数组对象的长度时,它会执行此操作。而且,在这种情况下,差异确实很重要:

arguments