js深度复制一个对象使用JSON.stringify是最好的办法吗

转载自   js深度复制一个对象使用JSON.stringify是最好的办法吗

深度复制一个对象,看到很多种方法,最简单的是:

var newObject = JSON.parse(JSON.stringify(oldObject));

这样写有什么弊端吗?

http://stackoverflow.com/questions/20662319/javascript-deep-copy-using-json 看这,两个弊端了。

 

7个回答

1、oldObject = {a: 1, b: function() {}}

他的意思是这样的对象用此方法复制不了。

 

2、更新:
JSON接口在于:无法处理function,无法处理Reg,无法处理循环引用对象,完美的实现深度copy是非常非常麻烦的,生产上建议使用lodash,https://www.npmjs.com/package...
如果你的应用场景处理的就是服务器返回json数据,或者即将以json传递给服务器的,用JSON是最方便的,没必要引入这么复杂的clone库。

原答案:
使用JSON接口有弊端,使用Object.create不会复制对象本身, 而是用对象的constructor重新构造一个对象。
所以可以考虑使用Object.assign

let old_obj = [{a:1},{b:2}];
let new_obj = old_obj.map((ele)=>{return Object.assign({},ele);
});
old_obj[0].a=99;
console.log(new_obj); // "[{a:1},{b:2}]" 

3、一般情况下通过 JSON 来复制挺好的,代码写起来也方便——不过并不是所有环境都实现了 JSON,这个需要考虑下。

通过 deep clone 一般都是有限定复制层次的,一般情况下不会无限层的复制下去。如果使用 JSON 方式来复制,通常不能控制层次。

 

4、深拷贝不就好了么。

https://github.com/XadillaX/nbut-online-judge-v2/blob/master/util/functions.js#L7-L28

/*** Deepin clone an object* @param obj* @returns {*}*/
exports.cloneObject = function(obj) {if(typeof obj === "object") {if(util.isArray(obj)) {var newArr = [];for(var i = 0; i < obj.length; i++) newArr.push(obj[i]);return newArr;} else {var newObj = {};for(var key in obj) {newObj[key] = this.cloneObject(obj[key]);}return newObj;}} else {return obj;}
};

5、

var newObject = Object.create(oldObject);

6、可以参考一下stackoverflow上关于克隆一个对象的有效方法

7、这个看需求,我是搜索进来的,之前使用封装出来的深拷贝方法,结果不能满足我的需求,

建议如果数据格式大而且多样的话,最好是用楼主说的方法; 如果deepcopy的层级小的话,可以看下面的代码:

var hasOwn = Object.prototype.hasOwnProperty;
function deepCopy(receiver, obj){var args = [].slice.call(arguments), key, i = 1, deep, ride, value, valueType;if( typeof args[args.length-2] === "boolean" ){deep = args.pop();ride = args.pop();}else{ride = (typeof args[args.length-1] === "boolean")?args.pop():true;deep = false;if(args.length < 2){receiver = ( this !== global ) ? this : {};if( args.length === 0 ){return receiver;}}}while( obj = args[ i++ ] ){for( key in obj ){if( hasOwn.call(obj, key) ){if( ride || !(key in receiver) ){value = obj[key];valueType = type(value);if( deep && ( valueType==="object")){receiver[key]={};deepCopy(receiver[key], value, ride, deep);}else if( deep && ( valueType==="array" )){receiver[key]=[];deepCopy(receiver[key], value, ride, deep);}else{receiver[key] = obj[key];}}}}}return receiver;
}// 类型判定对象
var class2type = {"[objectHTMLDocument]" : "document","[objectHTMLCollection]" : "nodeList","[objectStaticNodeList]" : "nodeList","[objectIXMLDOMNodeList]" : "nodeList","null" : "null","NaN" : "NaN","undefined" : "undefined"
};"Boolean, Number, String, Function, Array, Date, RegExp, Document, Arguments, NodeList".replace( /[^, ]+/g, function( type ){class2type["[object " + type + "]"] = type.toLowerCase();} );// 类型判定
function type( obj, isType ){var key = ((obj == null || obj !== obj ) ? obj + "" : Object.prototype.toString.call( obj )),result;if( typeof(result = class2type[ key ]) !== "string" ){if( obj.nodeType === 9 ){result = class2type["Document"];}else if( obj.item && typeof obj.length === "number" ){result = class2type["NodeList"];}else{result = key.slice(8, -1);}}if( isType ){return result === isType.toLowerCase;}return result;
}export { deepCopy };   //根据开发模式选择使用或不使用,可取消

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Java]对double变量进行四舍五入,并保留小数点后位数

