前言

在开发过程中,偶尔会遇到这种场景,拿到一个数据后,你打算对它进行处理,但是你又希望拷贝一份副本出来,方便数据对比和以后恢复数据。

那么这就涉及到了 JS 中对数据的深浅拷贝问题,所谓深浅拷贝,浅拷贝的意思就是,你只是复制了对象数据的引用,并没有把内存里的值另外复制一份,那么深拷贝就是把值完整地复制一份新的值。

在之前的文章《JS专题之数据类型和类型检测》中我有讲过,JS 中的数据类型分为两种,基本数据类型和引用数据类型,基本数据类型是保存在栈的数据结构中的,是按值访问,所以不存在深浅拷贝问题。

而比如对象,数组,函数,正则,时间对象这些都是引用数据类型,是保存在堆中的。所以,引用数据类型的复制,是内存地址的传递,并没有拷贝出一份新的数据。

那么深拷贝,浅拷贝的区别是什么呢?先给结论:

操作拷贝之后的数据不会影响到原数据的值拷贝,就是深拷贝,反正,有影响则为浅拷贝。

一、应用场景

日常开发中,JS 拷贝大多会在 数据保存,数据比对,数据同步 时出现,所以,当你在这些场景的时候,要记得里面隐藏有一个数据深浅拷贝的问题。

二、浅拷贝

我们来看一下浅拷贝:

function 

我们发现,首先,浅拷贝不是直接赋值,浅拷贝新建了一个对象,然后将源对象的属性都一一复制过来,复制的是值,而不是引用。

我们知道,对象都是按地址引用进行访问的,浅拷贝的复制只复制了第一层的属性,并没有递归将所有的值复制过来,所以,操作拷贝数据,对原数据产生了影响,故而为浅拷贝。

进而,那些可以直接返回原数组的方法就可以简单实现数组和对象浅拷贝。

// 1、 数组浅拷贝 - slice

Object.assign 的拷贝,假如源对象的属性值是一个指向对象的引用,它也只拷贝那个引用值。MDN 有相应的实例和解释。

二、深拷贝

深拷贝就完整复制数据的值(而非引用),目的在于避免拷贝后数据对原数据产生影响。

目前深拷贝的实现方法主要有递归复制,JSON 正反序列化:

// 1. 深拷贝 - JSON 正反序列化

JS 的深拷贝的应用,需要根据你的使用场景进行使用,首先是有无必要深拷贝,其次是数据类型,是否直接使用 JSON 的 API 其实就可以。

JS 深浅拷贝在日常开发中使用频率还是较高的,其中考察的知识点,主要在于:

1、是否遇到过深浅拷贝的问题,里面有什么坑

2、是否了解 JS 的数据类型,数据在计算机中的存储机制

3、是否了解数组、对象的一些常用的 API

4、jquery、lodash、underscore 的相关工具函数使用

总结

深浅拷贝主要考察了开发者对 JS 数据类型的了解,数组,对象常用方法的特点和应用,递归函数的封装。

春节快乐! 写于大年三十,不写文章浑身不舒服~

