JS学习笔记——浅拷贝与深拷贝

作者: Rocky_Wong | 来源:发表于2018-08-12 01:02 被阅读0次

基础类型与引用类型

五大基础类型

  • Underfied
  • Null
  • Boolean
  • Number
  • String

他们是固定大小的数据,存在栈中,按值传递。

let a = 1
let b = a // �b拷贝a
console.log(b) // 1

a = 2 // a值变了
console.log(b) // 1,b值没有变


对基本类型来说,拷贝就是复制一份同样的值给对方,双方不会被影响。

而引用类型存的是对象的引用地址,对象的大小不确定,存在堆中,普通的赋值拷贝只会复制一遍引用地址,实质上两者还是指向同一个对象。

let a = {x : 1}
let b = a // �b拷贝a
console.log(b) // {x : 1}

a = {x : 2} // a值变了
console.log(b) // {x : 2},b也变了

浅拷贝与深拷贝

上面的例子是普通的赋值拷贝,证明了对引用类型来说赋值拷贝是无效的,所以我们又想到了遍历一遍对象里的值,那不就搞定了吗?这就是我们说的浅拷贝啦。确实,对一个只有一层属性且属性均为基本属性的对象来说,遍历了一遍之后会拷贝成功,互不影响。但是一旦存在有属性又是引用类型的话,还是会出现一样的问题。

所以深拷贝的直观理解就是,对引用类型中每个属性进行遍历拷贝,直到遇到基本类型为止

深浅拷贝的方案

浅拷贝方案

  • Object.assign() (兼容性不好)
  • Underscore —— _.clone()
  • lodash —— _.clone()
  • 数组中concat和slice方法

深拷贝方案

  • JSON.parse(JSON.stringify(obj))
    简单粗暴又有点dirty,但是能满足日常需求,只能处理json能理解的数据格式,当然不包括函数了,性能也没有特别好
  • lodash —— _.cloneDeep()
    很好地兼容了ES6的新引用类型,而且处理了环型对象的情况
  • jQuery —— $.clone() / $.extend()
    源码适合初学者学习,比较好理解

假如说到要来一个万能的完美的深拷贝方案,哦?不存在的。深拷贝本来就没有一个明确的定义,如何处理DOM节点的拷贝,如何拷贝原型的属性,RegExp 怎么处理,函数怎么处理。。。在知乎上有人这样问👇

JavaScript 如何完整实现深度Clone对象?

参考文章

深入剖析 JavaScript 的深复制

js浅复制与深复制的原理

详解js深浅复制

结语

最近比较忙,其实最好还是和大家一起讨论一下以上提及到的第三方库优秀的深拷贝源码。。所以大家可以自行去学习~~

相关文章

  • JS中的深拷贝与浅拷贝

    知乎:js中的深拷贝和浅拷贝? 掘金: js 深拷贝 vs 浅拷贝 前言 首先深拷贝与浅拷贝只针对 Object,...

  • js浅拷贝深拷贝

    js浅拷贝,深拷贝的简单实现 基础数据 浅拷贝 深拷贝

  • 浅拷贝和深拷贝

    本文参考:JavaScript中的浅拷贝和深拷贝js 深拷贝 vs 浅拷贝深入剖析 JavaScript 的深复制...

  • JS学习笔记——浅拷贝与深拷贝

    基础类型与引用类型 五大基础类型 Underfied Null Boolean Number String 他们是...

  • js面试题

    1,js的深拷贝与浅拷贝 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,...

  • JS实现深拷贝、instanceof、判断是否为数组

    JS深拷贝 JS中拷贝对象可以按照拷贝的程度可以分为浅拷贝和深拷贝,有些时候我们需要拷贝之后的对象和拷贝之前的对象...

  • JS中对象的复制

    JS中的对象复制分为两种情况:深拷贝和浅拷贝。深拷贝和浅拷贝的区别在于对数组和对象的拷贝,对它们拷贝时浅拷贝只是拷...

  • JS浅拷贝与深拷贝

    title: JS浅拷贝与深拷贝的学习记录date: 2017年9月21日 23:26:14tags: jscat...

  • 认识js下的浅拷贝与深拷贝

    浅拷贝与深拷贝 首先深拷贝和浅拷贝只针对像 Object, Array 这样的复杂对象的。简单来说,浅拷贝只拷贝一...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

网友评论

    本文标题:JS学习笔记——浅拷贝与深拷贝

    本文链接:https://www.haomeiwen.com/subject/rebjbftx.html