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

时间:2015-01-27 16:35:03

标签: javascript google-chrome

我在复制数组时在代码中发现了一个漏洞。我做了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功能还是规格已过期?

1 个答案:

答案 0 :(得分:4)

根据ECMAScript 5,可以认为arr.splice(0)arr.splice(0, 0)应返回相同的结果,因为在步骤7中,ToInteger(undefined)0

  
      
  1. actualDeleteCount min(max(ToInteger(deleteCount),0), lenactualStart)。
  2.   

但是,用单个参数调用.splice是否有效甚至不清楚。

ECMAScript 6有一个特殊情况用于单个参数(一个用于无参数):

  
      
  1. 如果实际参数的数量为0,则为
      设 insertCount 为0   设 actualDeleteCount 为0。
  2.   
  3. 否则,如果实际参数的数量为1,则为
      设 insertCount 为0   让 actualDeleteCount len - actualStart
  4.   

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

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