सवाल जावास्क्रिप्ट में एक वस्तु गहरी क्लोन करने का सबसे प्रभावी तरीका क्या है?


जावास्क्रिप्ट ऑब्जेक्ट क्लोन करने का सबसे प्रभावी तरीका क्या है? मैंने देखा है obj = eval(uneval(o)); इस्तेमाल किया जा रहा है, लेकिन यह गैर मानक है और केवल फ़ायरफ़ॉक्स द्वारा समर्थित है

 मैंने चीजें की हैं obj = JSON.parse(JSON.stringify(o)); लेकिन दक्षता पर सवाल उठाओ।

 मैंने विभिन्न त्रुटियों के साथ रिकर्सिव कॉपीिंग फ़ंक्शंस भी देखा है।
मुझे आश्चर्य है कि कोई कैनोलिक समाधान मौजूद नहीं है।


4548
2018-06-06 14:59


मूल


Eval बुरा नहीं है। कमजोर eval का उपयोग करना है। यदि आप इसके साइड इफेक्ट्स से डरते हैं तो आप इसे गलत इस्तेमाल कर रहे हैं। आपके द्वारा डरने वाले साइड इफेक्ट्स इसका उपयोग करने के कारण हैं। क्या किसी ने वास्तव में आपके प्रश्न का उत्तर दिया था? - Prospero
क्लोनिंग ऑब्जेक्ट्स एक मुश्किल व्यवसाय है, खासकर मनमाने ढंग से संग्रह की कस्टम ऑब्जेक्ट्स के साथ। शायद यही कारण है कि ऐसा करने के लिए कोई रास्ता नहीं है। - b01
eval() आम तौर पर एक बुरा विचार है क्योंकि कई जावास्क्रिप्ट इंजन के ऑप्टिमाइज़र को सेट किए जाने वाले चर के साथ निपटने के दौरान बंद करना होगा eval। बस हो रहा है eval() आपके कोड में खराब प्रदर्शन हो सकता है। - user568458
के संभावित डुप्लिकेट जावास्क्रिप्ट ऑब्जेक्ट क्लोन करने का सबसे शानदार तरीका - John Slegers
क्लोनिंग ऑब्जेक्ट्स के सबसे आम प्रकारों के बीच प्रदर्शन तुलना यहां दी गई है: jsben.ch/#/t917Z - EscapeNetscape


जवाब:


ध्यान दें: यह किसी अन्य उत्तर का उत्तर है, इस सवाल का उचित जवाब नहीं। यदि आप तेजी से ऑब्जेक्ट क्लोनिंग करना चाहते हैं तो कृपया फ़ॉलो करें उनके उत्तर में कॉर्बान की सलाह इस सवाल के लिए।


मैं यह ध्यान रखना चाहता हूं कि .clone() विधि में jQuery केवल क्लोन डीओएम तत्व। जावास्क्रिप्ट ऑब्जेक्ट्स क्लोन करने के लिए, आप करेंगे:

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

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

अधिक जानकारी में पाया जा सकता है jQuery दस्तावेज

मैं यह भी ध्यान रखना चाहता हूं कि गहरी प्रति वास्तव में ऊपर दिखाए गए कार्यों की तुलना में बहुत अधिक स्मार्ट है - यह कई जाल से बचने में सक्षम है (उदाहरण के लिए, डीओएम तत्व को गहराई से बढ़ाने की कोशिश कर रहा है)। यह अक्सर jQuery कोर और प्लगइन में बहुत प्रभाव के लिए प्रयोग किया जाता है।


4067



