vue3中用splice()操作数组对象失去双向绑定的原因

167 阅读1分钟

先说结论:是引用地址跟内容不一致导致的。

在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

在这个例子中,removedObjectmyObject 是指向同一个内存地址的对象。即使我们从数组中删除了 myObjectremovedObject 仍然引用着同一个对象。

然而,splice() 方法本身不会改变原始数组对象的引用地址。数组对象在内存中的引用地址在 splice() 操作前后是相同的。但是,数组的内容(即数组中的元素)会根据 splice() 操作而改变。

怎么办?

引用传递时使用新变量:

当你需要修改对象时,可以重新赋值给原变量,这样引用地址就不会改变。最终引用地址跟内容保持一致,双向绑定正常。

let myArray = [1, 2, 3];
myArray = myArray.splice(1, 1); // 删除元素后,更新 myArray 的引用