Кой е най-ефективният начин за дълбоко клониране на обект в javascript?

Кой е най-ефективният начин да клонирате JavaScript обект? Аз съм виждал obj = eval(uneval(o)); но това е нестандартно и се поддържа само от Firefox .

Направих неща като obj = JSON.parse(JSON.stringify(o)); , но се съмнявам в ефективността.

Видях и рекурсивните функции на копирането с различни недостатъци.

Изненадан съм, че няма канонично решение.

4845
23 сент. настроен от jschrab на 23 сеп . 2008-09-23 19:26 '08 в 19:26 2008-09-23 19:26
@ 69 отговора
  • 1
  • 2
  • 3

Забележка: Това е отговорът на друг отговор, а не правилния отговор на този въпрос. Ако искате бързо да клонирате обекти, моля, следвайте съветите на Corban в отговора си на този въпрос.


Искам да отбележа, че .clone() методът в jQuery само клонира DOM елементи. За да клонирате JavaScript обекти, трябва:

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

Повече информация можете да намерите в документацията на jQuery .

Също така искам да посоча, че дълбокото копие всъщност е много по-умно от показаното по-горе - може да се избегнат много капани (например, за да се разшири дълбоко DOM елемент). Често се използва в ядрото jQuery и в плъгините с голям ефект.

4203
23 сент. Отговор, даден от John Resig 23 септември 2008-09-23 21:09 '08 в 21:09 2008-09-23 21:09

Вижте този бенчмарк: http://jsben.ch/#/bWfk9

В предишните си тестове, където скоростта беше основният проблем, открих

<Prev> <code> JSON.parse (Код JSON.stringify (OBJ))>

да бъде най-бързият начин за дълбоко клониране на обект (той надминава jQuery.extend с набор от дълбоки флагове от 10-20%).

jQuery.extend е доста бърз, когато знамето за дълбоки стойности е зададено на false (плитък клон). Това е добър вариант, тъй като включва допълнителна логика за проверка на типа и не копира свойствата на undefined и т.н. Но също така ще ви забави малко.

Ако знаете структурата на обектите, които се опитвате да клонирате или можете да избягвате дълбоки вложени масиви, можете да напишете прост for (var я in obj) цикъл for (var я in obj) да клонирате обекта, като проверите hasOwnProperty и ще бъде много по-бързо от jQuery.

border=0

И накрая, ако се опитвате да клонирате известна структура от обекти в горещ цикъл, можете да получите много по-голяма производителност, като просто вкарате процедурата за клониране и ръчно създавате обекта.

JavaScript механизмите за проследяване засмукват оптимизацията за for..in цикли и проверка на hasOwnProperty също ще ви забави. Ръчно клониране, когато скоростта е абсолютна необходимост.

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

Пазете се от използването на метода JSON.parse(JSON.stringify(obj)) за Date objects - JSON.stringify(новая дата()) връща символно представяне на датата в ISO формат, в който JSON.parse() не се връща към обекта Date . Вижте този отговор за повече подробности .

В допълнение, имайте предвид, че поне в хром 65, естественото клониране не е подходящо. Според този JSPerf , правенето на собствено клониране чрез създаване на нова функция е почти 800x по-бавно от използването на JSON.stringify, което преминава невероятно бързо през цялата платка.

2046
17 марта '11 в 22:19 2011-03-17 22:19 отговорът е даден от Corban Brook на 17 март 2009 г. в 22:19 ч. 2011-03-17 22:19

Ако приемем, че имате само променливи, а не никакви функции в обекта, можете просто да използвате:

 var newObject = JSON.parse(JSON.stringify(oldObject)); 
431
04 янв. Отговорът е даден от Султан Шакир 04 януари 2011-01-04 11:05 '11 в 11:05 2011-01-04 11:05

Структурирано клониране

Стандартът HTML включва вътрешен структуриран алгоритъм за клониране / сериализация, който може да създаде дълбоки клонове на обекти. Той все още е ограничен до някои вградени типове, но в допълнение към няколко типа, поддържани от JSON, той също поддържа Dates, RegExps, Maps, комплекти, Blobs, FileLists, ImageDatas, разредени масиви, Typed Arrays и вероятно повече в бъдеще. Също така съхранява референции в клонираните данни, което ви позволява да поддържате циклични и рекурсивни структури, които могат да причинят грешки за JSON.

Поддръжка в Node.js: experimental

Модулът v8 в Node.js в момента (от Node 11) директно осигурява структуриран API за сериализация , но тази функционалност все още е маркирана като „експериментална“ и може да бъде променена или премахната в бъдещите версии. Ако използвате съвместима версия, клонирането на обект е просто:

structdClone structuredClone() обсъдена в whatwg / html # 793 на GitHub .  Понастоящем се предлага да се използва за повечето цели, просто като: 

