Koks yra efektyviausias būdas giliai klonuoti objektą javascript'e?

Koks yra efektyviausias „JavaScript“ objekto klonavimo būdas? Aš mačiau obj = eval(uneval(o)); bet kuri yra nestandartinė ir palaikoma tik „Firefox“ .

Aš padariau tokius dalykus kaip obj = JSON.parse(JSON.stringify(o)); , bet abejojate veiksmingumu.

Taip pat regėjau rekursinius kopijavimo funkcijas su įvairiais trūkumais.

Esu nustebęs, kad nėra kanoninio sprendimo.

4845
23 сент. Jschrab nustatė 23 sep . 2008-09-23 19:26 '08, 19:26 pm 2008-09-23 19:26
@ 69 atsakymų
  • 1
  • 2
  • 3

Pastaba: tai yra atsakymas į kitą atsakymą, o ne į teisingą atsakymą į šį klausimą. Jei norite greitai klonuoti objektus, atsakykite į šį klausimą, laikydamiesi Corban patarimų .


Noriu pažymėti, kad .clone() metodas jQuery tik klonuoja DOM elementus. Jei norite klonuoti „JavaScript“ objektus, turite:

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

Daugiau informacijos rasite jQuery dokumentacijoje .

Taip pat noriu pabrėžti, kad gilus egzempliorius iš tikrųjų yra daug protingesnis nei pirmiau parodyta - jis gali išvengti daugelio spąstų (pavyzdžiui, giliai išplėsti DOM elementą). Jis dažnai naudojamas „jQuery“ šerdyje ir įskiepiuose su dideliu efektu.

4203
23 сент. John Resig atsakymas rugsėjo 23 d 2008-09-23 21:09 '08 at 9:09 pm 2008-09-23 21:09

Peržiūrėkite šį etaloną: http://jsben.ch/#/bWfk9

Mano ankstesniuose bandymuose, kur greitis buvo pagrindinė problema, atradau

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

būti greičiausias būdas giliai klonuoti objektą (jis viršija jQuery.extend su gilia vėliava 10-20%).

jQuery.extend yra gana greitas, kai gilios vertės vėliava yra nustatyta kaip klaidinga (sekli klonas). Tai yra geras pasirinkimas, nes jame yra papildomos logikos, skirtos tipo tikrinimui ir nenukopijuojamos į neapibrėžtų ir tt ypatybių.

Jei žinote objektų, kuriuos bandote klonuoti, struktūrą arba galite išvengti gilių įdėtų masyvų, galite parašyti paprastą kilpą for (var я in obj) kad klonuotumėte savo objektą, patikrinkite hasOwnProperty ir jis bus daug greitesnis nei jQuery.

border=0

Galiausiai, jei bandote klonuoti žinomą objekto struktūrą karštoje linijoje, galite gauti DAUGIAU DAUGIAU VEIKSMINGUMĄ, paprasčiausiai įterpdami klonavimo procedūrą ir rankiniu būdu sukuriant objektą.

„JavaScript“ stebėjimo mechanizmai čiulpia optimizuojant „ for..in kilpas “ir tikrinant, ar„ IsOwnProperty “taip pat sulėtės. Rankinis klonas, kai greitis yra būtinas.

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

Saugokitės, kad naudodami JSON.parse(JSON.stringify(obj)) metodą JSON.parse(JSON.stringify(obj)) , Date objektams - JSON.stringify(новая дата()) grąžina dienos formato JSON.parse() ISO formatu, kuriame JSON.parse() negrįžta į Date objektą. Daugiau informacijos rasite šiame atsakyme .

Be to, atkreipkite dėmesį, kad „Chrome 65“ bent jau vietinis klonavimas netinka. Pagal šį JSPerf , savo klonavimo atlikimas , sukuriant naują funkciją, yra beveik 800 kartų mažesnis nei naudojant JSON.stringify, kuris per visą lentą eina neįtikėtinai greitai.

