美文网首页
JavaScript-浅拷贝vs深拷贝

JavaScript-浅拷贝vs深拷贝

作者: 小笨蛋_729 | 来源:发表于2019-03-06 17:27 被阅读0次

原文地址
博客积累地址

概念

深拷贝和浅拷贝都是针对的引用类型

  • 浅拷贝:拷贝的是地址,最终两个变量指向同一份数据,修改其中一个变量会改变另一个
  • 深拷贝:两个变量是独立的,互不影响

我们先看一个浅拷贝的例子

var a = {
  name: '小明'
}
var b =  // {name: "小明"}
b.name = '木木'
a // {name: "木木"}

只拷贝一层

假设拷贝一份多层嵌套的对象,浅拷贝就是只进行一层拷贝,深拷贝就是无限层级拷贝

一层浅拷贝实现

var a = {
  student: {
    name: '木子'
  }
}

function shallow(obj) {
  var newObj = {}
  for (var i in obj) {
    if (obj.hasOwnProperty(i)) {
      newObj[i] = obj[i]
    }
  }
  return newObj
}

var b = shallow(a)
b.student.name = 'kk'
a.student.name // "kk"

深拷贝

第一种方法:JSON.stringify()和JSON.parse()实现

缺点:

  • 当值为undefined、function、symbol 会在转换过程中被忽略,所以,对象值有这三种的话用这种方法会导致属性丢失
var a = {
  student: {
    name: '木子'
  },
  say: function() {
    return '你好'
  },
  un: undefined
}

var b = JSON.parse(JSON.stringify(a)) // {student: {name: "木子"}}
b.student.name = 'kk'
a.student.name // "木子"

第二种方法:递归实现

拓展和边界问题:

  1. 参数类型做校验,不是对象直接返回
  2. 判读是否是对象的逻辑
  3. 参数为数组的情况
function deepCopy(source) {
  // 参数如果不是对象直接返回
  if (typeof source !== 'object') return source

  // 参数如果为数组
  var newObj = Object.prototype.toString.call(source) === "[object Array]" ? [] : {}

  for (var key in source) {
    // 判断是自身属性,而非原型上的
    if (source.hasOwnProperty(key)) {
      newObj[key] = typeof source[key] === 'object' ? deepCopy(source[key]) : source[key]
    }
  }
  return newObj
}

// 测试
var a = {
  arr: [1, 2, 3],
  student: {
    name: '木子',
    depObj: {
      age: 14
    }
  },
  say: function() {
    return '你好'
  },
  un: undefined
}

var b = deepCopy(a)
a.arr.push(4)
a.arr // [1, 2, 3, 4]
b.arr // [1, 2, 3

相关文章

  • JS中的深拷贝与浅拷贝

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

  • JavaScript-浅拷贝vs深拷贝

    原文地址博客积累地址 概念 深拷贝和浅拷贝都是针对的引用类型 浅拷贝:拷贝的是地址,最终两个变量指向同一份数据,修...

  • 浅拷贝和深拷贝

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

  • 深拷贝VS浅拷贝

    深拷贝VS浅拷贝 本文主要对深拷贝&浅拷贝的解释及实现做一下简单记录。 之所以会有深拷贝与浅拷贝之分,是因为不同数...

  • JavaScript-深拷贝、浅拷贝

    本文档适用于有一定经验的开发者。我们默认你已经掌握了指针的概念(也可称为地址) ,如果你是新手,你可能需要先了解 ...

  • 2020-04-17- ES6 对象解构赋值(浅拷贝 VS 深拷

    ES6 对象解构赋值(浅拷贝 VS 深拷贝) 只进行了第一层深拷贝,第二层及更深层为浅拷贝;

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

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

  • 深拷贝VS浅拷贝

    一、深拷贝和浅拷贝的概念 举个栗子: 从以上代码可以看出,当a是一个对象的时候,将a赋值给b,则b的属性改变之后a...

  • 深拷贝 vs 浅拷贝

    浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。 深拷贝:将 B 对象拷贝到 A 对...

  • 浅拷贝VS深拷贝

    浅拷贝 对于对象或数组类型 将a赋值给b,然后更改b中的属性,a也会随着变化注:a和b指向了同一块堆内存 深拷贝 ...

网友评论

      本文标题:JavaScript-浅拷贝vs深拷贝

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