为什么splice方法不能填补javascript数组中的空洞?

4
假设您运行了以下代码:
var a = [];
a[4] = true;

那么你的数组将会变成 [undefined, undefined, undefined, undefined, true]

但如果你运行以下代码:

var a = [];
a.splice(4, 0, true);

使用splice时,如果索引超过了数组的当前长度,它只会停留在最后一个元素,而不是返回[undefined, undefined, undefined, undefined, true]。

为什么这是splice的预期行为?


1
你正在使用的JavaScript引擎/浏览器是什么? - andre.barata
3
@bfuoco:[4:true]看起来不像是一个数组。 - Felix Kling
1
@bfuoco 试试这个代码:var a = []; a.splice(4, 0, true); console.log(a); - Ale Morales
在OSX上使用最新版本的Chrome,我得到了[undefined × 4, true]的结果。http://screencast.com/t/pTLjUYc6 - sissonb
1
然后你的数组看起来会像[undefined, undefined, undefined, undefined, true] - 不完全正确。a[4]=true在索引4处添加了一个元素并将.length设置为5,但它不会在先前的索引位置添加undefined元素。如果您执行console.log(a),它可能看起来是这样,而且a[0]===undefined将是true,但这是因为访问不存在的属性返回undefined,而不是因为属性存在并已设置为值undefined。您可以看到元素03实际上不存在,因为(0 in a)是false - nnnnnn
显示剩余5条评论
1个回答

2
根据 ECMA 文档,'start' 参数不能大于数组的长度或被设置为数组的长度。
5 - 将开始位置转换为整数 ToInteger(start)。
6 - 如果 relativeStart 为负数,则实际开始位置 actualStart 为 max((len + relativeStart),0);否则,实际开始位置 actualStart 为 min(relativeStart, len)。

http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.12

关于为什么:我不确定,也许他们认为如果该方法向数组添加项目会逆反常理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接