第二十二篇 JS中浅拷贝的方法有哪些?

AI 概述
1. 手动实现2. Object.assign3. concat 浅拷贝数组4. slice 浅拷贝5. …展开运算符更多相关文章推荐: 重要:什么是拷贝?之前也写过类似的文章,大家可以看《理解 js 的深拷贝和浅拷贝原理和实现的方法》 首先来直观的感受一下什么是拷贝。 let arr = [1, 2, 3]; let newArr = arr; newArr[0] =...
目录
文章目录隐藏
  1. 1. 手动实现
  2. 2. Object.assign
  3. 3. concat 浅拷贝数组
  4. 4. slice 浅拷贝
  5. 5. …展开运算符
  6. 更多相关文章推荐:

重要:什么是拷贝?之前也写过类似的文章,大家可以看《理解 js 的深拷贝和浅拷贝原理和实现的方法

首先来直观的感受一下什么是拷贝。

let arr = [1, 2, 3];
let newArr = arr;
newArr[0] = 100;

console.log(arr);//[100, 2, 3]

这是直接赋值的情况,不涉及任何拷贝。当改变 newArr 的时候,由于是同一个引用,arr 指向的值也跟着改变。

现在进行浅拷贝:

let arr = [1, 2, 3];
let newArr = arr.slice();
newArr[0] = 100;

console.log(arr);//[1, 2, 3]

当修改 newArr 的时候,arr 的值并不改变。什么原因?因为这里 newArr 是 arr 浅拷贝后的结果,newArr 和 arr 现在引用的已经不是同一块空间啦!

这就是浅拷贝!

但是这又会带来一个潜在的问题:

let arr = [1, 2, {val: 4}];
let newArr = arr.slice();
newArr[2].val = 1000;

console.log(arr);//[ 1, 2, { val: 1000 } ]

咦!不是已经不是同一块空间的引用了吗?为什么改变了 newArr 改变了第二个元素的 val 值,arr 也跟着变了。

这就是浅拷贝的限制所在了。它只能拷贝一层对象。如果有对象的嵌套,那么浅拷贝将无能为力。但幸运的是,深拷贝就是为了解决这个问题而生的,它能

解决无限极的对象嵌套问题,实现彻底的拷贝。当然,这是我们下一篇的重点。现在先让大家有一个基本的概念。

接下来,我们来研究一下 JS 中实现浅拷贝到底有多少种方式?

1. 手动实现

const shallowClone = (target) => {
  if (typeof target === 'object' && target !== null) {
    const cloneTarget = Array.isArray(target) ? []: {};
    for (let prop in target) {
      if (target.hasOwnProperty(prop)) {
          cloneTarget[prop] = target[prop];
      }
    }
    return cloneTarget;
  } else {
    return target;
  }
}

2. Object.assign

但是需要注意的是,Object.assgin() 拷贝的是对象的属性的引用,而不是对象本身。

let obj = { name: 'sy', age: 18 };
const obj2 = Object.assign({}, obj, {name: 'sss'});
console.log(obj2);//{ name: 'sss', age: 18 }

3. concat 浅拷贝数组

let arr = [1, 2, 3];
let newArr = arr.concat();
newArr[1] = 100;
console.log(arr);//[ 1, 2, 3 ]

4. slice 浅拷贝

开头的例子不就说的这个嘛!

5. …展开运算符

let arr = [1, 2, 3];
let newArr = [...arr];//跟 arr.slice()是一样的效果

更多相关文章推荐:

(建议收藏)原生 JS 知识系统整理

以上关于第二十二篇 JS中浅拷贝的方法有哪些?的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 第二十二篇 JS中浅拷贝的方法有哪些?

发表回复