2
var cache = [];
cache[0] = "0";
cache[1] = "1";
cache[2] = "2";
cache[3] = "3";
cache[4] = "4";
cache["r"] = "r";
console.log(cache.length);
for(key in cache){
    if(isNaN(key))continue;
    else cache.splice(key,1); // cache.splice(key) is working fine, ***
}
console.log(cache);

问题:***为什么 splice(key) 工作正常(删除所有具有数字索引的元素)和 splice(key,1) 不能正常工作(不删除具有数字索引的元素)。即使我尝试过

splice(key,1) // Not working as splice(key)
splice(key--,1) // Even not working as splice(key)
splice(key,0) // not deleting any thing

您可以在 Firebug 控制台中复制和粘贴代码进行测试。

4

3 回答 3

11

它不起作用,因为您在遍历键时从数组中删除项目。当您删除一个项目时,它将根据数组在内部的实现方式重新排列其他项目,并且您最终会得到一个不会迭代您期望的键的循环。

当我在 Firefox 中尝试它时,它只会遍历键01和. 在迭代时删除项目使其跳过和. 本身工作正常,但它会影响循环,因此某些项目根本不在迭代中。2r34splice

由于您实际上是通过跳过非数字键来查找数组中的索引,因此您可以直接遍历索引。通过向后循环它们,您不会在循环时遇到数组更改的问题:

var cache = ["0", "1", "2", "3", "4"];
cache.r = "r";
console.log(cache.length);
for (var i = cache.length - 1; i >= 0; i--) {
    cache.splice(i, 1);
}
console.log(cache);

演示:http: //jsfiddle.net/CguTp/1/

于 2013-07-02T18:10:34.683 回答
3

1)cache["r"] = "r";不向数组添加元素,而是向缓存对象添加属性

要初始化一个数组,你可以使用类似的东西

var cache = ["0", "1", "2", "3", "4", "r"];

或者

var cache = new Array();
cache.push("0");
cache.push("1");
cache.push("2");
cache.push("3");
cache.push("4");
cache.push("r");

由于您的缓存对象不是数组,因此您不能期望 splice 的行为与数组一样。

2) splice 期望索引作为第一个参数,而不是键

http://www.w3schools.com/jsref/jsref_splice.asp

因此,您可以使用它来删除所有数值:

for (var i = 0; i < cache.length; i++) {
        if (!isNaN(cache[i])) {
            cache.splice(i, 1); // cache.splice(key) is working fine, ***
                i--;
            }
        }
于 2013-07-02T15:52:22.790 回答
2

Splice 期望第一个索引为数字,

splice(n,x); //n and x are numeric here  

它将开始从索引 n 开始从数组中删除值,并在索引 n 之后删除 x 值。

现在if n is not numeric but a key不需要 x 因为 x 可以在numeric-indexed array唯一非关联数组中向前移动指针。因此,从 splice(n,x) 中删除 x 将使函数类似于 splice(key) 等,因此它会正常工作。

于 2013-07-21T07:01:22.287 回答