Javascript'te bir nesneyi derinden klonlamanın en etkili yolu nedir?

Bir JavaScript nesnesini klonlamanın en etkili yolu nedir? obj = eval(uneval(o)); ancak standart değildir ve yalnızca Firefox tarafından desteklenir .

obj = JSON.parse(JSON.stringify(o)); gibi şeyler yaptım obj = JSON.parse(JSON.stringify(o)); , ancak etkinliği şüphe.

Ayrıca özyinelemeli kopya fonksiyonlarını çeşitli kusurlarla gördüm.

Kanonik bir çözüm olmadığına şaşırdım.

4845
23 сент. jschrab tarafından 23 Eylül’de ayarlandı . 2008-09-23 19:26 '08, 07:26, 2008-09-23 19:26
@ 69 cevaplar
  • 1
  • 2
  • 3

Not: Bu, başka bir cevabın cevabıdır, bu sorunun cevabı değil. Nesneleri hızlı bir şekilde klonlamak istiyorsanız, lütfen bu soruya cevabınızda Corban'ın tavsiyelerine uyun.


.clone() yönteminin yalnızca DOM öğelerini .clone() not etmek istiyorum. JavaScript nesnelerini klonlamak için şunları yapmalısınız:

 // Shallow copy var newObject = jQuery.extend({}, oldObject); // Deep copy var newObject = jQuery.extend(true, {}, oldObject); 

Daha fazla bilgi jQuery belgelerinde bulunabilir .

Ayrıca derin bir kopyanın yukarıda gösterilenden çok daha akıllı olduğunu da belirtmek isterim - birçok tuzaktan kaçınabilir (örneğin, DOM öğesini derinlemesine genişletmek için). Genellikle jQuery çekirdeğinde ve eklentileri büyük etkisi olan kullanılır.

4203
23 сент. Tarafından cevap John Resig 23 Eyl 2008-09-23 21:09 '08, 09:09, 2008-09-23 21:09

Bu kritere göz atın: http://jsben.ch/#/bWfk9

Hızımın asıl sorun olduğu önceki testlerimde keşfettim

<Prev> <code> JSON.parse (JSON.stringify (OBJ)) Kodu>

