先说结论:是引用地址跟内容不一致导致的。
在JavaScript中,splice() 方法操作数组时,如果涉及到对象,需要特别注意。当你向数组中添加对象或者删除数组中的对象时,splice() 方法并不会复制对象,而是操作对象的引用。
这意味着,如果你通过 splice() 方法添加一个对象到数组中,数组中的元素实际上是对同一个对象的引用。同样地,如果你从数组中删除一个对象,你实际上是在删除对那个对象的引用,而不是对象本身。
来看一个例子:
let myObject = { name: 'Banma' };
let myArray = [];
// 添加对象到数组
myArray.splice(0, 0, myObject);
// 删除数组中的对象
let removedObject = myArray.splice(0, 1)[0];
console.log(removedObject === myObject); // 输出:true
在这个例子中,removedObject 和 myObject 是指向同一个内存地址的对象。即使我们从数组中删除了 myObject,removedObject 仍然引用着同一个对象。
然而,splice() 方法本身不会改变原始数组对象的引用地址。数组对象在内存中的引用地址在 splice() 操作前后是相同的。但是,数组的内容(即数组中的元素)会根据 splice() 操作而改变。
怎么办?
引用传递时使用新变量:
当你需要修改对象时,可以重新赋值给原变量,这样引用地址就不会改变。最终引用地址跟内容保持一致,双向绑定正常。
let myArray = [1, 2, 3];
myArray = myArray.splice(1, 1); // 删除元素后,更新 myArray 的引用