Javascript数组按值传递不起作用

Javascript arrays pass by value not working

本文关键字:不起作用 按值传递 数组 Javascript      更新时间:2023-09-26

我有一个对象数组

var obj = {'name': 'John'};
var obj2 = {'name': 'Sam'};
var arr = [];
arr.push(obj);
arr.push(obj2);

现在我创建一个新的数组arr2作为

arr2 = arr.slice();

现在如果我改变arr2[0]['name'] = 'David';

arr1[0]['name']也变为'David';

arr2对象值发生变化时,如何防止arr对象值发生变化?

您必须克隆每个对象,而不仅仅是数组:

function cloneObject(obj) {
    var result = {};
    for (var k in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, k)) {
            result[k] = obj[k];
        }
    }
    return result;
}
var arr2 = arr.map(cloneObject);

是否有一种方法可以防止对象改变?

是的,有Object.freeze:

arr.forEach(Object.freeze);

当您复制数组时,您只是复制数组中的值,但这些值是对对象的引用。您最终得到两个独立的数组,但引用了相同的对象。

你需要做一个深度复制,即复制每一层的所有内容:

var arr2 = JSON.parse(JSON.stringify(arr));

现在你有了一个完全独立的数组副本和它的所有内容。