Bir nesneyi derinden klonlamanın en hızlı yolu olmak ( jQuery.extend'i % 10-20 ile ayarlanan derin bayrakla aşıyor ).

jQuery.extend, derin değer bayrağı false (sığ klon) olarak ayarlandığında oldukça hızlıdır. Bu, tip kontrolü için ek bir mantık içerdiğinden ve tanımsız vb. Özelliklerin üzerine kopyalamadığından iyi bir seçenektir. Fakat aynı zamanda sizi biraz yavaşlatır.

Klonlamaya çalıştığınız nesnelerin yapısını biliyorsanız veya derin iç içe dizilerden kaçınabilirseniz, nesnenizi klonlamak için basit bir döngü yazabilir, hasOwnProperty öğesini kontrol edebilirsiniz ve jQuery'den çok daha hızlı olacaktır.

border=0

Son olarak, bilinen bir nesne yapısını sıcak bir döngüde klonlamaya çalışıyorsanız, klonlama prosedürünü ekleyerek ve nesneyi elle oluşturarak ÇOK DAHA FAZLA PERFORMANS elde edebilirsiniz.

JavaScript izleme mekanizmaları döngüler için optimizasyon yapmakta ve hasOwnProperty'i kontrol etmek sizi yavaşlatır. Hız mutlak bir zorunluluk olduğunda manuel klonlama.

  var clonedObject = { knownProp: obj.knownProp,.. } Код> 

Date nesneleri için JSON.parse(JSON.stringify(obj)) yöntemini JSON.parse(JSON.stringify(obj)) kullanmaya dikkat edin - JSON.stringify(новая дата()) , JSON.parse() Date nesnesine geri dönmediği ISO biçiminde bir dize gösterimi döndürür. Daha fazla ayrıntı için bu cevaba bakınız .

Ek olarak, Chrome 65'te en azından yerel klonlamanın uygun olmadığını unutmayın. Bu JSPerf'e göre, yeni bir işlev oluşturarak kendi klonlamanızı yapmak, tüm pano boyunca inanılmaz derecede hızlı geçen JSON.stringify'ı kullanmaktan neredeyse 800 kat daha yavaştır.

2046
17 марта '11 в 22:19 2011-03-17 22:19 Cevap Corban Brook tarafından 17 '11 Mart tarihinde 10:19 de verilmiştir 2011-03-17 22:19

Yalnızca değişkenlere sahip olduğunuzu ve nesnenizdeki herhangi bir işlevi olmadığını varsayarak, aşağıdakileri kullanabilirsiniz:

 var newObject = JSON.parse(JSON.stringify(oldObject)); 
431
04 янв. Cevap Sultan Shakir tarafından yazılmıştır Ocak 04 2011-01-04 11:05 '11 11:05 2011-01-04 11:05

Yapısal klonlama

HTML standardı, derin nesneler klonları oluşturabilen dahili bir yapılandırılmış klonlama / serileştirme algoritması içerir. Hala bazı yerleşik türlerle sınırlıdır, ancak JSON tarafından desteklenen çeşitli türlere ek olarak, Tarihler, RegExps, Haritalar, Kümeler, Bloblar, Dosya Listeleri, ImageDatas, seyrek diziler, Yazılı Diziler ve muhtemelen gelecekte daha fazlasını da destekler. ., Ayrıca JSON için hatalara neden olabilecek döngüsel ve özyinelemeli yapıları korumanıza izin veren klonlanmış verilerdeki referansları da depolar.

Node.js desteği: deneysel 🙂

Şu anda Node.js'deki v8 modülü (Düğüm 11'den itibaren) doğrudan yapılandırılmış bir serileştirme API'si sağlar , ancak bu işlevsellik hala “deneysel” olarak işaretlenmiştir ve gelecekteki sürümlerde değiştirilebilir veya kaldırılabilir. Uyumlu bir sürüm kullanıyorsanız, bir nesneyi klonlamak:

structdClone structuredClone() GitHub'da whatwg / html # 793'te tartışılmıştır.  Şu anda onu en çok amaç için kullanmak gibi: 