js ...运算符_JS专题之深浅拷贝相关推荐

  1. js 运算符_JS的相等和严格相等运算符(== amp; ===)

    [===]被称为严格相等运算符,[==]被称为相等运算符,两个都是用来比较两边的值是否相等,相等则返回true,否则返回false. 然鹅,他们的比较规则是不一样的. [===]严格相等运算符的比较规 ...

  2. JavaScript专题(五)深浅拷贝

    JavaScript专题之深浅拷贝 了解拷贝背后的过程,避免不必要的错误,Js专题系列之深浅拷贝,我们一起加油- 目录 一.拷贝示例 二.浅拷贝 三.深拷贝的方法? 四.自己实现深浅拷贝 一.拷贝示例 ...

  3. boolean类型_JS核心理论之《数据类型、类型转换、深浅拷贝与参数传递》

    数据类型 基本类型:共7种,也被称为值类型,是一种既非对象也无方法的数据.包括:string.number.bigint.boolean.null.undefined.symbol. 除了 null ...

  4. JS中深浅拷贝 函数封装代码

    一.了解 基本数据类型保存在栈内存中,按值访问,引用数据类型保存在堆内存中,按址访问. 二.浅拷贝 浅拷贝只是复制了指向某个对象的指针,而不是复制对象本身,新旧对象其实是同一内存地址的数据,修改其中一 ...

  5. JS(JavaScript)中实现深浅拷贝的几种方式(详细阅读 非常重要)。

    在了解深浅拷贝之前,我们先一起来简单来了解一下,JavaScript 数据存储的方式,以及数据类型(). JavaScript 中数据存储分为 简单数据类型和复杂数据类型(引用数据类型) 其中 5 种 ...

  6. JS 中对象的深浅拷贝(ES3、ES5、ES6不同方法底层实现,一文搞清楚深浅拷贝面试常问题)

    JS 中对象的深浅拷贝   拷贝我们都知道这个词的意思,我们经常做过复制.粘贴的操作,其中的复制就是拷贝,那么在拷贝的时候,如果我们复制出来的内容和原内容是完全的分开,各自不相影响,那么这就属于深拷贝 ...

  7. js中深浅拷贝理解与方法

    深浅拷贝的方法 堆栈理解 基本数据类型 number.string.boolean.null.undefined 引用数据类型 object.function.array 栈内存 存储基本数据类型内容 ...

  8. day02 格式化输出 运算符 编码 字符串 列表 元组 字典 set集合 深浅拷贝

    day02学习大纲 一. 格式化输出: %s 占位字符串 %d 占位数字 "xxx%sx %sxx" % (变量, 变量) 二. 运算符: a+=b a = a + b and 并 ...

  9. 9012年,当我们讨论js深浅拷贝时我们在说些什么?

    前言: 本文主要阅读对象:对深浅拷贝印象模糊对初级前端,想对js深浅拷贝聊一聊的中级前端.如果是对这些有完整对认知体系和解决方法的大佬,可以选择略过. 复制代码 正文: 讨论深浅拷贝,首先要从js的基 ...

  10. php深浅拷贝,js实现深浅拷贝方法

    说起深浅拷贝,我觉得需要理清楚 值类型 和 引用类型,本文主要和大家分享js实现深浅拷贝方法,希望能帮助到大家. 值类型 所谓 值类型 就是 undefined,null,number, string ...

最新文章

  1. python中不可不知的一个重要的集合模块
  2. 基于hi-nginx的web开发(python篇)——路由装饰器
  3. 使用Callable和Future接口创建线程
  4. “我将 20 年前开发的操作系统迁移到 .NET 6,居然成功了”
  5. idea运行springboot出现 Disconnected from the target VM, address: ‘127.0.0.1:xxxx‘, transport: ‘socket‘
  6. pytorch 中网络参数 weight bias 初始化方法
  7. 快速排序QuickSort
  8. python中out函数_cython函数输出与python函数outpu略有不同
  9. 自动化测试-selenium初始化Driver参考
  10. 编译OpenJDK8:get_msc_ver.sh:需要整数表达式/integer expression expected
  11. ping命令使用集合
  12. 内存带宽stream测试
  13. 我国有了密码法,将2020年1月1日起施行!
  14. java 排列组合算法_关于各种排列组合java算法
  15. node.js -- 手把手教你搭建 电商平台
  16. php多张图片制作成视频教程,如何将多张图片转换成视频?快速制作电子相册的方法...
  17. (附源码)spring boot基于微信小程序的口腔诊所预约系统 毕业设计 201738
  18. c语言mon什么意思,c'mon是什么意思啊 – 手机爱问
  19. mac 命令行 解压7z文件_命令行压缩解压7z
  20. win10的JDK安装环境变量配置

热门文章

  1. Spark 概念学习系列之从spark架构中透视job(十六)
  2. (C++)String的用法
  3. PCA MATLAB
  4. log4j.xml的实用例子
  5. 理解委托的两类必要方法
  6. MagicMongoDBTool 最新代码 以及 开发进度报告
  7. mysql:Error while performing database loggin with the mysql driver
  8. 【直播回顾】蚂蚁金服高级开发工程师萧恺:IDEA 插件开发入门教程...
  9. 稳定不掉线,翀旭用飞鱼星解决高密Wi-Fi接入
  10. Access 操作必须使用可更新查询