javascript
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:
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是最好的办法吗的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HERO 25K 传感器:罗技 G502
- 下一篇: 传音控股 2023 年 Q3 营收 17