MessageChannels bağlantı noktası üzerinden yayınlamaktır.  Diğer port, ekli veri .data yapılandırılmış bir klonuyla bir message olayı gönderir.  Ne yazık ki, bu olayları dinlemek mutlaka eşzamansızdır ve eşzamanlı alternatifler daha az pratiktir. 

 const main = async () => { const original = { date: new Date(), number: Math.random() }; original.self = original; const clone = await structuredCloneAsync(original); // They're different objects: console.assert(original !== clone); console.assert(original.date !== clone.date); // They're cyclical: console.assert(original.self === original); console.assert(clone.self === clone); // They contain equivalent values: console.assert(original.number === clone.number); console.assert(Number(original.date) === Number(clone.date)); console.log("Assertions complete."); }; main(); 

Eşzamanlı geçici çözümler: Korkunç! 🤢

Yapısal klonların senkronize oluşturulması için iyi bir seçenek yoktur. İşte bunun yerine birkaç pratik saldırı.

history.pushState() ve history.replaceState() , ilk argümanlarının yapılandırılmış bir klonunu oluşturur ve bu değeri history.state öğesine atar. Bunu, bunun gibi herhangi bir nesnenin yapılandırılmış bir klonunu oluşturmak için kullanabilirsiniz:

Notification yapıcısı, ilişkili verilerinin yapılandırılmış bir klonunu oluşturur.  Ayrıca, kullanıcı için tarayıcıda bir bildirim görüntülemeye çalışır, ancak bildirmek için izin istemediyseniz bu sessizce bir hata ile bitecektir.  Başka amaçlarla izniniz varsa, oluşturduğumuz bildirimi derhal kapatırız. 

306
06 июня '12 в 17:59 2012-06-06 17:59 Cevap Jeremy Banks'e 06 Haziran 12'de 17: 59'da verilmiştir 2012-06-06 17:59

Yerleşik değilse, deneyebilirsiniz:

 function clone(obj) { if (obj === null || typeof (obj) !== 'object' || 'isActiveClone' in obj) return obj; if (obj instanceof Date) var temp = new obj.constructor(); //or new Date(obj); else var temp = obj.constructor(); for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { obj['isActiveClone'] = null; temp[key] = clone(obj[key]); delete obj['isActiveClone']; } } return temp; } 
294
23 сент. Yanıt veren ConroyP 23 Eyl 2008-09-23 19:38 '08, 07:38, 2008-09-23 19:38

Bir nesneyi tek bir kod satırında klonlamanın etkili bir yolu (derin klonlama değil)

Object.assign yöntemi ECMAScript 2015 (ES6) standardının bir parçasıdır ve tam olarak ihtiyacınız olanı yapar.

 var clone = Object.assign({}, obj); 

Object.assign () yöntemi, numaralandırılan tüm uygun özelliklerin değerlerini bir veya daha fazla kaynak nesneden hedef nesneye kopyalamak için kullanılır.

Devamını oku ...

eski tarayıcıları desteklemek için polyfill :

 if (!Object.assign) { Object.defineProperty(Object, 'assign', { enumerable: false, configurable: true, writable: true, value: function(target) { 'use strict'; if (target === undefined || target === null) { throw new TypeError('Cannot convert first argument to object'); } var to = Object(target); for (var i = 1; i < arguments.length; i++) { var nextSource = arguments[i]; if (nextSource === undefined || nextSource === null) { continue; } nextSource = Object(nextSource); var keysArray = Object.keys(nextSource); for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) { var nextKey = keysArray[nextIndex]; var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); if (desc !== undefined  desc.enumerable) { to[nextKey] = nextSource[nextKey]; } } } return to; } }); } 
148
15 дек. Cevap Eugene Tiurin 15 Aralık tarafından verildi 2015-12-15 10:26 '15, 10:26, 2015-12-15, 10:26

kod:

 // extends 'from' object with members from 'to'. If 'to' is null, a deep clone of 'from' is returned function extend(from, to) { if (from == null || typeof from != "object") return from; if (from.constructor != Object  from.constructor != Array) return from; if (from.constructor == Date || from.constructor == RegExp || from.constructor == Function || from.constructor == String || from.constructor == Number || from.constructor == Boolean) return new from.constructor(from); to = to || new from.constructor(); for (var name in from) { to[name] = typeof to[name] == "undefined" ? extend(from[name], null) : to[name]; } return to; } 

Test:

 var obj = { date: new Date(), func: function(q) { return 1 + q; }, num: 123, text: "asdasd", array: [1, "asd"], regex: new RegExp(/aaa/i), subobj: { num: 234, text: "asdsaD" } } var clone = extend(obj); 
94
25 июня '09 в 10:53 2009-06-25 10:53 Cevap 25 Haziran 099 'da 10:53 de Kamarey tarafından verildi 2009-06-25 10:53

Kullandığım şey bu:

 function cloneObject(obj) { var clone = {}; for(var i in obj) { if(typeof(obj[i])=="object"  obj[i] != null) clone[i] = cloneObject(obj[i]); else clone[i] = obj[i]; } return clone; } 
86
12 дек. Cevap 12 Aralık'ta Alan tarafından verildi . 2009-12-12 01:47 '09, 1:47 2009-12-12 01:47

Derin kopya performansı: en iyiden en kötüye

  • Yeniden atama "=" (dize dizileri, sayısal diziler - yalnızca)
  • Dilim (dize dizileri, sayı dizileri - yalnızca)
  • Birleştirme (yalnızca dizeler, sayısal diziler)
  • Özel fonksiyon: for-loop veya özyinelemeli kopya
  • jQuery $ .extend
  • JSON.parse (yalnızca dize dizileri, sayı dizileri, nesne dizileri)
  • Underscore.js _.clone (yalnızca dize dizileri, sayısal diziler)
  • Lo-Dash Instagram Hesabındaki Resim ve Videoları _.cloneDeep