जिन लोगों को एहसास नहीं हुआ, उनके लिए जॉन रेजिग का जवाब शायद एक तरह की प्रतिक्रिया / स्पष्टीकरण के रूप में किया गया था ConroyP का जवाब, सवाल के सीधा जवाब के बजाय। - S. Kirby
@ThiefMaster github.com/jquery/jquery/blob/master/src/core.js लाइन 276 पर (कुछ ऐसा कोड है जो कुछ और करता है लेकिन "जेएस में यह कैसे करें" के लिए कोड है :) - Rune FS
यहां रुचि रखने वाले किसी भी व्यक्ति के लिए jQuery गहरी प्रतिलिपि के पीछे जेएस कोड है: github.com/jquery/jquery/blob/master/src/core.js#L265-327 - Alex W
ओह! बस सुपर-स्पष्ट होने के लिए: कोई विचार नहीं कि यह प्रतिक्रिया सही उत्तर के रूप में क्यों चुनी गई थी, यह नीचे दिए गए उत्तरों का उत्तर था: stackoverflow.com/a/122190/6524 (जो सिफारिश कर रहा था .clone(), जो इस संदर्भ में उपयोग करने का सही कोड नहीं है)। दुर्भाग्य से यह प्रश्न इतने सारे संशोधनों से गुजर चुका है कि मूल चर्चा अब भी स्पष्ट नहीं है! यदि आप गति की परवाह करते हैं, तो कृपया कॉर्बान की सलाह का पालन करें और एक लूप लिखें या गुणों को सीधे एक नई वस्तु पर कॉपी करें। या अपने लिए यह परीक्षण करें! - John Resig
JQuery का उपयोग किये बिना यह कैसे करेगा? - Awesomeness01


इस बेंचमार्क को चेकआउट करें: http://jsben.ch/#/bWfk9

मेरे पिछले परीक्षणों में जहां गति एक मुख्य चिंता थी

JSON.parse(JSON.stringify(obj))

एक वस्तु को गहरे क्लोन करने का सबसे तेज़ तरीका होना (यह बाहर धड़कता है jQuery.extend गहरे झंडे के साथ 10-20% तक सही सेट)।

jQuery.extend बहुत तेज़ है जब गहरा ध्वज झूठा (उथला क्लोन) पर सेट होता है। यह एक अच्छा विकल्प है, क्योंकि इसमें टाइप प्रमाणीकरण के लिए कुछ अतिरिक्त तर्क शामिल हैं और अपरिभाषित गुणों आदि पर प्रतिलिपि नहीं है, लेकिन यह आपको थोड़ा धीमा कर देगा।

यदि आप उन वस्तुओं की संरचना को जानते हैं जिन्हें आप क्लोन करने की कोशिश कर रहे हैं या गहरे घोंसले वाले सरणी से बच सकते हैं तो आप एक साधारण लिख सकते हैं for (var i in obj) हैऑनप्रोपर्टी की जांच करते समय अपनी ऑब्जेक्ट क्लोन करने के लिए लूप और यह jQuery से बहुत तेज होगा।

आखिरकार यदि आप हॉट लूप में किसी ज्ञात ऑब्जेक्ट स्ट्रक्चर को क्लोन करने का प्रयास कर रहे हैं तो आप क्लोन प्रक्रिया को आसानी से अस्तर करके और ऑब्जेक्ट को मैन्युअल रूप से बनाकर बहुत अधिक लाभ प्राप्त कर सकते हैं।

जावास्क्रिप्ट ट्रेस इंजन अनुकूलित करने पर चूसना for..in लूप और जांच हैऑनप्रोपर्टी आपको भी धीमा कर देगी। गति पूर्ण होने पर मैन्युअल क्लोन।

var clonedObject = {
  knownProp: obj.knownProp,
  ..
}

का उपयोग सावधान रहें JSON.parse(JSON.stringify(obj)) विधि पर Date वस्तुओं - JSON.stringify(new Date()) आईएसओ प्रारूप में दिनांक की स्ट्रिंग प्रस्तुति देता है, जो JSON.parse()  नहीं है वापस एक में कनवर्ट करें Date वस्तु। अधिक जानकारी के लिए यह उत्तर देखें

