在JavaScript中,数组赋值有多种方式,包括浅拷贝和深拷贝。以下是一些常见的数组赋值方法及其特点:
let arr1 = [1, 2, 3];
let arr2 = arr1;
特点:
arr2
和 arr1
指向同一个数组对象。arr2
也会影响 arr1
。slice()
方法let arr1 = [1, 2, 3];
let arr2 = arr1.slice();
...
let arr1 = [1, 2, 3];
let arr2 = [...arr1];
特点:
arr2
是 arr1
的浅拷贝。arr2
不会影响 arr1
。JSON.parse(JSON.stringify(arr))
let arr1 = [{a: 1}, {b: 2}];
let arr2 = JSON.parse(JSON.stringify(arr1));
特点:
arr2
是 arr1
的深拷贝。arr2
不会影响 arr1
,即使是对象元素。function deepCopy(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
let copy = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = deepCopy(obj[key]);
}
}
return copy;
}
let arr1 = [{a: 1}, {b: 2}];
let arr2 = deepCopy(arr1);
特点:
arr2
后 arr1
也发生了变化。原因:使用了直接赋值或浅拷贝,导致两个变量指向同一个数组对象。 解决方法:使用深拷贝方法创建数组副本。
undefined
、Infinity
等特殊值。原因:JSON.stringify
会忽略这些值。
解决方法:使用递归函数进行深拷贝,或者根据需求选择合适的拷贝方法。
通过以上方法,可以根据具体需求选择合适的数组赋值方式,避免不必要的副作用。