奇怪的是,
['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。
我理解 lastIndexOf
中的 index
参数的默认值指向数组的最后一个元素。
但是传递 undefined
不应该和不传递参数有相同的行为吗?
最佳答案
我之前写过一个comment解释说,根据 MDN 的 polyfill ,undefined
作为 Array.prototype.lastIndexOf
的第二个参数(在 polyfill 中名为 n
的参数)确实被转换为 0
通过这些步骤:
n = Number(undefined)
=> 将undefined
转换为NaN
。if(n != n) n = 0
=> 检查NaN
并将其转换为 0。
let n = Number(undefined);
if (n != n) n = 0;
console.log(n);
因为这只是 MDN 上的 polyfill,所以在我看来它不值得一个正确的答案。然而,规范在 ECMA-International关于 Array.prototype.lastIndexOf(searchElement[,fromIndex])
也是这样说的:
If argument fromIndex was passed let n be ToInteger(fromIndex); else let n be len-1.
其中 len-1
显然是数组的最后一个索引。然后,我们在 ToInteger
:
- Let number be ToNumber(argument).
- ReturnIfAbrupt(number).
- If number is NaN, return +0.
总之,您的 undefined
被转换为 0
,因此,传递 undefined
作为 Array.prototype 的第二个参数.lastIndexOf
与不传递任何内容不同。
编辑
鉴于您的 last comment我想你误会的原因很清楚了。你看,这里没有默认参数,整个问题与它无关。让我解释一下:
如您所知,在 JavaScript 中我们可以传递比参数更多的参数或比参数更少的参数。如果我们传递的参数太少,则缺少的参数是 undefined
。这很容易证明:
function foo(parameter1, parameter2) {
console.log("parameter 2 is " + parameter2)
};
foo("bar");
foo("bar", undefined);
如您所见,不传递任何内容或传递 undefined
具有相同的效果。然而,这不是这里发生的事情。在 polyfill 中,函数使用类似伪参数数组的 arguments
来获取第二个参数,测试 arguments.length > 1
。因此,当你 say ...
Does undefined count as a passed argument? I thought it didn't.
当您考虑arguments
类数组对象的长度时,它会起作用。而且,在那种情况下,差异确实很重要:
function foo(parameter1, parameter2) {
if (arguments.length > 1) {
console.log("parameter 2 is " + arguments[1])
} else {
console.log("no second parameter")
}
};
foo("bar");
foo("bar", undefined);
关于javascript - 传递 undefined 等同于不传递任何参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54629104/