Js克隆对象

1 浅复制

具体方法

// 数组
Array.prototype.slice
const oldArr = new Array(100).fill(null).map(() => Math.random() * 100 | 0)
const newArr = oldArr.slice() // 普通对象
Object.assign
const oldObj = new Object() // plain object
const newObj = Object.assign({}, oldObj)

2 深复制

1) 转字符串再还原

function deepClone(obj) {
return JSON.parse(JSON.stringify(obj))
}

2) 便利对象,递归克隆

function deepClone(obj) {
if ( typeof obj !== 'object' ) {
return obj
}
const ret = Array.isArray(obj) ? [] : {}
for ( let i in obj ) {
ret[i] = deepClone(obj[i])
}
return ret
}

3)循环引用对象

如果采用以上两种克隆方式,遇到循环引用对象会导致报错

function updateClone(obj) {
const map = new Map();
function deepClone(obj) {
if (typeof obj !== 'object') {
return obj;
}
const ret = Array.isArray(obj) ? [] : {};
for (let i in obj) {
const dist = obj[i];
if (map.has(dist)) {
continue;
} else {
map.set(dist, true);
ret[i] = dist;
}
}
return ret;
}
return deepClone(obj);
}

4)难克隆对象,甚至无法克隆对象

比如Date, Function, Error或者自定义的一些class构造对象

const oldDate = new Date()
const newDate = new Date(+oldDate)
// Date可以处理
// Function 使用toString,但是考虑到可能bind有些context,而且函数的作用域链,这些没法搞
// Error stack message这些也没法处理
// Window构造对象这些更是无法处理

5)对象属性key异常情况

属性不可枚举

Object.getOwnPropertyDescriptors({a:1})



这个可以通过使用Object.getOwnPropertyNames获取,但是赋值的时候得注意一下,也应该是enumerable: false

遍历了原型链上属性,方法

某些同学写代码不注意,直接Object.prototype.xx = xx

那么这个数据就是可以枚举的,for in慢的原因也是因为他不止遍历当前对象,他会沿着原型链一直向上找

可以通过hasOwnProperty过滤掉

总结

其实大部分时候只需要能够克隆plain object就行了,太过于复杂的情况无需考虑

Js克隆对象的更多相关文章

  1. js深度克隆对象

    js深度克隆对象 js深度克隆对象简单的记录一下,如下代码: var obj = { typeOf: function(obj) { const toString = Object.prototype ...

  2. 原生JS的对象常用操作总结

       前端时间写了篇怎么判断js对象相等的文章,一直在期待大神给点消息,无奈一直杳无音讯,还是自己写个函数来进行判断,下面总结一些常用的对象操作的方法.    咋们来个先抑后扬的方式,先放出几个基本的 ...

  3. 【PHP面向对象(OOP)编程入门教程】17.克隆对象__clone()方法

    有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象, ...

  4. js定义对象的几种容易犯的错误

    //js定义对象的几种容易犯的错误function Person() { getName = function (){ console.info(1); }; return this;}//Perso ...

  5. 模仿console自写函数打印js的对象

    本以为写个递归函数就可以将js的对象打印出来. 当然第一个想到的估计是JSON.stringify() 这个函数.但这个函数打印到浏览器 显示效果不友好.最友好的显示肯定是 控制台打印咯. 结果尝试打 ...

  6. js自定义对象

    一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在Javascrip ...

  7. Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换

    Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换 { "@type":"java.lang.Runti ...

  8. js中对象使用

    简单记录javascript中对象的使用 一.创建对象 //创建一个空对象 var o={}; //创建一个含有两个属性的对象,x.y var o2={x:12,y:'12',name:'JS'}; ...

  9. JavaScript学习06 JS事件对象

    JavaScript学习06 JS事件对象 事件对象:当事件发生时,浏览器自动建立该对象,并包含该事件的类型.鼠标坐标等. 事件对象的属性:格式:event.属性. 一些说明: event代表事件的状 ...

  10. [转]JS中对象与字符串的互相转换

    原文地址:http://www.cnblogs.com/luminji/p/3617160.html 在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: thr ...

随机推荐

  1. Spring注解之@Autowired:按类型自动装配Bean到数组、集合和Map

    在Spring Boot项目中,如何把某些接口的多个实现类的Bean注入到Arrays, java.util.Collection 和 java.util.Map类型的变量中,方便应用的时候直接读取? ...

  2. Linux下安装Flume

    摘要 flume是由cloudera软件公司产出的可分布式日志收集系统,后于2009年被捐赠了apache软件基金会,为hadoop相关组件之一.尤其近几年随着flume的不断被完善以及升级版本的逐一 ...

  3. 二、第一个微信小程序

    使用微信开发者工具创建一个新的空项目,即是一个显示自己账号的小程序. 也可以删除自动生成的冗余代码,手动写一个显示自己账号的简单小程序. 下面即是基于JavaScript模板的手工写的一个简单小程序. ...

  4. 详解鸿蒙Next仓颉开发语言中的全屏模式

    大家好,今天跟大家分享一下仓颉开发语言中的全屏模式. 和ArkTS一样,仓颉的新建项目默认是非全屏模式的,如果你的应用颜色比较丰富,就会发现屏幕上方和底部的留白,这是应用自动避让了屏幕上方摄像头区域和 ...

  5. DTMO 直播预告|Taier 的 Web 前端架构解析

    原文链接:DTMO 直播预告|Taier 的 Web 前端架构解析 一.直播介绍 上两期,我们为大家分享了 Taier 入门及控制台的介绍,本期我们为大家分享 Taier 的 Web 前端架构介绍. ...

  6. HBase Sync功能导致HBase入库性能下降

    本文分享自天翼云开发者社区<HBase Sync功能导致HBase入库性能下降>,作者:5****m 问题背景与现象 HBase入库慢,regionserver日志中大量打印slow sy ...

  7. Spring Boot 集成 ShardingSphere-JDBC 配置示例

    概述 Apache ShardingSphere‐JDBC 旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库. 关系型数据库当今依然占有巨大市场份额,是 ...

  8. Kong入门学习实践(9)安全防护插件

    Kong的一大特色就在于强大的可扩展性,具体实现方式就是插件.一来Kong已经提供了很多内置的插件,二来我们也可以使用Lua语言自定义开发插件.今天,我们就来了解一些常用的安全防护插件. 关于安全防护 ...

  9. MongoDB入门实战教程(5)

    前面我们学习了MongoDB的基本查询命令操作,作为后端开发的我们大部分场景都是在应用程序中和MongoDB进行交互,因此本篇我们来学习一下如何在ASP.NET Core中集成MongoDB. 1 配 ...

  10. 11-2 MySQL 数据库对象编写建议(参考)

    11-2 MySQL 数据库对象编写建议(参考) @ 目录 11-2 MySQL 数据库对象编写建议(参考) 1. 数据库对象编写建议/推荐 1.1 关于库 1.2 关于表.列 1.3 索引 1.4 ...