讲在之前

  • 深浅拷贝只针对引用对象
  • 对于部分基本数据类型,如number、string、boolean等,采用字面量赋值,他们都是值复制,又因为他们只有值,故赋值的过程,其实就是创建了新的值,不过值相等罢了。
  • 提一嘴:为什么作为非引用类型,他们居然有方法用?因为number、string、boolean有原始包装类型,在使用方法时,会短暂的创建一个包装类型实例,使用完方法后就会销毁。因为是对象,我们没必要自己去创建一个对象只保存一个值,浪费堆内存。

浅拷贝

只复制一层

深拷贝

复制所有层


浅拷贝方法

  1. Object.assign( { }, obj1 );
  2. [ ].concat( nums )
  3. slice( )

注意:如果只想要对象本身的属性还是和for循环、hasOwnProperty一起使用。


深拷贝方法

未知深度:
  1. 递归

  2. JSON对象

//无法实现对象中方法的深拷贝
function deepClone2(obj) {
  let _obj = JSON.stringify(obj);
  return JSON.parse(_obj);
}