इसके अतिरिक्त, कृपया ध्यान दें कि, क्रोम 65 में कम से कम, मूल क्लोनिंग जाने का तरीका नहीं है। इसके अनुसार यह जेएसपीआरएफ, एक नया समारोह बनाकर देशी क्लोनिंग प्रदर्शन लगभग है 800x JSON.stringify का उपयोग करने से धीमा है जो बोर्ड भर में अविश्वसनीय रूप से तेज़ है।


1877



@trysis Object.create वस्तु को क्लोन नहीं कर रहा है, प्रोटोटाइप ऑब्जेक्ट का उपयोग कर रहा है ... jsfiddle.net/rahpuser/yufzc1jt/2 - rahpuser
यह विधि भी हटा देगा keys अपने से object, जिन में हैं functions उनके मूल्य के रूप में, क्योंकि JSON कार्यों का समर्थन नहीं करता है। - Karlen Kishmiryan
यह भी ध्यान में रखें कि उपयोग करें JSON.parse(JSON.stringify(obj)) डेट ऑब्जेक्ट्स पर तारीख को वापस भी परिवर्तित कर दिया जाएगा यु.टी. सी में स्ट्रिंग प्रतिनिधित्व में ISO8601 प्रारूप। - dnlgmzddr
जेएसओएन दृष्टिकोण परिपत्र संदर्भों पर भी चोक करता है। - rich remer
@velop, Object.assign ({}, objToClone) ऐसा लगता है जैसे यह एक उथले क्लोन करता है - देव उपकरण कंसोल में चारों ओर खेलते समय इसका उपयोग करते हुए, ऑब्जेक्ट क्लोन अभी भी क्लोन ऑब्जेक्ट के संदर्भ की ओर इशारा करता है। तो मुझे नहीं लगता कि यह वास्तव में यहां लागू है। - Garrett Simpson


यह मानते हुए कि आपके पास केवल वेरिएबल हैं और आपके ऑब्जेक्ट में कोई फ़ंक्शन नहीं है, आप बस इसका उपयोग कर सकते हैं:

var newObject = JSON.parse(JSON.stringify(oldObject));

402



जैसा कि मैंने अभी पाया है, इस दृष्टिकोण की कॉन यह है कि यदि आपके ऑब्जेक्ट में कोई फ़ंक्शन है (मेरे पास आंतरिक गेटर्स और सेटर्स हैं) तो स्ट्रिंग किए जाने पर ये खो जाते हैं .. यदि आपको बस यह तरीका ठीक है तो यह ठीक है .. - Markive
@ जेसन, कारण यह विधि उथली प्रतिलिपि (एक गहरी वस्तु पर) से धीमी है, यह है कि परिभाषा के अनुसार, इस विधि, गहरी प्रतियां। लेकिन जबसे JSON मूल कोड (अधिकांश ब्राउज़रों में) में लागू किया गया है, यह किसी भी अन्य जावास्क्रिप्ट-आधारित गहरी प्रतिलिपि समाधान का उपयोग करने से काफी तेज होगा, और हो सकता है कभी कभी एक जावास्क्रिप्ट-आधारित उथली प्रतिलिपि तकनीक से तेज हो (देखें: jsperf.com/cloning-an-object/79)। - MiJyn
JSON.stringify({key: undefined}) //=> "{}" - Web_Designer
यह तकनीक भी सभी को नष्ट करने जा रही है Date ऑब्जेक्ट्स जो ऑब्जेक्ट के अंदर संग्रहीत हैं, उन्हें स्ट्रिंग फॉर्म में परिवर्तित कर रहा है। - fstab
यह जेएसओएन स्पेक का हिस्सा नहीं है जो कुछ भी कॉपी करने में असफल हो जाएगा (json.org) - cdmckay


संरचित क्लोनिंग