Bir dizi dizgiyi veya sayıları derinden kopyalayın (bir seviye - işaretçi yok):

Bir dizi sayılar ve dizeler içerdiğinde - slice (),. Concat (),. Splice () gibi işlevler, atama operatörü "=" ve klon işlevi Underscore.js; dizi elemanlarının derin bir kopyasını alın.

Yeniden atama en yüksek performansa sahipse:

 var arr1 = ['a', 'b', 'c']; var arr2 = arr1; arr1 = ['a', 'b', 'c']; 

I.slice () .concat (), http://jsperf.com/duplicate-array-slice-vs-concat/3 den daha iyi bir performansa sahiptir

 var arr1 = ['a', 'b', 'c']; // Becomes arr1 = ['a', 'b', 'c'] var arr2a = arr1.slice(0); // Becomes arr2a = ['a', 'b', 'c'] - deep copy var arr2b = arr1.concat(); // Becomes arr2b = ['a', 'b', 'c'] - deep copy 

Bir dizi nesneyi derinden kopyalayın (iki veya daha fazla seviye - işaretçiler):

 var arr1 = [{object:'a'}, {object:'b'}]; 

Özel bir işlev yazın ($ .extend () veya JSON.parse'den daha iyi performansa sahip):

 function copy(o) { var out, v, key; out = Array.isArray(o) ? [] : {}; for (key in o) { v = o[key]; out[key] = (typeof v === "object"  v !== null) ? copy(v) : v; } return out; } copy(arr1); 

Üçüncü taraf yardımcı program işlevlerini kullanın:

 $.extend(true, [], arr1); // Jquery Extend JSON.parse(arr1); _.cloneDeep(arr1); // Lo-dash 

JQuery $ .extend uygulamasının daha iyi performans gösterdiği yerler:

71
18 сент. Cevap 18 tfmontague verilir . 2014-09-18 23:10 '14 23:10 2014-09-18 23:10
 var clone = function() { var newObj = (this instanceof Array) ? [] : {}; for (var i in this) { if (this[i]  typeof this[i] == "object") { newObj[i] = this[i].clone(); } else { newObj[i] = this[i]; } } return newObj; }; Object.defineProperty( Object.prototype, "clone", {value: clone, enumerable: false}); 
60
26 дек. Cevap 26 Aralık'ta Zibri tarafından verildi . 2009-12-26 17:59 '09, 17:59 2009-12-26 17:59

Bunun eski bir yazı olduğunu biliyorum, ancak tökezleyen birine yardım edebileceğini düşündüm.

Bir şeyi bir nesneye atamadığınız sürece, bellekte bir referans tutmaz. Bu nedenle, diğer nesnelerle paylaşmak istediğiniz bir nesne oluşturmak için, şöyle bir fabrika oluşturmanız gerekir:

 var a = function(){ return { father:'zacharias' }; }, b = a(), c = a(); c.father = 'johndoe'; alert(b.father); 
53
24 сент. Tarafından cevap Joe 24 Eylül. 2011-09-24 22:28 '11 22:28 2011-09-24 22:28

Nesne Cloning JS'de her zaman bir endişe kaynağı olmuştur, ancak hepsi ES6'dan önceydi, aşağıda bir JavaScript'i kopyalamak için çeşitli yollar listeliyorum, aşağıda bir Nesne'ye sahip olduğunuzu ve bunun derin bir kopyasına sahip olmak istediğinizi hayal edin:

 var obj = {a:1, b:2, c:3, d:4}; 

Kaynağı değiştirmeden bu nesneyi kopyalamanın birkaç yolu vardır:

1) ES5 + kopyalamak için basit bir işlev kullanarak:

 function deepCopyObj(obj) { if (null == obj || "object" != typeof obj) return obj; if (obj instanceof Date) { var copy = new Date(); copy.setTime(obj.getTime()); return copy; } if (obj instanceof Array) { var copy = []; for (var i = 0, len = obj.length; i < len; i++) { copy[i] = cloneSO(obj[i]); } return copy; } if (obj instanceof Object) { var copy = {}; for (var attr in obj) { if (obj.hasOwnProperty(attr)) copy[attr] = cloneSO(obj[attr]); } return copy; } throw new Error("Unable to copy obj this object."); } 