MessageChannels .  Другият порт ще изпрати message събитие със структуриран клонинг на прикачени данни.  За съжаление слушането на тези събития е непременно асинхронно, а синхронните алтернативи са по-малко практични. 

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

Синхронни заобикалки: Ужасно! 🤢

Няма добри възможности за синхронно създаване на структурирани клонове. Ето няколко непрактични хакове вместо това.

history.pushState() и history.replaceState() създават структуриран клон на първия им аргумент и присвояват тази стойност на history.state . Можете да използвате това, за да създадете структуриран клонинг на всеки обект като този:

Notification създава структуриран клон на свързаните с него данни.  Той също така се опитва да покаже известие в браузъра за потребителя, но това ще приключи с грешка, ако не сте поискали разрешение за уведомяване.  Ако имате разрешение за други цели, ние незабавно ще затворим съобщението, което сме създали. 

306
06 июня '12 в 17:59 2012-06-06 17:59 отговорът е даден на Jeremy Banks юни 06 '12 в 17:59 2012-06-06 17:59

Ако не е вградена, можете да опитате:

 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 сент. Отговор, даден от ConroyP 23 септември 2008-09-23 19:38 '08 в 19:38 ч. 2008-09-23 19:38

Ефективен начин за клониране (без дълбоко клониране) на обект в един ред код

Методът Object.assign е част от стандарта ECMAScript 2015 (ES6) и прави точно това, от което се нуждаете.

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

Методът Object.assign () се използва за копиране на стойностите на всички enumerable частни свойства от един или повече изходни обекти към целевия обект.

Прочетете повече ...

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 дек. Отговорът е даден от Юджийн Тиурин 15 декември. 2015-12-15 10:26 '15 в 10:26 ч . 2015-12-15 10:26

код:

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

тест:

 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 отговорът е даден от Kamarey на 25.06.09 в 10:53 2009-06-25 10:53

Ето какво използвам:

 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 дек. Отговорът е даден от Алън на 12 декември. 2009-12-12 01:47 '09 в 1:47 2009-12-12 01:47

Дълбоко копиране: от най-доброто до най-лошото

  • Препращане "=" (низови масиви, числови масиви - само)
  • Срез (низови масиви, масиви от числа)
  • Съгласуване (само масиви от низове, числови масиви)
  • Персонализирана функция: за цикъл или рекурсивно копие
  • jQuery $ .extend
  • JSON.parse (само низови масиви, масиви от числа, масиви от обекти)
  • Underscore.js _.clone (само низови масиви, числови масиви)
  • Lo-Dash _.cloneDeep

Копирайте дълбоко масив от низове или числа (едно ниво - без указатели):

Когато масивът съдържа числа и низове - функции като .slice (), Concat (), .place (), операторът на присвояване "=" и функцията за клониране Underscore.js; направете дълбоко копие на елементите на масива.

Ако преназначаването има най-висока ефективност:

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

I.slice () има по-добра производителност от .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 

Копирайте дълбоко масив от обекти (две или повече нива - указатели):

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

Напишете персонализирана функция (има по-добра ефективност от $ .extend () или 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); 

Използване на функции за помощ от трети страни:

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

Където jQuery $ .extend има по-добра производителност:

71
18 сент. Отговорът е даден на 18 септември . 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 дек. отговорът е даден от Зибри на 26 декември. 2009-12-26 17:59 '09 в 17:59 2009-12-26 17:59

Знам, че това е стара поща, но мислех, че може да помогне на някой, който се препъва.

Докато не присвоявате нещо на нещо, то не поддържа референция в паметта. По този начин, за да създадете обект, който искате да споделите с други обекти, трябва да създадете фабрика по следния начин:

 var a = function(){ return { father:'zacharias' }; }, b = a(), c = a(); c.father = 'johndoe'; alert(b.father); 
53
24 сент. отговор, даден от Joe 24 Sep. 2011-09-24 22:28 '11 в 22:28 2011-09-24 22:28

Cloning обект винаги е било въпрос на загриженост в JS, но всичко това е било преди ES6, аз изброявам различни начини за копиране на обект в JavaScript по-долу, представете си, че имате обект по-долу и искате да имате дълбоко копие от това:

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

Има няколко начина да копирате този обект, без да променяте източника:

1) ES5 + използва проста функция за копиране:

 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 + с използване на JSON.parse и 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 и Loadash:

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

Надявам се това да помогне ...

52
03 апр. Отговорът е даден Alireza 03 Apr. 2017-04-03 18:37 '17 в 18:37 часа 2017-04-03 18:37

Там има библиотека (наречена "клон") , което я прави доста добра. Той осигурява най-пълното рекурсивно клониране / копиране на произволни обекти, за които знам. Той също така поддържа циркулярни връзки, които все още не са обхванати от други отговори.

Можете да го намерите на npm . Може да се използва както за браузъра, така и за Node.js.