2046 m
17 марта '11 в 22:19 2011-03-17 22:19 atsakymą pateikė „ Corban Brook “ kovo 11 d. 11 val. 2011-03-17 22:19

Darant prielaidą, kad turite tik kintamųjų, o ne bet kokias jūsų objekto funkcijas, galite naudoti:

 var newObject = JSON.parse(JSON.stringify(oldObject)); 
431
04 янв. Atsakymą pateikė Sultan Shakir 04 sausis 2011-01-04 11:05 '11, 11:05, 2011-01-04 11:05

Struktūrinis klonavimas

HTML standartas apima vidinį struktūrinį klonavimo / serializacijos algoritmą, kuris gali sukurti gilius objektų klonus. Jis vis dar apsiriboja tam tikrais integruotais tipais, tačiau, be kelių JSON palaikomų tipų, jis taip pat palaiko datą, „RegExps“, „Žemėlapius“, „rinkinius“, „BLOB“, „FileList“, „ImageDatas“, „retas masyvus“, „Typed Arrays“ ir galbūt daugiau. ., Čia taip pat saugomos nuorodos į klonuotus duomenis, leidžiančius išlaikyti ciklines ir rekursines struktūras, kurios gali sukelti klaidų JSON.

Palaikymas „Node.js“: eksperimentinis 🙂

v8 modulis, esantis „Node.js“ šiuo metu (kaip „Node 11“), tiesiogiai suteikia struktūrizuotą serializavimo API , tačiau ši funkcija vis dar pažymima kaip „eksperimentinė“ ir gali būti pakeista ar pašalinta būsimose versijose. Jei naudojate suderinamą versiją, objekto klonavimas yra toks paprastas kaip:

structdClone structuredClone() aptarta programoje whatwg / html # 793 „GitHub“ .  Šiuo metu siūloma jį naudoti daugeliu tikslų: 

MessageChannels“ prievadą.  Kitas uostas atsiųs message įvykį su struktūrizuotu pridedamų duomenų klonu .data .  Deja, šių įvykių klausymasis būtinai yra asinchroninis, o sinchroninės alternatyvos yra mažiau praktiškos. 

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

Sinchroninės problemos: baisus! 🤢

Nėra gerų parinkčių sinchroniniam struktūruotų klonų kūrimui. Čia yra keli nepraktiški hacks.

history.pushState() ir history.replaceState() sukuria struktūrizuotą savo pirmojo argumento kloną ir priskiria šią vertę history.state . Tai galite naudoti norėdami sukurti struktūrizuotą bet kurio tokio pobūdžio kloną:

Notification konstruktorius sukuria struktūrizuotą susijusių duomenų kloną.  Jis taip pat bando naudotojui naršyklėje rodyti pranešimą, tačiau tai tyliai baigsis klaida, jei neprašėte leidimo pranešti.  Jei turite leidimą kitiems tikslams, nedelsdami uždarysime sukurtą pranešimą. 

306
06 июня '12 в 17:59 2012-06-06 17:59 atsakymas pateiktas Jeremy Banks birželio 12 d. 12 val. 17:59 2012-06-06 17:59

Jei jis nebuvo pastatytas, galite pabandyti:

 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 сент. Atsakymas, kurį pateikė ConroyP Sep 23 2008-09-23 19:38 '08, 07:38 pm 2008-09-23 19:38

Efektyvus būdas klonuoti (ne giliai klonuoti) objektą vienoje kodo eilutėje

Object.assign metodas yra „ECMAScript 2015“ (ES6) standarto dalis ir daro būtent tai, ko jums reikia.

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

„Object.assign“ () metodas naudojamas visų išvardytų tinkamų savybių reikšmėms kopijuoti iš vieno ar kelių šaltinio objektų į tikslinį objektą.

Skaityti daugiau ...

polifilis, skirtas palaikyti senesnes naršykles:

 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 дек. Atsakymą pateikė Eugene Tiurin 15 d. 2015-12-15 10:26 '15, 10:26 AM 2015-12-15 10:26