2) JSON.parse ve JSON.stringify kullanarak ES5 +.

 var deepCopyObj = JSON.parse(JSON.stringify(obj)); 

3) AçısalJ'ler:

 var deepCopyObj = angular.copy(obj); 

4) jQuery:

 var deepCopyObj = jQuery.extend(true, {}, obj); 

5) Alt çizgi ve Loadash:

 var deepCopyObj = _.cloneDeep(obj); //latest version UndescoreJs makes shallow copy 

Umarım bu yardım ...

52
03 апр. Cevap Alireza 03 Nisan 2017-04-03 18:37 '17, 18:37, 2017-04-03 18:37

Orada oldukça iyi kılan bir kütüphane ("klon") . Tanıdığım rastgele nesnelerin en kapsamlı özyinelemeli klonlamasını / kopyalanmasını sağlar. Ayrıca henüz diğer cevapların kapsamadığı dairesel bağlantıları da destekliyor.

Npm'de bulabilirsiniz . Hem tarayıcı hem de Node.js. için kullanılabilir.

İşte nasıl kullanılacağına bir örnek:

Yükleyin

 npm install clone 

veya Ender ile paketleyin.

 ender build clone [...] 

Kaynak kodunu manuel olarak da indirebilirsiniz.

Ardından kaynak kodunuzda kullanabilirsiniz.

 var clone = require('clone'); var a = { foo: { bar: 'baz' } }; // inital value of a var b = clone(a); // clone a -> b a.foo.bar = 'foo'; // change a console.log(a); // { foo: { bar: 'foo' } } console.log(b); // { foo: { bar: 'baz' } } 

(Feragatname: Kütüphanenin yazarıyım.)

51
17 окт. cevabı 17 ekim pvorb verilir . 2012-10-17 21:36 '12 21:36 2012-10-17 21:36

Kullanırsanız , Underscore.js kütüphanesinin bir klonu vardır .

 var newObject = _.clone(oldObject); 
48
15 дек. Cevap 15 Aralık'ta adadok tarafından verildi . 2011-12-15 18:56 '11, 18:56 2011-12-15 18:56

Tasarımcı, parametre gerektirse bile çalışan, yukarıdaki ConroyP sürümü:

 //If Object.create isn't already defined, we just do the simple shim, //without the second argument, since that all we need here var object_create = Object.create; if (typeof object_create !== 'function') { object_create = function(o) { function F() {} F.prototype = o; return new F(); }; } function deepCopy(obj) { if(obj == null || typeof(obj) !== 'object'){ return obj; } //make sure the returned object has the same prototype as the original var ret = object_create(obj.constructor.prototype); for(var key in obj){ ret[key] = deepCopy(obj[key]); } return ret; } 

Bu özellik benim basit kitaplığımda da mevcuttur.

Düzenleme:

