Apa cara paling efisien untuk mengkloning objek dalam javascript secara mendalam?

Apa cara paling efisien untuk mengkloning objek JavaScript? Saya telah melihat obj = eval(uneval(o)); tetapi yang tidak standar dan hanya didukung oleh Firefox .

Saya telah melakukan hal-hal seperti obj = JSON.parse(JSON.stringify(o)); , tetapi meragukan keefektifannya.

Saya juga melihat fungsi salin rekursif dengan berbagai kekurangan.

Saya terkejut bahwa tidak ada solusi kanonik.

4845
23 сент. ditetapkan oleh jschrab pada 23 September . 2008-09-23 19:26 '08 pada 19:26 2008-09-23 19:26
@ 69 jawaban
  • 1
  • 2
  • 3

Catatan: Ini adalah jawaban untuk jawaban lain, bukan jawaban yang benar untuk pertanyaan ini. Jika Anda ingin mengkloning objek dengan cepat, ikuti saran Corban dalam jawaban Anda untuk pertanyaan ini.


Saya ingin mencatat bahwa metode .clone() di jQuery hanya .clone() elemen DOM. Untuk mengkloning objek JavaScript, Anda harus:

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

Informasi lebih lanjut dapat ditemukan di dokumentasi jQuery .

Saya juga ingin menunjukkan bahwa salinan yang dalam sebenarnya jauh lebih pintar daripada yang ditunjukkan di atas - ini dapat menghindari banyak jebakan (misalnya, untuk memperluas elemen DOM secara mendalam). Ini sering digunakan dalam inti jQuery dan di plugin dengan efek luar biasa.

4203
23 сент. Balas diberikan oleh John Resig 23 Sep 2008-09-23 21:09 '08 pada jam 9:09 malam 2008-09-23 21:09

Lihatlah patokan ini: http://jsben.ch/#/bWfk9

Dalam tes saya sebelumnya, di mana kecepatan adalah masalah utama, saya menemukan

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

menjadi cara tercepat untuk mengkloning objek secara mendalam (melampaui jQuery.extend dengan flag yang dalam yang ditetapkan 10-20%).

jQuery.extend cukup cepat ketika flag nilai yang dalam disetel ke false (clone dangkal). Ini adalah pilihan yang baik, karena termasuk logika tambahan untuk pemeriksaan tipe dan tidak menyalin properti yang tidak terdefinisi, dll. Tetapi ini juga akan sedikit memperlambat Anda.

Jika Anda tahu struktur objek yang ingin Anda kloning atau Anda dapat menghindari array bersarang yang mendalam, Anda dapat menulis sederhana for (var я in obj) loop for (var я in obj) untuk mengkloning objek Anda, memeriksa hasOwnProperty dan itu akan jauh lebih cepat daripada jQuery.

Akhirnya, jika Anda mencoba untuk mengkloning struktur objek yang dikenal dalam loop panas, Anda bisa mendapatkan KINERJA LEBIH BANYAK LEBIH BANYAK hanya dengan memasukkan prosedur kloning dan secara manual membuat objek.

Mekanisme pelacakan JavaScript payah mengoptimalkan for..in loop dan memeriksa hasOwnProperty juga akan memperlambat Anda. Manual mengkloning ketika kecepatan adalah kebutuhan mutlak.

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

Berhati-hatilah dalam menggunakan metode JSON.parse(JSON.stringify(obj)) untuk objek Date - JSON.stringify(новая дата()) mengembalikan representasi string dari tanggal dalam format ISO di mana JSON.parse() tidak kembali ke objek Date . Lihat jawaban ini untuk lebih jelasnya .

Selain itu, perhatikan bahwa di Chrome 65, setidaknya, kloning asli tidak cocok. Menurut JSPerf ini , melakukan kloning sendiri dengan membuat fungsi baru hampir 800x lebih lambat daripada menggunakan JSON.stringify, yang melewati sangat cepat melalui seluruh papan.

