什么应该是[1,2,3] .slice(1,undefined)的值?

650*_*502 4 javascript firefox google-chrome

我发现处理方式有所不同

[1,2,3].slice(1, undefined)
Run Code Online (Sandbox Code Playgroud)

chrome(返回[2,3])和firefox(返回[])之间.

当然,两者都同意[2, 3]作为的价值

[1,2,3].slice(1)
Run Code Online (Sandbox Code Playgroud)

他们也同意[]作为的价值

[1,2,3].slice(1, null)
Run Code Online (Sandbox Code Playgroud)

哪两个是正确的?或者可能是标准中没有明确规定?

Fel*_*ing 8

规范说:

7.如果未定义的,让relativeEndlen个 ; 否则让relativeEnd成为ToInteger(结束).

您使用的是哪个Firefox版本?Firefox 5正确地给了我[2, 3].更新: Firefox 3.6确实返回一个空数组.

我不知道这里有什么问题,因为如果你打电话slice()没有第二个参数,end也会undefined.

更新:

逛了一下打后,似乎是返回一个空数组,如果传递给第二个参数.slice()NaN.示例(+undefined返回NaN):

> [1,2,3].slice(1, +undefined)
> []
Run Code Online (Sandbox Code Playgroud)

这在Firefox和Chrome中都是一样的.

不幸的是,这也不符合规范,因为ToInteger(NaN) [spec]应该返回0,所以实际上应该将数组切片到最后.

我并不是说这就是为什么它在某些Firefox版本中无法正常工作的原因,我不知道实现.

轻微迷失方向的事件......没关系.


Jua*_*uan 5

我不确定这是否在标准上定义,但我可以告诉你这是一个棘手的调用.就像菲利克斯所说,这不是标准行为,但我可以想到为什么会这样.

您可能知道的undefined是设置为调用函数时未提供的参数的值.但是,在您的示例中,您实际上是在传递undefined,因此传递的参数实际上是两个并反映在其中arguments.length.

因此,从您所说的内容中可以很容易地想到,在Chrome中,第二个参数正在进行检查,typeof param2 == "undefined"并在Firefox中使用arguments.length > 1.因此,并非(完全)认为Firefox错误,就像Felix建议的那样,他们只是假设undefined永远不会直接作为第二个参数传递.

你可能会遇到这样的情况undefined,我建议你不要使用它!