转载自   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 };   //根据开发模式选择使用或不使用,可取消

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

  1. js如何复制一个对象

    方法一:把原来对象的属性遍历一遍,赋给一个新对象 //深复制对象方法 var cloneObj = function (obj) {var newObj = {};if (obj instanceof ...

  2. js 深复制一个对象

    自定义 cloneObj 方法 //深复制对象 var cloneObj = function (obj) {var newObj = {};if (obj instanceof Array) {ne ...

  3. ajax 传字符串到后台,JSON.stringify()将JSON对象转换为字符串通过Ajax传入到后台处理...

    搜索热词 最近在做一个小小的功能模块,前台有很多的数据需要传入到后台,前台页面设计如下: 看起来不是很清楚,总之表单中的数据都要提交到后台进行处理,然后插入到数据库,而且是一起提交到后台的,实现的方法 ...

  4. JSON.stringify和JSON.parse之间的区别

    本文翻译自:Difference between JSON.stringify and JSON.parse I have been confused over when to use these t ...

  5. javascript 数组和对象的浅复制和深度复制 assign/slice/concat/JSON.parse(JSON.stringify())...

    javascript 数组和对象的浅度复制和深度复制 在平常我们用 '='来用一个变量引用一个数组或对象,这里是'引用'而不是复制下面我们看一个例子引用和复制是什么概念 var arr=[1,2,3, ...

  6. JS如何深度复制对象和数组,避免指针变量引用修改值

    //自定义深度复制对象or数组的递归方法---------------------------------------- let copyObjOrArr = o => {let isArray ...

  7. js如何生成一个对象,并转化为json字符串

    js如何生成一个对象,并转化为json字符串,很多人都会误写为: var ary = []; var obj = {}; for (var i = 0; i < 3; i++) {obj.nam ...

  8. JSON Stringify示例–如何使用JS解析JSON对象

    There are so many programming languages, and every language has its own features. But all of them ha ...

  9. (转)JS之——解决IE6、7、8使用JSON.stringify报JSON未定义错误的问题

    https://blog.csdn.net/l1028386804/article/details/53439755 在通过JavaScript将对象类型的参数通过JSON.stringify转换成字 ...

最新文章

  1. mysql乐观锁总结和实践
  2. 【风之语】至贱城市之苏州
  3. Windows10看视频出现蓝屏重启
  4. html和xhtml和html5一些区别和笔记
  5. python2转python3代码_python2代码批量转为python3代码
  6. python语言中with as的用法使用详解
  7. OpenCV:分离图像和视频的RGB通道
  8. mysql old key files_mysql出现“Incorrect key file for table”解决办法
  9. python中通过pip安装套件
  10. 理解纯CSS画三角形
  11. 【计算机网络】ACL工作原理及标准
  12. App installation failed (A valid provisioning profile for this executable was not found)
  13. Photon Release 4.8.0汉化(附图教程)
  14. Storm系列(十三)架构分析之Worker-维护ZMQ连接
  15. 培训机构毕业的程序员被歧视的背后逻辑
  16. 汇总报表与合并报表之如何汇总报表
  17. 关于mis系统思维导图
  18. 新蓝天羽网体育用品商店
  19. springboot大学校园网上图书馆信息管理系统的设计与实现小程序毕业设计源码091535
  20. 【VS开发】error C2220: 警告被视为错误 - 没有生成“object”文件

热门文章

  1. 7-17 汉诺塔的非递归实现 (25 分)(思路分析)
  2. LeetCode 257二叉树的所有路径-简单
  3. python中类变量的访问方式_在Python中,如何访问类方法中的“静态”类变量
  4. bufferedimage生成的图片模糊_Kaptcha图片验证码工具
  5. word List 15
  6. 如何维持手机电池寿命_延长手机电池寿命终极技巧教学,iPhone和安卓手机皆适合...
  7. Java如何解决乱码问题
  8. cf1555B. Two Tables
  9. cf1526E. Oolimry and Suffix Array(未解决)
  10. Codeforces Round #716 (Div. 2)