2046
17 марта '11 в 22:19 2011-03-17 22:19 jawabannya diberikan oleh Corban Brook pada 17 Maret '11 di 10:19 PM 2011-03-17 22:19

Dengan asumsi bahwa Anda hanya memiliki variabel, dan bukan fungsi apa pun di objek Anda, Anda bisa menggunakan:

 var newObject = JSON.parse(JSON.stringify(oldObject)); 
431
04 янв. Jawaban diberikan oleh Sultan Shakir Jan 04 2011-01-04 11:05 '11 pada 11:05 2011-01-04 11:05

Kloning terstruktur

Standar HTML mencakup algoritma kloning / serialisasi terstruktur internal yang dapat membuat klon objek dalam. Ini masih terbatas pada tipe bawaan tertentu, tetapi selain beberapa jenis yang didukung oleh JSON, itu juga mendukung Tanggal, RegExps, Peta, Set, Blob, FileLists, ImageDatas, array jarang, Typed Array, dan mungkin lebih di masa depan. ., Ia juga menyimpan referensi dalam data kloning, yang memungkinkan Anda untuk mempertahankan struktur beru>

Dukungan di Node.js: eksperimental 🙂

Modul v8 di Node.js saat ini (pada Node 11) secara > , tetapi fungsi ini masih ditandai sebagai "eksperimental" dan dapat diubah atau dihapus di versi mendatang. Jika Anda menggunakan versi yang kompatibel, kloning objek semudah:

whatwg / html # 793 di GitHub .  Saat ini diusulkan untuk menggunakannya untuk sebagian besar tujuan hanya dengan: 

MessageChannels tunggal.  Port lain akan mengirim acara message dengan klon terstruktur dari data .data terlampir.  Sayangnya, mendengarkan acara-acara ini harus asinkron, dan alternatif sinkron kurang praktis. 

 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(); 

Penanganan sinkron: Mengerikan! 🤢

Tidak ada opsi yang baik untuk pembuatan klon terstruktur secara sinkron. Berikut adalah beberapa peretasan yang tidak praktis.

history.pushState() dan history.replaceState() membuat klon terstruktur dari argumen pertama mereka dan menetapkan nilai ini ke history.state . Anda dapat menggunakan ini untuk membuat klon terstruktur dari objek apa pun seperti ini:

Notification konstruktor membuat klon terstruktur dari data terkait.  Itu juga mencoba untuk menampilkan pemberitahuan di browser untuk pengguna, tetapi ini diam-diam akan berakhir dengan kesalahan jika Anda belum meminta izin untuk memberi tahu.  Jika Anda memiliki izin untuk tujuan lain, kami akan segera menutup pemberitahuan yang kami buat. 

306
06 июня '12 в 17:59 2012-06-06 17:59 jawabannya diberikan kepada Jeremy Banks 06 Juni 12 di 17:59 2012-06-06 17:59

Jika itu bukan bawaan, Anda dapat mencoba:

 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 сент. Balas diberikan oleh ConroyP 23 Sep 2008-09-23 19:38 '08 pada 19:38 2008-09-23 19:38

Cara efektif untuk mengkloning (bukan kloning dalam) suatu objek dalam satu baris kode

Metode Object.assign adalah bagian dari standar ECMAScript 2015 (ES6) dan melakukan apa yang Anda butuhkan.

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

Metode Object.assign () digunakan untuk menyalin nilai dari semua properti tepat yang disebutkan dari satu atau lebih objek sumber ke objek target.

Baca lebih lanjut ...

polyfill untuk mendukung browser lama:

 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 дек. Jawabannya diberikan oleh Eugene Tiurin 15 Des. 2015-12-15 10:26 '15 jam 10:26 2015-12-15 10:26

kode:

 // 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; } 

Tes:

 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 jawabannya diberikan oleh Kamarey pada 25 Juni 2009 di 10:53 2009-06-25 10:53