kodas:

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

Bandymas:

 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 atsakymą Kamarey pateikė birželio 25 d. , 09:53 , 2009-06-25 10:53

Štai ką aš naudoju:

 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 дек. Atsakymas pateikiamas Alan 12 d. 2009-12-12 01:47 '09 ne 1:47 2009-12-12 01:47

Giliai kopijuojama: nuo geriausio iki blogiausio

  • Perdavimas „=“ (tik eilutės, skaitmeninės matricos)
  • Skiltelė (tik eilutės, skaičiavimo matricos)
  • Koncentracija (tik stygos, skaitmeninės matricos)
  • Pasirinktinė funkcija: kilpinė arba rekursinė kopija
  • jQuery $ .extend
  • JSON.parse (tik styginių matricos, skaičių numeriai, objektų masyvai)
  • Underscore.js _.clone (tik eilutės, skaitmeninės matricos)
  • Lo-Dash _.cloneDeep

Kopijuoti giliai eilutes ar skaičius (vienas lygis - be nuorodų):

Kai masyvas yra skaičiai ir eilutės - funkcijos, pvz., .Slice (), Concat (), splice (), priskyrimo operatorius "=" ir klonavimo funkcija Underscore.js; padaryti gilias masyvo elementų kopijas.

Jei pakartotinis paskyrimas turi didžiausią našumą:

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

I.slice () turi geresnį našumą nei .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 

Kopijuoti giliai objektų masyvą (du ar daugiau lygių - rodyklės):

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

Parašykite pasirinktinę funkciją (turi geresnį našumą nei $ .extend () arba 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); 

Naudokite trečiosios šalies naudingumo funkcijas:

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

Kur jQuery $ .extend turi geresnį našumą:

71
18 сент. Atsakymas suteikiamas 18 sepam . 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 дек. atsakymą Zibri pateikė 26 d. 2009-12-26 17:59 '09 17:59 2009-12-26 17:59

Žinau, kad tai yra senas pranešimas, bet maniau, kad tai gali padėti kažkam suklupti.

Tol, kol nenurodysite objekto kažkam, jis nepalieka atminties nuorodos. Taigi, norėdami sukurti objektą, kurį norite bendrinti tarp kitų objektų, turite sukurti tokį gamyklą:

 var a = function(){ return { father:'zacharias' }; }, b = a(), c = a(); c.father = 'johndoe'; alert(b.father); 
53
24 сент. atsakymą pateikė Joe . 2011-09-24 22:28 '11, 22:28, 2011-09-24 22:28

Cloning objektas JS visuomet buvo susirūpinęs, tačiau viskas buvo prieš ES6, aš išvardijau įvairius būdus, kaip nukopijuoti objektą žemiau esančiame „JavaScript“, įsivaizduokite, kad turite žemiau esantį objektą ir norite turėti gilias šio egzemplioriaus kopijas:

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

Yra keli būdai, kaip šį objektą nukopijuoti nekeičiant šaltinio:

1) ES5 + naudojant paprastą funkciją kopijuoti:

 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 + naudojant JSON.parse ir 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) UnderscoreJs ir Loadash:

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

Tikiuosi, kad ši pagalba ...

52
03 апр. Atsakymas pateikiamas Alireza 03 Bal. 2017-04-03 18:37 '17 at 6:37 pm 2017-04-03 18:37

Čia yra biblioteka (vadinama „klonu“) , todėl ji gana gera. Jis suteikia pilniausią rekursinį klonavimą / kopijavimą savavališkiems objektams, apie kuriuos aš žinau. Jis taip pat remia aplinkraščius, kurie dar nėra įtraukti į kitus atsakymus.

galite rasti „npm“ . Jis gali būti naudojamas tiek naršyklėje, tiek Node.js.

Čia pateikiamas pavyzdys, kaip jį naudoti:

Įdiekite ją su

 npm install clone 

