Javascript Object.observe并不总是为数组提供正确的已删除索引

Javascript Object.observe并不总是为数组提供正确的已删除索引,javascript,object.observe,Javascript,Object.observe,我有一个列表,上面有一个观察者函数: var names = ['joe', 'bob', 'loic']; Object.observe(names, function(changes){ changes.forEach(function(change) { console.log(change.type, change.name) }); console.log("names",names); }); console.log("

我有一个列表,上面有一个观察者函数:

var names = ['joe', 'bob', 'loic'];

Object.observe(names, function(changes){
    changes.forEach(function(change) {        
      console.log(change.type, change.name)
    });
    console.log("names",names);
});   


console.log("######## del bob");
names.splice(1,1);// output is "update 1 - delete 2", why?
console.log("names", names) // but "bob" is the one deleted in the list
根据change对象删除的索引是2,但我删除了索引1,而列表实际上删除了索引1。你知道为什么吗

是因为索引1被更新以获得索引2的值,而索引2被删除了吗?
有没有办法获取实际删除的元素索引?

您可以使用数组在正确的索引处捕获拼接事件。注意:

var names = ['joe', 'bob', 'loic'];

Array.observe(names, function(changes){
    changes.forEach(function(change) {        
      console.log(change.type, change.name);
    });
});   

谢谢@xavier delamotte:)

删除元素并不意味着以下所有元素都下移。如果你确实删除了名字[1]你只会得到一条
delete
消息,而数组将包含
['joe',undefined'loic']
是的,这是因为。它将首先覆盖(更新)数组的元素,然后将其删除。谢谢,使用“删除”可以工作!:)(JS neewbie inside)也许你可以用Array.observe来代替?嗯,
delete
在数组中留下了一个洞,这通常是不需要的。