我发现
的处理有所不同[1,2,3].slice(1, undefined)
chrome(返回[2,3]
)和firefox(返回[]
)之间的。
当然,两者都同意[2, 3]
作为
[1,2,3].slice(1)
他们也同意[]
作为
[1,2,3].slice(1, null)
这两个中的哪一个是正确的?或者可能是标准中没有明确规定?
答案 0 :(得分:8)
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]
。
slice方法接受两个参数,start和end,并返回将此对象转换为String的结果的子字符串,从字符位置开始并运行到(但不包括)字符位置结束(或通过字符串的结尾如果结束未定义)...
快乐的编码。