arba pakuokite jį „ Ender“ .

 ender build clone [...] 

Pradinį kodą taip pat galite atsisiųsti rankiniu būdu.

Tada galite jį naudoti savo pradiniame kode.

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

(Atsakomybės apribojimas: aš bibliotekos autorius.)

51
17 окт. atsakymas yra suteiktas pvorb 17 okt. 2012-10-17 21:36 '12 21:36 val. 2012-10-17 21:36

Jei naudojate, bibliotekoje „ Underscore.js “ yra klonas .

 var newObject = _.clone(oldObject); 
48
15 дек. atsakymas pateiktas 15 d. 2011-12-15 18:56 '11, 18:56, 2011-12-15 18:56

Čia yra aukščiau pateikta „ConroyP“ versija, kuri veikia net jei dizaineris reikalauja parametrų:

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

Ši funkcija taip pat prieinama mano paprastojoje bibliotekoje.

Redaguoti:

Čia yra patikimesnė versija (dėka Justin McCandles, dabar ji palaiko aplinkraščius):

  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 нояб. Atsakymą pateikė Matt Browne 11 nov. 2012-11-11 20:53 '12 8:53 val. 2012-11-11 20:53

Toliau pateikiami du to paties objekto atvejai. Radau jį ir naudoju jį dabar. Tai paprasta ir paprasta naudoti.

 var objToCreate = JSON.parse(JSON.stringify(cloneThis)); 
31
21 авг. Nathan rogers atsakymas rugpjūčio 21 d 2015-08-21 18:51 '15 at 18:51 2015-08-21 18:51

Giliai kopijuojant objektus javascript'e (manau, kad tai geriausias ir lengviausias)

1. Naudojant JSON.parse (JSON.stringify (objektas));

 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. Naudojant sukurtą metodą

 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. Naudojant Lo-Dash _.cloneDeep nuorodą 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. „Object.assign“ () naudojimas

 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 } 

BUT WRONG WHEN

 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. Naudojant Underscore.js _.clone link 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 } 

BUT WRONG WHEN

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

Nuoroda medium.com

JSBEN.CH našumo lyginamoji analizė Žaidimų aikštelė 1 ~ 3 http://jsben.ch/KVQLd 2019

08 авг. atsakymas duotas TinhNQ 08 rug . 2018-08-08 11:17 '18, 11:17 ; 2018-08-08 11:17

Lodashas turi gerą metodą . cloneDeep (reikšmė) :

 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 atsakymą atidaro openas birželio 13 d. 18:03 2013-06-22 18:03

„Crockford“ siūlo (ir norėčiau) naudoti šią funkciją:

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

Tai trumpas, veikia taip, kaip tikėtasi, ir jums nereikia bibliotekos.


EDIT:

Tai „ Object.create , todėl galite jį naudoti.

 var newObject = Object.create(oldObject); 

PASTABA. . Jei naudojate kai kuriuos iš jų, gali kilti problemų su iteracija, kuri naudoja hasOwnProperty . Kadangi kūrimas sukuria naują tuščią objektą, kuris paveldi oldObject objektą. Tačiau jis vis dar naudingas ir praktiškas klonuojant objektus.

Pavyzdžiui, jei oldObject.a = 5;

 newObject.a; // is 5 

a

 oldObject.hasOwnProperty(a); // is true newObject.hasOwnProperty(a); // is false 
23
06 окт. Chris Broski atsakymas, 06 spalis 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 сент. Mark Cidade atsakymas, pateiktas rugsėjo 23 d 2008-09-23 19:45 '08 at 7:45 pm 2008-09-23 19:45

Vienos eilutės kopija ( ECMAScript 5-asis leidimas ):

 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 

Viena ir maža kopija ( ECMAScript 6-asis leidimas , 2015 m.):

 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 atsakymą pateikė „ maël nisonliepos 12 d. 12 val. 12:44 2012-07-05 00:44

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

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

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