Inilah yang saya gunakan:

 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 дек. Jawabannya diberikan Alan 12 Des. 2009-12-12 01:47 '09 pada 1:47 2009-12-12 01:47

Kinerja copy mendalam: dari yang terbaik ke yang terburuk

  • Penugasan kembali "=" (array string, array numerik - hanya)
  • Slice (array string, array angka - hanya)
  • Concatenation (hanya array string, numeric array)
  • Fungsi kustom: untuk loop atau salinan rekursif
  • jQuery $ .extend
  • JSON.parse (hanya array string, array angka, array objek)
  • Underscore.js _.clone (hanya array string, array numerik)
  • Lo-Dash _.cloneDeep

Salin secara mendalam array string atau angka (satu tingkat - tanpa petunjuk):

Ketika array berisi angka dan string - fungsi seperti.slice (), Concat (),. Splice (), operator penugasan "=", dan fungsi klon Underscore.js; membuat salinan yang dalam dari elemen-elemen array.

Jika penugasan kembali memiliki kinerja tertinggi:

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

I.slice () memiliki kinerja yang lebih baik daripada .concat (), http://jsperf.com/duplicate-array-slice-vs-concat/3

 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 

Salin secara mendalam berbagai objek (dua level - pointer):

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

Tulis fungsi khusus (memiliki kinerja yang lebih baik daripada $ .extend () atau JSON.parse):

 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); 

Gunakan fungsi utilitas pihak ketiga:

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

Di mana jQuery $ .extend memiliki kinerja yang lebih baik:

71
18 сент. Jawabannya diberikan tfmontague 18 September . 2014-09-18 23:10 '14 pada 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 дек. jawabannya diberikan oleh Zibri pada tanggal 26 Desember. 2009-12-26 17:59 '09 pada 17:59 2009-12-26 17:59

Saya tahu ini adalah posting lama, tetapi saya pikir itu mungkin membantu seseorang tersandung.

Selama Anda tidak menetapkan objek ke sesuatu, itu tidak mempertahankan referensi dalam memori. Jadi, untuk membuat objek yang ingin Anda bagikan di antara objek-objek lain, Anda perlu membuat pabrik seperti ini:

 var a = function(){ return { father:'zacharias' }; }, b = a(), c = a(); c.father = 'johndoe'; alert(b.father); 
53
24 сент. jawaban diberikan oleh Joe 24 Sep. 2011-09-24 22:28 '11 pada 22:28 2011-09-24 22:28

Objek Cloning selalu menjadi masalah di JS, tapi itu semua sebelum ES6, saya daftar berbagai cara untuk menyalin objek di JavaScript di bawah ini, bayangkan Anda memiliki Obyek di bawah ini dan Anda ingin memiliki salinan yang dalam dari itu:

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

Ada beberapa cara untuk menyalin objek ini tanpa mengubah sumbernya:

1) ES5 + menggunakan fungsi sederhana untuk menyalin:

 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) ES5 + menggunakan JSON.parse dan JSON.stringify.

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

3) AngularJs:

 var deepCopyObj = angular.copy(obj); 

4) jQuery:

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

5) Garis BawahJs dan Loadash:

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

Semoga ini bisa membantu ...

52
03 апр. Jawabannya diberikan Alireza 03 Apr. 2017-04-03 18:37 '17 pada 6:37 siang 2017-04-03 18:37

Ada perpustakaan (disebut "clone") , yang membuatnya cukup bagus. Ini memberikan kloning / penyalinan rekursif paling lengkap dari objek sewenang-wenang yang saya ketahui. Ini juga mendukung tautan sirkuler yang belum tercakup oleh jawaban lain.

Anda dapat menemukannya di npm . Ini dapat digunakan untuk browser dan untuk Node.js.

Berikut ini adalah contoh cara menggunakannya:

Instal dengan

 npm install clone 

atau kemas dengan Ender .

 ender build clone [...] 

Anda juga dapat mengunduh kode sumber secara manual.

