JavaScript数组拷贝的n种方法(浅拷贝)

文章列举并展示了17种在JavaScript中进行数组浅拷贝的方法,包括slice、concat、Object.assign等,当原数组内的对象被修改时,新数组内的对象也会同步变化,证明这些方法执行的是浅拷贝。
摘要由CSDN通过智能技术生成

开门见山,直接进入主题。

假设有如下一个数组 arr,需要拷贝一个新数组 nArr,拷贝完对原数组arr 内的object对象做一个修改,新数组内的拷贝的引用类型object也被同步修改了,证明是浅拷贝。

const arr = [{name: 'xiaoyu'}, 1, 2, 3];
let nArr = [];

方法1. Array.prototype.slice.apply()

nArr = Array.prototype.slice.apply(arr)
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

方法2. Array.prototype.slice.call()

nArr = Array.prototype.slice.call(arr)
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

方法3. [].slice.apply()

nArr = [].slice.apply(arr)
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

方法4. [].slice.call()

nArr = [].slice.call(arr)
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

方法5. arr.slice()

nArr = arr.slice()
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

方法6. concat()

nArr = [].concat(arr)
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

方法7. Object.assign()

nArr = Object.assign([], arr)
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

方法8. 扩展 ...运算符(展开语法)

nArr = [...arr]
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

方法9. 解构

[... nArr] = arr
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

方法10. push() 与展开语法

nArr.push(...arr)
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

方法11. unshift() 与展开语法

nArr.unshift(...arr)
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

方法12. Array.of() 与 展开语法

nArr = Array.of(...arr)
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

方法13. for 循环

for(let i = 0, l = arr.length; i < l; i++) {
    nArr.push(arr[i])
}
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

方法14. forEach 循环

arr.forEach(item => {
    nArr.push(item)
})
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

方法15. map 循环

nArr = arr.map(item => item)
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

方法16. filter 过滤

nArr = arr.filter(item => true)
arr[0].name = 'hello';
console.log(nArr); // [{name: 'hello'}, 1, 2, 3]

// 17. JSON.parse() 与 JSON.stringfy(),深拷贝

nArr = JSON.parse(JSON.stringify(arr))
arr[0].name = 'hello';
console.log(88,nArr); // [{name: 'xiaoyu'}, 1, 2, 3]

完。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值