JSON.stringify()是目前前端开发过程中最常用的深拷贝方式,

原理是把有个对象序列化成为一个 JSON 字符串,将对象的内容转换成字符串的形式再保存到磁盘上,

再用 JSON.parse()反序列化将 JSON 字符串变成一个新的对象

 1 let obj1 = {
2 a: 1,
3 b: [1, 2, 3],
4 };
5
6 let str = JSON.stringify(obj1);
7 let obj2 = JSON.parse(str);
8 console.log(obj2); //{ a: 1, b: [ 1, 2, 3 ] }
9
10 //修改obj1
11 obj1.a = 2;
12 obj1.b.push(4);
13 console.log(obj1); //{ a: 2, b: [ 1, 2, 3, 4 ] }
14 console.log(obj2); //{ a: 1, b: [ 1, 2, 3 ] }

通过 JSON.stringify 实现深拷贝有几点要注意

  1. 拷贝的对象的值中如果有函数,undefined,symbol 则经过 JSON.stringify()序列化后的 JSON 字符串中这个键值对会消失
  2. 无法拷贝不可枚举的属性,无法拷贝对象的原型链
  3. 拷贝 Date 引用类型会变成字符串
  4. 拷贝 RegExp 引用类型会变成空对象
  5. 对象中含有 NaN、Infinity 和-Infinity,则序列化的结果会变成 null
  6. 无法拷贝对象的循环应用(即 obj[key] = obj)

学习记录

js对象深拷贝方法的更多相关文章

  1. js 对象 toJSON 方法

    浅谈 js 对象 toJSON 方法   前些天在<浅谈 JSON.stringify 方法>说了他的正确使用姿势,今天来说下 toJSON 方法吧.其实我觉得这货跟 toString 一 ...

  2. js对象属性方法大总结(收集)

    数组(Array):系列元素的有序集合: 详细演示请看:[js入门系列演示·数组 ] http://www.cnblogs.com/thcjp/archive/2006/08/04/467761.ht ...

  3. js 对象克隆方法总结(不改变原对象)

    1.通用对象克隆: function clone(obj){ let temp = null; if(obj instanceof Array){ temp = obj.concat(); }else ...

  4. js对象深拷贝、浅拷贝

    浅拷贝1 //浅拷贝1 let obj01 = { name: 'Lily', age: '20', time: ['13', '15'], person: { name: 'Henry', age: ...

  5. js对象属性方法大总结

    数组(Array):系列元素的有序集合: 详细演示请看:[js入门系列演示·数组 ] http://www.cnblogs.com/thcjp/archive/2006/08/04/467761.ht ...

  6. js对象深拷贝

    数组一维深拷贝:slice.concat.Array.from 对象一维深拷贝:Object.assign 一.利用扩展运算符...对数组中嵌套对象进行深拷贝 var arr=[{a:1,b:2},{ ...

  7. 使用js把json字符串转为js对象的方法

    ECMA-262(E3) 中没有将JSON概念写到标准中,还好在 ECMA-262(E5)中JSON的概念被正式引入了,包括全局的JSON对象和Date的toJSON方法. 1,eval方式解析,恐怕 ...

  8. js 对象toString()方法

    ({}+{}).length == 30; ({}).toString() '[object Object]' 当对象需要调用toString()方法时会被自动调用.

  9. 浅谈 js 对象 toJSON 方法

    前些天在<浅谈 JSON.stringify 方法>说了他的正确使用姿势,今天来说下 toJSON 方法吧.其实我觉得这货跟 toString 一个道理,他是给 stringify 方法字 ...

  10. js对象属性方法

    window对象方法方法: 1.alert():显示带有一段消息和确认按钮的警告框 2.prompt():显示可提示用户输入的对话框 3.fonfirm():显示带有一段消息以及确认按钮和取消按钮的对 ...

随机推荐

  1. 多个el-table在使用v-if在同一页面切换渲染时相互影响的解决办法

    解决办法 给每个el-table设置一个唯一的key值,如: <el-table key='uniqueName' ></el-table> <el-table key= ...

  2. 【剑指Offer】【链表】反转链表

    题目:输入一个链表,反转链表后,输出新链表的表头. A:定义3个结点,pNode作移动指针,pRet作输出指针,pPrev作前驱指针    在pNode没有到达链尾之前,循环里创建pNext指针记录p ...

  3. 物流扫码固定式扫描相机BXT-10M 自动分拣读码器 条码识别扫码器

    物流扫码固定式扫描相机BXT-10M 自动分拣读码器 条码识别扫码器   VX : orihard2014   标签: 条码识别扫码器, 自动分拣读码器, 物流扫码固定式扫描相机, 物流扫码相机

  4. SQL中使用JOIN时,过滤条件的位置

    sql语句 (SELECT * FROM t1 WHERE {subquery_where_condition}) a JOIN (SELECT * FROM t2 WHERE {subquery_w ...

  5. windows U盘启动装机工具(Ventoy)

    Windows优盘启动装机工具 一.WePE 纯净 WePE 启动盘/ U盘重装系统工具 1.U盘重装系统工具下载地址:https://www.wepe.com.cn/download.html?td ...

  6. unity读取Excel表格保存到Sqlite数据库

    1.读取Excel表格和保存sqlite数据库所用到的dll文件   下载链接:dll文件 最后如下图所示 废话不多说了,直接上代码吧 因为太长就折叠了 using System.Collection ...

  7. flask-基础篇01

    一.介绍 flask只有一个内核,其WSGI工具箱采用Werkzeug(路由模块),模板引擎使用Jinja2.其他几乎所有功能都要用第三方扩展来实现. 二.常用扩展包 扩展列表:http://flas ...

  8. Android 系统完整的权限列表

    访问登记属性  android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限  获取错略位置  android.perm ...

  9. CCF 202012-2 期末预测之最佳阈值

    #include <iostream> #include <bits/stdc++.h> #include <string> using namespace std ...

  10. 基于 Docker 安装 Nginx 搭建静态服务器

    最近一直在准备家里的服务器部署一个自己用的网站玩玩,一来是用来学习部署的基础知识,二来,后面有空学点前端,可以部署到自己网站玩玩. 参考链接:https://juejin.cn/post/705740 ...