奇怪的是,
['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。
我了解index
中lastIndexOf
参数的默认值指向数组的最后一个元素。
但是传递undefined
的行为不应该与不传递参数的行为相同吗?
答案 0 :(得分:2)
我以前写过comment来解释,根据MDN处的polyfill,undefined
是Array.prototype.lastIndexOf
的第二个参数(在polyfill中,名为{ {1}})实际上已通过以下步骤转换为n
:
0
=>将n = Number(undefined)
转换为undefined
。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
:
- 让数字为ToNumber(参数)。
- ReturnIfAbrupt(number)。
- 如果数字为NaN,则返回+0。
最后,您的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