Kemudian Anda dapat menggunakannya dalam kode sumber Anda.

 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' } } 

(Penafian: Saya penulis perpustakaan.)

51
17 окт. jawabannya diberikan pvorb 17 Oktober. 2012-10-17 21:36 '12 pada 21:36 2012-10-17 21:36

Jika Anda menggunakannya, perpustakaan Underscore.js memiliki klon .

 var newObject = _.clone(oldObject); 
48
15 дек. jawabannya diberikan oleh itsadok 15 Desember. 2011-12-15 18:56 '11 pada 18:56 2011-12-15 18:56

Ini adalah versi ConroyP di atas, yang berfungsi meskipun perancang membutuhkan parameter:

 //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; } 

Fitur ini juga tersedia di perpustakaan simpleoo saya.

Edit:

Ini adalah versi yang lebih andal (terima kasih kepada Justin McCandles, sekarang mendukung referensi melingkar):

  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 нояб. Jawabannya diberikan oleh Matt Browne 11 nov. 2012-11-11 20:53 '12 pada jam 8:53 2012-11-11 20:53

Berikut ini membuat dua instance dari objek yang sama. Saya menemukannya dan menggunakannya sekarang. Ini sederhana dan mudah digunakan.

 var objToCreate = JSON.parse(JSON.stringify(cloneThis)); 
31
21 авг. Balas diberikan oleh nathan rogers 21 Agu 2015-08-21 18:51 '15 pada 18:51 2015-08-21 18:51

Menyalin objek dalam javascript (saya pikir yang terbaik dan termudah)

1. Menggunakan JSON.parse (JSON.stringify (objek));

 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. Menggunakan metode yang dibuat

 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. Menggunakan Lo-Dash _.cloneDeep link lodash

 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. Menggunakan Object.assign ()

 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 } 

TAPI SALAH SAAT

 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. Menggunakan tautan Underscore.js _.clone 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 } 

TAPI SALAH SAAT

 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.) 

Tautan medium.com

JSBEN.CH Play Benchmarking Performance 1 ~ 3 http://jsben.ch/KVQLd 2019

08 авг. jawabannya diberikan TinhNQ 08 Agustus. 2018-08-08 11:17 '18 pada 11:17 ; 2018-08-08 11:17

Lodash memiliki metode _ yang baik . cloneDeep (nilai) :

 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 jawabannya diberikan oleh opensas pada 22 Juni '13 pada 18:03 2013-06-22 18:03

Crockford menyarankan (dan saya lebih suka) untuk menggunakan fitur ini:

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

Ini pendek, berfungsi seperti yang diharapkan, dan Anda tidak perlu perpustakaan.


EDIT:

Ini adalah polyfill untuk Object.create , jadi Anda juga bisa menggunakannya.

 var newObject = Object.create(oldObject); 

CATATAN . Jika Anda menggunakan beberapa dari mereka, Anda mungkin memiliki masalah dengan beberapa iterasi, yang menggunakan hasOwnProperty . Karena create menciptakan objek kosong baru yang mewarisi objek oldObject Tetapi masih berguna dan praktis untuk objek kloning.

Misalnya, jika oldObject.a = 5;

 newObject.a; // is 5 

a

 oldObject.hasOwnProperty(a); // is true newObject.hasOwnProperty(a); // is false 
23
06 окт. balasan yang diberikan oleh Chris Broski 06 Okt 2010-10-06 18:08 '10 pada 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 сент. Balas diberikan oleh Mark Cidade pada 23 Sep 2008-09-23 19:45 '08 pada 19:45 2008-09-23 19:45

Salinan satu baris salinan dangkal ( ECMAScript 5th edition ):

 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 

Однострочная и мелкая копия ( ECMAScript 6th edition , 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
ответ дан Maël Nison 05 июля '12 в 0:44 2012-07-05 00:44

Просто потому, что я не видел AngularJS и думал, что люди захотят узнать...

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

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