我在复制数组时在代码中发现了一个漏洞。我做了array.splice(0)
,而不是使用slice
。但奇怪的是它仍然有效。此用法不符合Array.prototype.splice spec on MDN,其中指出deleteCount
(第二个参数)是必需的并且它返回
"包含已删除元素的数组。如果仅删除一个元素,则返回一个元素的数组。如果未删除任何元素,则返回空数组。 "
我在Chrome中运行了一些测试,这就是我得到的
var array = [0, 1, 2, 3];
var spliced = array.splice(0); // [0, 1, 2, 3]
但是当我做的时候
var array = [0, 1, 2, 3];
var spliced = array.splice(0, 0); // [] as per the spec
这是一个有趣的Chrome功能还是规格已过期?
答案 0 :(得分:4)
根据ECMAScript 5,可以认为arr.splice(0)
和arr.splice(0, 0)
应返回相同的结果,因为在步骤7中,ToInteger(undefined)
为0
。
- 让 actualDeleteCount 为
醇>min(max(ToInteger(deleteCount),0), len – actualStart
)。
但是,用单个参数调用.splice
是否有效甚至不清楚。
ECMAScript 6有一个特殊情况用于单个参数(一个用于无参数):
- 如果实际参数的数量为0,则为
设 insertCount 为0 设 actualDeleteCount 为0。- 否则,如果实际参数的数量为1,则为
醇>
设 insertCount 为0 让 actualDeleteCount 为 len - actualStart
len
是数组的长度,actualStart
是从第一个参数派生的。因此arr.splice(0)
等同于arr.splice(0, arr. length)
,这意味着Chrome似乎符合新规范(有意或无意)。
另一方面,arr.splice()
相当于arr.splice(0, 0)
,Chrome会按预期返回一个空数组。