[Java]对double变量进行四舍五入&#xff0c;并保留小数点后位数 - 雾霾王者 - 博客园 [Java]对double变量进行四舍五入&#xff0c;并保留小数点后位数 1.功能 将double类型变量进行四舍五入&#xff0c;并保留小数点后位数 2.代码 import java.math.BigDecimal; import ja…

尊贵豪礼:微软2017最有价值专家MVP奖套件开箱图集

IT之家编者按&#xff1a;台湾省某科技网站站长获得了微软2017年度最有价值专家&#xff08;Most Valuable Professional&#xff0c;MVP&#xff09;奖&#xff0c;得奖的领域则是 Windows and Devices for IT。这位站长于是就展示了这份MVP的礼包开箱&#xff0c;从照片上看&…

echart vue 图表大小_vue之将echart封装为组件

最近的新项目里&#xff0c;有大量数据图表类的需求&#xff0c;为了增强代码的复用性&#xff0c;减少冗余&#xff0c;我开始思考如何将echart封装为组件调用。本文将会以雷达图为案例&#xff0c;一步步讲解在vue项目中如何使用echart&#xff0c;如何将其封装为能重复调用的…

ssh(Spring+Spring mvc+hibernate)——Dept.hbm.xml

<?xml version"1.0" encoding"utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file au…

个性化配置你的SQL Server on Linux

问题引入 这天老鸟满面春风找到菜鸟&#xff1a;“鸟儿啊&#xff0c;看你最近研究SQL Server On Linux如鱼得水&#xff0c;干得不错啊。不过呢&#xff0c;这是一个张扬个性的年代&#xff0c;要创新&#xff0c;要与众不同&#xff0c;那你怎么在Linux平台对SQL Server做个性…

idea查看读取的那个nacos配置和yaml配置 naocos 日志

logging.level.com.alibaba.cloud.nacos.client.NacosPropertySourceBuilderdebug

二叉树的前中后序查找+思路分析

