JavaScript中两种对象拷贝方式是否可行?——返回新对象与写入已有引用对象/地址的实现探究
好问题!咱们直接拆解来看:
两种拷贝方式的可行性分析
返回新对象的拷贝方式(
copy_array)
这种方式是完全可行的,也是JavaScript里非常常见的浅拷贝实现思路。你的copy_array函数逻辑没问题,调用后会返回一个和原数组内容相同的新数组,原数组和新数组是互相独立的(当然,这只是浅拷贝,如果数组里嵌套了对象/数组,拷贝的是引用而非深拷贝)。向已有对象写入数据的拷贝方式(你的
copy_to)
你的当前实现有问题,但这种方式本身在JS里是可行的——只是不能像C语言那样直接操作内存地址或指针,得换个正确的写法。
原copy_to函数的问题
你在函数里第一行写了to_arr = [],这相当于在函数内部创建了一个全新的局部数组变量,和外面传入的x彻底断开了联系。因为JavaScript的函数参数是按值传递的:对于引用类型(比如数组),传递的是引用的副本,你没法在函数内部修改外部变量本身的指向,但你可以修改这个引用指向的对象的内部内容。
修正后的copy_to实现
我们不需要重新赋值to_arr,而是清空已有数组的内容,再把源数组的元素逐个写入进去:
function copy_to(arr, to_arr) { // 先清空目标数组的现有内容 to_arr.length = 0; // 逐个拷贝元素到目标数组 for(let i = 0; i < arr.length; i++) { to_arr.push(arr[i]); // 或者用 to_arr[i] = arr[i]; 效果一样 } }
测试一下这个函数:
const c = ['a','b','c']; const x = ['原有元素1', '原有元素2']; copy_to(c, x); console.log(x); // 输出: ['a', 'b', 'c'],成功修改了已有数组x的内容
核心原理总结
在JavaScript里:
- 你不能直接像C那样通过指针修改变量的指向,但可以修改引用类型对象的内部状态(比如数组的元素、对象的属性)。
- 如果要实现“写入已有对象”的拷贝,核心是操作已有对象的内部内容,而不是给参数重新赋值新对象。
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