एचटीएमएल 5 परिभाषित करता है एक आंतरिक "संरचित" क्लोनिंग एल्गोरिदम जो वस्तुओं के गहरे क्लोन बना सकते हैं। यह अभी भी कुछ अंतर्निर्मित प्रकारों तक ही सीमित है, लेकिन जेएसओएन द्वारा समर्थित कुछ प्रकारों के अतिरिक्त यह तिथियां, RegExps, मानचित्र, समूह, ब्लॉब्स, फ़ाइललिस्ट, छवि डेटा, स्पैस Arrays का भी समर्थन करता है, टाइप की गई Arrays, और शायद भविष्य में और अधिक। यह क्लोन डेटा के संदर्भों को भी संरक्षित करता है, जिससे यह चक्रीय और पुनरावर्ती संरचनाओं का समर्थन करता है जो JSON के लिए त्रुटियों का कारण बनता है।

ब्राउज़रों में प्रत्यक्ष समर्थन: जल्द ही आ रहा है?

ब्राउज़र वर्तमान में संरचित क्लोनिंग एल्गोरिदम के लिए प्रत्यक्ष इंटरफ़ेस प्रदान नहीं करते हैं, बल्कि वैश्विक हैं structuredClone() समारोह में सक्रिय रूप से चर्चा की जा रही है गिटहब पर व्हाटवाग / एचटीएमएल # 793 और जल्द ही आ रहा है! वर्तमान में प्रस्तावित, अधिकांश उद्देश्यों के लिए इसका उपयोग करना उतना आसान होगा जितना:

const clone = structuredClone(original);

जब तक यह शिप नहीं किया जाता है, ब्राउज़र के संरचित क्लोन कार्यान्वयन केवल अप्रत्यक्ष रूप से उजागर होते हैं।

असीमित वर्कअराउंड: उपयोग योग्य।

मौजूदा एपीआई के साथ एक संरचित क्लोन बनाने के लिए निचले ओवरहेड तरीके डेटा के एक बंदरगाह के माध्यम से पोस्ट करना है MessageChannels। दूसरा बंदरगाह एक उत्सर्जित करेगा message संलग्न के संरचित क्लोन के साथ घटना .data। दुर्भाग्यवश, इन घटनाओं को सुनना आवश्यक रूप से असीमित है, और तुल्यकालिक विकल्प कम व्यावहारिक हैं।

class StructuredCloner {
  constructor() {
    this.pendingClones_ = new Map();
    this.nextKey_ = 0;

    const channel = new MessageChannel();
    this.inPort_ = channel.port1;
    this.outPort_ = channel.port2;

    this.outPort_.onmessage = ({data: {key, value}}) => {
      const resolve = this.pendingClones_.get(key);
      resolve(value);
      this.pendingClones_.delete(key);
    };
    this.outPort_.start();
  }

  cloneAsync(value) {
    return new Promise(resolve => {
      const key = this.nextKey_++;
      this.pendingClones_.set(key, resolve);
      this.inPort_.postMessage({key, value});
    });
  }
}

const structuredCloneAsync = window.structuredCloneAsync =
    StructuredCloner.prototype.cloneAsync.bind(new StructuredCloner);

उदाहरण का प्रयोग करें:

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। आप इस तरह किसी ऑब्जेक्ट के संरचित क्लोन बनाने के लिए इसका उपयोग कर सकते हैं:

const structuredClone = obj => {
  const oldState = history.state;
  history.replaceState(obj, null);
  const clonedObj = history.state;
  history.replaceState(oldState, null);
  return clonedObj;
};

उदाहरण का प्रयोग करें:

'use strict';

