美文网首页
JS中的深拷贝vs浅拷贝

JS中的深拷贝vs浅拷贝

作者: 梁相辉 | 来源:发表于2018-08-23 11:31 被阅读108次
未标题-1 拷贝.jpg

我们知道,JS 中的数据分为基础数据类型 (Undefined, Null, Boolean, Number, String, symbol) 和引用数据类型(object)。
当赋值给变量进行数据保存时,前者保存的是数据实体,后者保存的是数据实体在堆内存中的地址
为什么会这样?在 JS 中,也有栈内存堆内存的概念。
,是在程序编译时分配,它是连续的内存空间,容量小,系统分配效率高,有后进先出的特性,适合存储简单有固定尺寸的数据,如基础数据。
,是在程序运行时申请的某个大小的内存空间,不连续,树形结构。容量大,系统分配效率略低,适合存储尺寸不确定的数据,如 Object。
基础数据的存储是系统直接在栈内存中开出一块空间存值,而 Object 的存储,是先在堆内存中开辟空间存值,然后在栈内存中存址。

本质区别

深拷贝和浅拷贝的本质区别在于对引用类型数据的拷贝,前者拷值,后者拷址。

本文所述的拷贝主要是对象和数组的拷贝。

代码实现

// data type
const whatType = obj => Object.prototype.toString.call(obj).slice(8, -1)

// shallow copy
function shallowCopy(obj) {
  let result;
  switch (whatType(obj)) {
    case "object":
      result = {};
      break;
    case "Array":
      result = [];
      break;
    default:
      return obj
  }

  for (key in obj) {
    obj[key] = obj[key]
  }

  return result
}

// deep copy
const deepCopy = (function f(obj) {
  let result;
  switch (whatType(obj)) {
    case "Object":
      result = {};
      break;
    case "Array":
      result = [];
      break;
    default:
      return obj
  }

  for (key in obj) {
    const type = whatType(obj[key])
    if ( type=== "Object" || type === "Array") {
       result[key] = f(obj[key])
    } else {
      result[key] = obj[key]
    }
  }
  
  return result
})

// 深拷贝的另一种简便方式
const deepCopy2 = obj => JSON.parse(JSON.stringfy(obj))

相关文章

  • JS中的深拷贝与浅拷贝

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

  • 浅拷贝和深拷贝

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

  • js浅拷贝深拷贝

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

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

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

  • JS中对象的复制

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

  • 深拷贝VS浅拷贝

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

  • JS中的深拷贝vs浅拷贝

    我们知道,JS 中的数据分为基础数据类型 (Undefined, Null, Boolean, Number, S...

  • js中的浅拷贝 vs 深拷贝

    前言 在前端的数据处理当中,有时候往往需要对原有的数据进行克隆拷贝一份,然后进行操作,但是又不能影响原来的数据 比...

  • 【JS】深拷贝 vs 浅拷贝

    本文思维导图如下: 本文首发于我的个人网站: http://cherryblog.site/本文作者: Cherr...

  • Objective-C中的浅拷贝和深拷贝

    Objective-C中的浅拷贝和深拷贝 Objective-C中的浅拷贝和深拷贝

网友评论

      本文标题:JS中的深拷贝vs浅拷贝

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