这是我的代码:
var x = [{letter: "a"}, {letter: "b"}, {letter: "c"}]
x.push({
timer: setTimeout(function() {x.splice(x.length - 1, 1)}, 3000),
letter: "j",
})
x.push({letter: "k"})
setTimeout(function() {alert(x)}, 4000)
我的主要问题是:为什么代码会警告“a,b,c,[A number]”何时应警告“a,b,c,k”,为什么会删除错误的索引?
答案 0 :(得分:1)
x.splice(x.length, 1)
从x.length
开始删除一个元素,该元素超出数组的范围;使用x.splice(x.length - 1, 1)
或x.pop()
。
如果想要让对象从数组中删除自己,请在添加之前存储长度并使用它:
var removeIndex = x.length;
x.push({
timer: setTimeout(function() { x.splice(removeIndex, 1); }, 3000),
letter: "j",
});
答案 1 :(得分:0)
x.push(setTimeout(function() {x.splice(x.length - 1, 1)}, 3000))
这实际上会将timeoutID推送到数组上。接下来是额外的推送x.push('k')
,因此当超时结算时,k
元素实际上会被删除。
x.length
将在超时功能内部发生变化。如果要使用要添加的元素的索引,请将x.length
存储为更高范围内的变量。