在JavaScript中,数组作为参数传递给函数时,实际上传递的是数组的引用,而不是数组的副本。这意味着如果在函数内部修改了数组的内容,这些修改会反映到原始数组上。
function modifyArray(arr) {
arr.push(4); // 修改数组
}
let myArray = [1, 2, 3];
console.log("Before:", myArray); // 输出: Before: [1, 2, 3]
modifyArray(myArray);
console.log("After:", myArray); // 输出: After: [1, 2, 3, 4]
如果你不希望函数修改原始数组,可以在函数内部创建数组的副本。
function modifyArrayWithoutChangingOriginal(arr) {
let newArr = arr.slice(); // 创建数组副本
newArr.push(4);
return newArr;
}
let myArray = [1, 2, 3];
console.log("Before:", myArray); // 输出: Before: [1, 2, 3]
let modifiedArray = modifyArrayWithoutChangingOriginal(myArray);
console.log("After:", myArray); // 输出: After: [1, 2, 3]
console.log("Modified Array:", modifiedArray); // 输出: Modified Array: [1, 2, 3, 4]
对于多维数组或对象数组,简单的slice()
方法可能无法完全复制数组,需要使用深拷贝方法。
function deepCopyArray(arr) {
return JSON.parse(JSON.stringify(arr));
}
let myArray = [[1, 2], [3, 4]];
let copiedArray = deepCopyArray(myArray);
copiedArray[0].push(5);
console.log("Original Array:", myArray); // 输出: Original Array: [[1, 2], [3, 4]]
console.log("Copied Array:", copiedArray); // 输出: Copied Array: [[1, 2, 5], [3, 4]]
通过这些方法和注意事项,你可以更好地控制数组在函数中的传递和修改行为。