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

时间:2011-08-06 17:04:30

标签: javascript firefox google-chrome

我发现

的处理有所不同
[1,2,3].slice(1, undefined)
chrome(返回[2,3])和firefox(返回[])之间的

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

的价值
[1,2,3].slice(1)

他们也同意[]作为

的价值
[1,2,3].slice(1, null)

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

3 个答案:

答案 0 :(得分:8)

The specification says:

  

7。如果 end 未定义,请将 relativeEnd 设为 len ;否则让 relativeEnd 成为ToInteger( end )。

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

我不知道这里有什么问题,因为如果您在没有第二个参数的情况下致电slice()end也会undefined

更新

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

> [1,2,3].slice(1, +undefined)
> []

在Firefox和Chrome中也是如此。

不幸的是,这也不符合规范,因为ToInteger(NaN) [spec]应该返回0,所以实际上应该将数组切成末尾。

我没有声称这就是为什么它在某些Firefox版本中无法正常工作的原因,我不知道实现。

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

答案 1 :(得分:5)

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

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

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

您可能会使用undefined这样的情况遇到其中几种情况,我建议您不要使用它!

答案 2 :(得分:3)

在帖子中测试的Firefox的版本在这里是错误的。 但是,Firefox 5按规范运行[1,2,3].slice(1, undefined)评估为[2,3]

来自ECMAScript ed5 standard

  
    

slice方法接受两个参数,start和end,并返回将此对象转换为String的结果的子字符串,从字符位置开始并运行到(但不包括)字符位置结束(或通过字符串的结尾如果结束未定义)...

  

快乐的编码。