思路分析 代码实现 package com.atguigu.tree;/*** 创建人 wdl* 创建时间 2021/3/24* 描述*/ public class BinaryTreeDemo {public static void main(String[] args) {//先需要创建一颗二叉树BinaryTree binaryTree new BinaryTree();//创建需要的节点HeroNode root new He…

JavaScript Function.arguments 属性详解

转载自 JavaScript Function.arguments 属性详解 arguments属性是正在执行的函数的内置属性&#xff0c;返回该函数的arguments对象。arguments对象包含了调用该函数时所传入的实际参数信息(参数个数、参数值等)。 该属性属于Function对象&#xff0c;所有主流浏览器均支持…

sh(Spring+Spring mvc+hibernate)——BaseDao.java

/** * Title: BaseDao.java * Package org.dao * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-11-17 上午8:17:28 * version V1.0 */ package org.dao;import java.io.Serializable;/*** * * 项目名称&#xff…

spark sql uv_使用Spark Streaming SQL进行PV/UV统计

作者&#xff1a;关文选&#xff0c;花名云魄&#xff0c;阿里云E-MapReduce 高级开发工程师&#xff0c;专注于流式计算&#xff0c;Spark Contributor1.背景介绍PV/UV统计是流式分析一个常见的场景。通过PV可以对访问的网站做流量或热点分析&#xff0c;例如广告主可以通过PV…

asp.net core mvc实现伪静态功能

在大型网站系统中&#xff0c;为了提高系统访问性能&#xff0c;往往会把一些不经常变得内容发布成静态页&#xff0c;比如商城的产品详情页&#xff0c;新闻详情页&#xff0c;这些信息一旦发布后&#xff0c;变化的频率不会很高&#xff0c;如果还采用动态输出的方式进行处理…

二叉树删除节点+思路分析

思路分析 代码实现 ![在这里插入代码片](https://img-blog.csdnimg.cn/20210325193201194.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NzgzNjYw,size_16,color_FFFFFF,t_70)

sql mysql 命令计算年龄 格式化日期

命令计算年龄 <if test"query.startAge ! null" >and <![CDATA[ timestampdiff(year, substring(u.idno, 7, 8), now()) > startAge ]]></if>select timestampdiff(year, substring(110101199309228395, 7, 8), now());SELECT DATE_FORMAT(N…

比较正宗的验证邮箱的正则表达式js代码详解

转载自 比较正宗的验证邮箱的正则表达式js代码详解 邮箱正则最正宗的一条正则语句是^[a-z0-9]([._\\-]*[a-z0-9])*([a-z0-9][-a-z0-9]*[a-z0-9].){1,63}[a-z0-9]$ 下面我们来讲解一下 fuchangxi的正则&#xff1a; /^([a-zA-Z0-9_-])([a-zA-Z0-9_-])(.[a-zA-Z0-9_-])/ 开…

ddm模型公式_简单判断目前行情——从股利贴现模型切入

本文目录&#xff1a;1.介绍股利贴现模型&#xff1b;2.以贵州茅台为例根据现有情况估计模型内部各参数&#xff1b;3.得出结论&#xff1b;一、股利贴现模型&#xff08;DDM&#xff09;我们知道给一项资产定价最朴素的想法是将它未来产生的所有现金流以一定的贴现率贴现至当前…

sh(Spring+Spring mvc+hibernate)——IDeptDao.java

/** * Title: IDeptDao.java * Package org.dao * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-11-21 上午9:42:32 * version V1.0 */ package org.dao;import java.util.List;import org.entity.Dept;/** * * …

解决Html5用canvas绘制不出来图片的问题

转载自 解决Html5用canvas绘制不出来图片的问题 如果使用html5的ctx.drawImage(img,0,0);绘制不出来&#xff0c; 就改为&#xff1a;img.onload function(){ctx.drawImage(img,0,0);} 只有img 加载完了&#xff0c;你画它才有意义。

Hutool 日期时间工具-DateUtil使用

java中获取当月1号零时零分的时间 /*** 获得当月1号零时零分零秒* return*/ public Date initDateByMonth(){Calendar calendar Calendar.getInstance();calendar.setTime(new Date());calendar.set(Calendar.DAY_OF_MONTH, 1);calendar.set(Calendar.HOUR_OF_DAY, 0);calenda…

顺序存储二叉树

package com.atguigu.tree;/*** 创建人 wdl* 创建时间 2021/3/25* 描述*/ public class ArrBinaryTreeDemo {public static void main(String[] args) {int[] arr{1,2,3,4,5,6,7};//创建一个ArrBinaryTreeArrBinaryTree arrBinaryTree new ArrBinaryTree(arr);arrBinaryTree.p…

分布式事务与一致性算法Paxos amp; raft amp; zab

1.CAP原理 要想数据高可用&#xff0c;就得写多份数据写多分数据就会导致数据一致性问题数据一致性问题会引起性能问题 2.一致性模型 弱一致性最终一致性&#xff08;一段时间达到一致性&#xff09;强一致 1、2 异步冗余&#xff1b;3是同步冗余 3. 扩展服务的方案 数据分区&…