İşte daha güvenilir bir sürüm (Justin McCandles sayesinde, şimdi dairesel referansları destekliyor):

  function deepCopy(src,  _visited, _copiesVisited) { if(src === null || typeof(src) !== 'object'){ return src; } //Honor native/custom clone methods if(typeof src.clone == 'function'){ return src.clone(true); } //Special cases: //Date if(src instanceof Date){ return new Date(src.getTime()); } //RegExp if(src instanceof RegExp){ return new RegExp(src); } //DOM Element if(src.nodeType  typeof src.cloneNode == 'function'){ return src.cloneNode(true); } // Initialize the visited objects arrays if needed. // This is used to detect cyclic references. if (_visited === undefined){ _visited = []; _copiesVisited = []; } // Check if this object has already been visited var i, len = _visited.length; for (i = 0; i < len; i++) { // If so, get the copy we already made if (src === _visited[i]) { return _copiesVisited[i]; } } //Array if (Object.prototype.toString.call(src) == '[object Array]') { //[].slice() by itself would soft clone var ret = src.slice(); //add it to the visited array _visited.push(src); _copiesVisited.push(ret); var i = ret.length; while (i--) { ret[i] = deepCopy(ret[i], _visited, _copiesVisited); } return ret; } //If we've reached here, we have a regular object //make sure the returned object has the same prototype as the original var proto = (Object.getPrototypeOf ? Object.getPrototypeOf(src): src.__proto__); if (!proto) { proto = src.constructor.prototype; //this line would probably only be reached by very old browsers } var dest = object_create(proto); //add this object to the visited array _visited.push(src); _copiesVisited.push(dest); for (var key in src) { //Note: this does NOT preserve ES5 property attributes like 'writable', 'enumerable', etc. //For an example of how this could be modified to do so, see the singleMixin() function dest[key] = deepCopy(src[key], _visited, _copiesVisited); } return dest; } //If Object.create isn't already defined, we just do the simple shim, //without the second argument, since that all we need here var object_create = Object.create; if (typeof object_create !== 'function') { object_create = function(o) { function F() {} F.prototype = o; return new F(); }; } 
36
11 нояб. Cevap Matt Browne 11 Kasım tarafından verildi . 2012-11-11 20:53 '12, 20:53, 2012-11-11 20:53

Aşağıdaki, aynı nesnenin iki örneğini oluşturur. Onu buldum ve şimdi kullandım. Basit ve kullanımı kolaydır.

 var objToCreate = JSON.parse(JSON.stringify(cloneThis)); 
31
21 авг. Cevapla nathan rogers 21 Ağu 2015-08-21 18:51 '15, 18:51 2015-08-21 18:51

Javascript'te derin cisimler kopyalamak (bence en iyisi ve en kolayı)

1. JSON.parse (JSON.stringify (object)) kullanarak;

 var obj = { a: 1, b: { c: 2 } } var newObj = JSON.parse(JSON.stringify(obj)); obj.bc = 20; console.log(obj); // { a: 1, b: { c: 20 } } console.log(newObj); // { a: 1, b: { c: 2 } } 

2. Oluşturulan yöntemi kullanmak

 function cloneObject(obj) { var clone = {}; for(var i in obj) { if(obj[i] != null  typeof(obj[i])=="object") clone[i] = cloneObject(obj[i]); else clone[i] = obj[i]; } return clone; } var obj = { a: 1, b: { c: 2 } } var newObj = cloneObject(obj); obj.bc = 20; console.log(obj); // { a: 1, b: { c: 20 } } console.log(newObj); // { a: 1, b: { c: 2 } } 

3. Lo-Dash _.cloneDeep link lodash'ın kullanılması

 var obj = { a: 1, b: { c: 2 } } var newObj = _.cloneDeep(obj); obj.bc = 20; console.log(obj); // { a: 1, b: { c: 20 } } console.log(newObj); // { a: 1, b: { c: 2 } } 

4. Object.assign () kullanarak

 var obj = { a: 1, b: 2 } var newObj = _.clone(obj); obj.b = 20; console.log(obj); // { a: 1, b: 20 } console.log(newObj); // { a: 1, b: 2 } 

AMA YANLIŞ YANLIŞ

 var obj = { a: 1, b: { c: 2 } } var newObj = Object.assign({}, obj); obj.bc = 20; console.log(obj); // { a: 1, b: { c: 20 } } console.log(newObj); // { a: 1, b: { c: 20 } } --> WRONG // Note: Properties on the prototype chain and non-enumerable properties cannot be copied. 

5. Underscore.js _.clone bağlantısını kullanma Underscore.js

 var obj = { a: 1, b: 2 } var newObj = _.clone(obj); obj.b = 20; console.log(obj); // { a: 1, b: 20 } console.log(newObj); // { a: 1, b: 2 } 

AMA YANLIŞ YANLIŞ

 var obj = { a: 1, b: { c: 2 } } var newObj = _.cloneDeep(obj); obj.bc = 20; console.log(obj); // { a: 1, b: { c: 20 } } console.log(newObj); // { a: 1, b: { c: 20 } } --> WRONG // (Create a shallow-copied clone of the provided plain object. Any nested objects or arrays will be copied by reference, not duplicated.) 

Bağlantı orta.com

JSBEN.CH Performans Karşılaştırma Oyun Parkı 1 ~ 3 http://jsben.ch/KVQLd 2019

08 авг. Cevap TinhNQ 08 Ağustos verilmiştir . 2018-08-08 11:17 '18, 11:17 ; 2018-08-08 11:17

Lodash'ın iyi bir _ yöntemi vardır . cloneDeep (değer) :

 var objects = [{ 'a': 1 }, { 'b': 2 }]; var deep = _.cloneDeep(objects); console.log(deep[0] === objects[0]); // => false 
23
22 июня '13 в 18:03 2013-06-22 18:03 Cevap opensas tarafından 22 Haziran 13'te 18:03 2013-06-22 18:03 tarihinde verilmiştir.

Crockford bu özelliği kullanmanızı önerir (ve ben tercih ederim):

 function object(o) { function F() {} F.prototype = o; return new F(); } var newObject = object(oldObject); 

Kısa, beklendiği gibi çalışıyor ve bir kütüphaneye ihtiyacınız yok.


DÜZENLEME:

Bu, Object.create için bir polyfill, yani onu da kullanabilirsiniz.

 var newObject = Object.create(oldObject); 

NOT. . Bunlardan bazılarını kullanırsanız, hasOwnProperty kullanan bazı yinelemelerde sorun olabilir. Çünkü create , oldObject devralan yeni bir boş nesne oluşturur. Ancak nesneleri klonlamak için hala kullanışlı ve pratiktir.

Örneğin, eğer oldObject.a = 5;

 newObject.a; // is 5 

ve

 oldObject.hasOwnProperty(a); // is true newObject.hasOwnProperty(a); // is false 
23
06 окт. Cevap Chris Broski 06 Ekim 2010-10-06 18:08 '10, 18:08 2010-10-06 18:08
 function clone(obj) { var clone = {}; clone.prototype = obj.prototype; for (property in obj) clone[property] = obj[property]; return clone; } 
22
23 сент. 23 Eylül tarihinde Mark Cidade tarafından verilen cevap 2008-09-23 19:45 '08, 07:45, 2008-09-23 19:45

Sığ kopyanın tek satır kopyası ( ECMAScript 5. baskı ):

 var origin = { foo : {} }; var copy = Object.keys(origin).reduce(function(c,k){c[k]=origin[k];return c;},{}); console.log(origin, copy); console.log(origin == copy); // false console.log(origin.foo == copy.foo); // true 

Tek ve küçük nüsha ( ECMAScript 6. baskı , 2015):

 var origin = { foo : {} }; var copy = Object.assign({}, origin); console.log(origin, copy); console.log(origin == copy); // false console.log(origin.foo == copy.foo); // true 
20
05 июля '12 в 0:44 2012-07-05 00:44 Cevap maël nison tarafından 05 Temmuz 12'de 0:44 2012-07-05 00:44 tarihinde verilmiştir.

Sadece AngularJS'i görmedim ve insanların bilmek isteyeceğini düşündüm ...

angular.copy также предоставляет метод глубокого копирования объектов и массивов.

17
ответ дан Dan Atkinson 14 мая '16 в 1:16 2016-05-14 01:16