const main = () => {
  const original = { date: new Date(), number: Math.random() };
  original.self = original;

  const clone = structuredClone(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.");
};

const structuredClone = obj => {
  const oldState = history.state;
  history.replaceState(obj, null);
  const clonedObj = history.state;
  history.replaceState(oldState, null);
  return clonedObj;
};

main();

हालांकि तुल्यकालिक, यह बेहद धीमा हो सकता है। यह ब्राउजर इतिहास में हेरफेर करने के साथ जुड़े सभी ओवरहेड को घुमाता है। बार-बार इस विधि को कॉल करने से क्रोम अस्थायी रूप से अनुत्तरदायी हो सकता है।

Notification निर्माता अपने संबंधित डेटा के एक संरचित क्लोन बनाता है। यह उपयोगकर्ता को ब्राउज़र अधिसूचना प्रदर्शित करने का भी प्रयास करता है, लेकिन जब तक आपने अधिसूचना अनुमति का अनुरोध नहीं किया है, तो यह चुपचाप विफल हो जाएगा। यदि आपके पास अन्य उद्देश्यों की अनुमति है, तो हम तुरंत हमारे द्वारा बनाई गई अधिसूचना बंद कर देंगे।

const structuredClone = obj => {
  const n = new Notification('', {data: obj, silent: true});
  n.onshow = n.close.bind(n);
  return n.data;
};

उदाहरण का प्रयोग करें:

'use strict';

const main = () => {
  const original = { date: new Date(), number: Math.random() };
  original.self = original;

  const clone = structuredClone(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.");
};

const structuredClone = obj => {
  const n = new Notification('', {data: obj, silent: true});
  n.close();
  return n.data;
};

main();


274



@rynah मैंने बस फिर से spec के माध्यम से देखा और आप सही हैं: history.pushState() तथा history.replaceState() दोनों सिंक्रनाइज़ सेट सेट करें history.state उनके पहले तर्क के एक संरचित क्लोन के लिए। थोड़ा अजीब, लेकिन यह काम करता है। मैं अब अपना जवाब अपडेट कर रहा हूं। - Jeremy
यह इतना गलत है! वह एपीआई इस तरह इस्तेमाल नहीं किया जा रहा है। - Fardin
फ़ायरफ़ॉक्स में पुशस्टेट को लागू करने वाले व्यक्ति के रूप में, मुझे इस हैक पर गर्व और विद्रोह का एक अजीब मिश्रण लगता है। अच्छी तरह से किया दोस्तों। - Justin L.


यदि कोई अंतर्निहित नहीं था, तो आप कोशिश कर सकते हैं:

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


273



JQuery समाधान डीओएम तत्वों के लिए काम करेगा, लेकिन किसी भी वस्तु को नहीं। मुट्टूल की एक ही सीमा है। इच्छा है कि उनके पास किसी भी वस्तु के लिए एक सामान्य "क्लोन" था ... पुनरावर्ती समाधान किसी भी चीज़ के लिए काम करना चाहिए। यह शायद जाने का रास्ता है। - jschrab
यह कार्य टूट जाता है अगर क्लोन ऑब्जेक्ट में एक कन्स्ट्रक्टर होता है जिसके लिए पैरामीटर की आवश्यकता होती है। ऐसा लगता है कि हम इसे "var temp = new object ()" में बदल सकते हैं और यह हर मामले में काम कर सकता है, नहीं? - Andrew Arnott
एंड्रयू, यदि आप इसे var temp = new ऑब्जेक्ट () में बदलते हैं, तो आपके क्लोन में मूल ऑब्जेक्ट के समान प्रोटोटाइप नहीं होगा। उपयोग करने का प्रयास करें: 'var newProto = function () {}; newProto.prototype = obj.constructor; var temp = new newProto (); ' - limscoder
Limscoder के उत्तर के समान, कन्स्ट्रक्टर को कॉल किए बिना इसे कैसे करें, नीचे दिए गए मेरे उत्तर को देखें: stackoverflow.com/a/13333781/560114 - Matt Browne
उन वस्तुओं के लिए जिनमें उप-भागों (यानी, ऑब्जेक्ट्स के नेटवर्क) के संदर्भ शामिल हैं, यह काम नहीं करता है: यदि दो संदर्भ समान उप-ऑब्जेक्ट को इंगित करते हैं, तो प्रति में दो अलग-अलग प्रतियां होती हैं। और यदि रिकर्सिव संदर्भ हैं, तो फ़ंक्शन कभी समाप्त नहीं होगा (ठीक है, कम से कम जिस तरह से आप इसे चाहते हैं :-) इन सामान्य मामलों के लिए, आपको पहले से कॉपी की गई वस्तुओं का एक शब्दकोश जोड़ना होगा, और जांचें कि आपने इसे पहले से कॉपी किया है या नहीं ... जब आप एक साधारण भाषा का उपयोग करते हैं तो प्रोग्रामिंग जटिल होती है - virtualnobi


कोड की एक पंक्ति में एक ऑब्जेक्ट क्लोन (गहरे क्लोन नहीं) को क्लोन करने का प्रभावी तरीका

एक Object.assign विधि ईसीएमएस्क्रिप्ट 2015 (ईएस 6) मानक का हिस्सा है और आपको वही करता है जो आपको चाहिए।

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

ऑब्जेक्ट.साइन () विधि का प्रयोग एक या अधिक स्रोत ऑब्जेक्ट्स से लक्ष्य ऑब्जेक्ट पर सभी समृद्ध गुणों के मानों की प्रतिलिपि बनाने के लिए किया जाता है।

और पढो...

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

132



यह दोबारा प्रतिलिपि नहीं करता है, इसलिए वास्तव में किसी ऑब्जेक्ट को क्लोन करने की समस्या का हल नहीं होता है। - mwhite
इस विधि ने काम किया, हालांकि मैंने कुछ और _.extend ({}, (obj)) का परीक्षण किया था, सबसे तेज़ एफएआर था: उदाहरण के लिए JSON.parse से 20x तेज और ऑब्जेक्ट.साइन से 60% तेज। यह सभी उप-वस्तुओं को अच्छी तरह से कॉपी करता है। - Nico
@mwhite क्लोन और गहरे क्लोन के बीच एक अंतर है। यह जवाब वास्तव में क्लोन करता है, लेकिन यह गहरा क्लोन नहीं करता है। - Meirion Hughes
ओप ने गहरे क्लोन के लिए कहा। यह गहरा क्लोन नहीं करता है। - user566245
ओप के सवाल को पढ़ने के बिना इतने सारे ऑब्जेक्ट। असाइन प्रतिक्रियाएं ... - martin8768


कोड:

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

91



किस बारे में var obj = {} तथा obj.a = obj - neaumusic
मैं इस समारोह को समझ नहीं पा रहा हूं। मान लीजिए from.constructor है Date उदाहरण के लिए। तीसरा कैसे होगा if परीक्षा 2 तक पहुंच जाएगी if परीक्षण सफल होगा और समारोह को वापस करने का कारण बन जाएगा (तब से Date != Object && Date != Array)? - Adam McKee
@AdamMcKee क्योंकि जावास्क्रिप्ट तर्क गुजरने और परिवर्तनीय असाइनमेंट मुश्किल है। यह दृष्टिकोण महान काम करता है, जिसमें तिथियां शामिल हैं (जो वास्तव में दूसरे परीक्षण द्वारा संभाली जाती हैं) - यहां परीक्षण करने के लिए पहेली: jsfiddle.net/zqv9q9c6। - brichins
* मेरा मतलब था "पैरामीटर असाइनमेंट" (फ़ंक्शन बॉडी के भीतर), "वेरिएबल असाइनमेंट" नहीं। हालांकि यह दोनों अच्छी तरह से समझने में मदद करता है। - brichins
@NickSweeting: कोशिश करें - यह काम हो सकता है। यदि नहीं - इसे ठीक करें और उत्तर अपडेट करें। इस तरह यह समुदाय में यहां काम करता है :) - Kamarey