javascript - 传递 undefined 等同于不传递任何参数吗?

标签 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。

我理解 lastIndexOf 中的 index 参数的默认值指向数组的最后一个元素。 但是传递 undefined 不应该和不传递参数有相同的行为吗?

最佳答案

我之前写过一个comment解释说,根据 MDN 的 polyfill ,undefined 作为 Array.prototype.lastIndexOf 的第二个参数(在 polyfill 中名为 n 的参数)确实被转换为 0 通过这些步骤:

  1. n = Number(undefined) => 将 undefined 转换为 NaN
  2. 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:

  1. Let number be ToNumber(argument).
  2. ReturnIfAbrupt(number).
  3. 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/

相关文章:

javascript - 垂直构建页面的水平滚动行为

javascript - 在另一个范围内声明变量

javascript - 我是否正确处理此按钮单击事件?

c - x 和 y 的 atan2 输出为 0

javascript - 如果对象不存在,如何不破坏 JavaScript 代码?

javascript - 如何在 JavaScript 中重写私有(private)方法?

windows - CLI 参数中包含 "C:/Program Files"的路径被评估为两个参数

c++ - 函数参数究竟何时被破坏?

c - 函数的参数是指向声明为 const 的参数的指针,如何处理?

javascript - NodeJS 未定义的 JSON 对象