Ето пример как да го използвате:

Инсталирайте го с

 npm install clone 

или го опаковайте с Ендър .

 ender build clone [...] 

Можете също така ръчно да изтеглите изходния код.

След това можете да го използвате във вашия изходен код.

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

(Опровержение: аз съм автор на библиотеката.)

51
17 окт. отговорът е даден pvorb 17 oct. 2012-10-17 21:36 '12 в 21:36 2012-10-17 21:36

Ако го използвате, библиотеката Underscore.js има клонинг .

 var newObject = _.clone(oldObject); 
48
15 дек. отговорът е даден от техния 15 декември. 2011-12-15 18:56 '11 в 18:56 2011-12-15 18:56

Ето горната версия на ConroyP, която работи дори ако дизайнерът изисква параметри:

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

Тази функция е достъпна и в моята библиотека на simpleoo .

Edit:

Ето по-надеждна версия (благодарение на Джъстин Макендълс, сега тя поддържа циркулярни препратки):

  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 нояб. Отговорът е даден от Мат Браун 11 ноември. 2012-11-11 20:53 '12 в 8:53 pm 2012-11-11 20:53

Следното създава два копия на един и същ обект. Намерих го и го използвам сега. Тя е проста и лесна за използване.

 var objToCreate = JSON.parse(JSON.stringify(cloneThis)); 
31
21 авг. Отговор, даден от nathan rogers 21 август 2015-08-21 18:51 '15 в 18:51 2015-08-21 18:51

Дълбоко копиране на обекти в javascript (мисля, че най-доброто и най-лесно)

1. Използване на JSON.parse (JSON.stringify (object));

 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. Използване на създадения метод

 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 връзка 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 ()

 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 } 

НО ВРЪЗКА

 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 връзка 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 } 

НО ВРЪЗКА

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

Link media.com

JSBEN.CH Детска площадка за бенчмаркинг за изпълнение 1 ~ 3 http://jsben.ch/KVQLd 2019

08 авг. отговорът е даден TinhNQ 08 авг. 2018-08-08 11:17 '18 в 11:17 ; 2018-08-08 11:17

Lodash има добър метод . cloneDeep (стойност) :

 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 Отговорът се дава от opensas на 22 юни'13 в 18:03 2013-06-22 18:03

Crockford предлага (а аз предпочитам) да използва тази функция:

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

Тя е кратка, работи както се очаква и не се нуждаете от библиотека.


EDIT:

Това е Object.create за Object.create , така че можете да го използвате.

 var newObject = Object.create(oldObject); 

ЗАБЕЛЕЖКА. , Ако използвате някои от тях, може да имате проблеми с някаква итерация, която използва hasOwnProperty . Защото create създава нов празен обект, който наследява oldObject . Но тя все още е полезна и практична за клониране на обекти.

Например, ако oldObject.a = 5;

 newObject.a; // is 5 

и

 oldObject.hasOwnProperty(a); // is true newObject.hasOwnProperty(a); // is false 
23
06 окт. отговор, даден от Chris Broski Окт 06 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 септември 2008-09-23 19:45 '08 в 19:45 2008-09-23 19:45

Еднолинейно копие на плитко копие ( ECMAScript 5-то издание ):

 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 6-то издание , 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 отговорът е даден от maël nison на 05 юли 2012 г. в 12:44 ч. 2012-07-05 00:44

Само защото не видях AngularJS и мислех, че хората ще искат да знаят ...

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

17
14 мая '16 в 1:16 2016-05-14 01:16 отговорът е даден на Дан Аткинсън на 14 май'16 в 1:16 2016-05-14 01:16

Изглежда, че няма идеален оператор за дълбоко клониране на обекти от типа масив. Как видно из приведенного ниже кода, клонирующий JQuery John Resig превращает массивы с нечисловыми свойствами в объекты, которые не являются массивами, а клонирование RegDwight JSON отбрасывает нечисловые свойства. Следующие тесты иллюстрируют эти моменты в нескольких браузерах:

 function jQueryClone(obj) { return jQuery.extend(true, {}, obj) } function JSONClone(obj) { return JSON.parse(JSON.stringify(obj)) } var arrayLikeObj = [[1, "a", "b"], [2, "b", "a"]]; arrayLikeObj.names = ["m", "n", "o"]; var JSONCopy = JSONClone(arrayLikeObj); var jQueryCopy = jQueryClone(arrayLikeObj); alert("Is arrayLikeObj an array instance?" + (arrayLikeObj instanceof Array) + "\nIs the jQueryClone an array instance? " + (jQueryCopy instanceof Array) + "\nWhat are the arrayLikeObj names? " + arrayLikeObj.names + "\nAnd what are the JSONClone names? " + JSONCopy.names) 
16
ответ дан Page Notes 17 окт. '10 в 7:01 2010-10-17 07:01