Chrome 中的 Array.prototype.splice - 不符合规范

Array.prototype.splice in Chrome - not conforming to spec?

本文关键字:不符合 splice 中的 Array prototype Chrome      更新时间:2023-09-26

我刚刚在复制数组时发现代码中有一个错误。我做了array.splice(0),而不是使用slice。但奇怪的是,它仍然有效。这种用法不符合 MDN 上的 Array.prototype.splice 规范,该规范声明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功能还是规范已经过时了?

根据 ECMAScript 5,人们可能会争辩说arr.splice(0)arr.splice(0, 0)应该返回相同的结果,因为在步骤 7 中,ToInteger(undefined)0

  1. 实际删除计数min(max(ToInteger(deleteCount),0), lenactualStart)。

但是,目前尚不清楚使用单个参数调用.splice是否有效。

ECMAScript 6 有一个单参数的特殊情况(还有一个没有参数):

  1. 如果实际参数的数量为 0,则
    插入计数为 0。
    实际删除计数为 0。
  2. 否则,如果实际参数的数量为 1,则
    插入计数为 0。
    actualDeleteCount be len - actualStart

len是数组的长度,actualStart是从第一个参数派生的。所以arr.splice(0)变得等同于arr.splice(0, arr. length),这意味着Chrome似乎符合新规范(有意或无意)。

另一方面,arr.splice()等效于arr.splice(0, 0),Chrome 会按预期返回一个空数组。