2017-01-25 7 views
6

मैं जानना चाहता हूँ वहाँ एक वस्तु की गहरी क्लोनिंग के लिएकिसी ऑब्जेक्ट की गहरी क्लोनिंग के लिए ऑब्जेक्ट.साइन और JSON.parse (JSON.stringify (obj)) के बीच क्या अंतर है?

Object.assign({}, obj) 

और

JSON.parse(JSON.stringify(obj)) 

बीच एक अंतर है? क्या कोई बता सकता है कि उनके पास कोई विचार है या नहीं?

+0

'Object.assign' deepcopy नहीं है, यह [" प्रतियां एक या अधिक स्रोत वस्तुओं से सभी गणनीय खुद गुण के मूल्यों लक्ष्य वस्तु के लिए। "] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) –

+0

यहां क्रोम कंसोल var obj1 = {"d": 22, "k": 33} var obj2 = Object.assign ({}, obj1) obj2 वस्तु {घ: 22, कश्मीर: 33} obj2.k = 44 obj1 वस्तु {घ: 22, कश्मीर: 33} ... यहाँ obj1 किया बदल नहीं है तो इसका मतलब है कि यह गहरी प्रतिलिपि सही है? – Ram

+0

नहीं, यह एक उथली प्रतिलिपि है। आप प्रतिलिपि के अपने गुणों को बदल रहे हैं। ऑब्जेक्ट्स का ऑब्जेक्ट बनाने, प्रतिलिपि बनाने और फिर "इंगित" ऑब्जेक्ट्स को म्यूट करने का प्रयास करें। –

उत्तर

12

अंतर यह है कि

Object.assign({}, obj) 

एक बनाता है:

तो अगर आप प्रदर्शन के बारे में परवाह यह object.assign

जांच नीचे दिए गए लिंक का उपयोग करने के लिए बेहतर है shallow copy, deep नहीं, जबकि

JSON.parse(JSON.stringify(obj)) 

serializes ऑब्जेक्ट JSON स्ट्रिंग के रूप में ऑब्जेक्ट करता है और फिर इसे एक गहरी प्रतिलिपि बनाने के प्रभावी ढंग से deserializes।

एक उथली प्रतिलिपि ठीक है, यदि आपकी सभी संपत्तियां प्राचीन मूल्यों को इंगित करती हैं, या यदि आपके पास प्रतिलिपि द्वारा संदर्भित वस्तुओं को म्यूट करने का कोई इरादा नहीं है। यदि आप करते हैं, परिवर्तन, दोनों मूल और उथले प्रतिलिपि में दिखाए जाने वाले वे दोनों एक ही वस्तु का संदर्भ है क्योंकि:

> let a = { k: { h: 1 } }; 
> let b = Object.assign({}, a); 
> b.k.h = 2; 
> a 
{ k: { h: 2 } } 
> b 
{ k: { h: 2 } } 

पाठ्यक्रम प्रति ही उत्परिवर्तित कर सकते हैं यह मूल पर कोई असर बिना की आप:

> b.j = 4 
> b.k = { new: 'object' } 
> a 
{ k: { h: 2 } } 
> b 
{ k: { new: 'object' }, j: 4 } 

दूसरी ओर serialize-deserialize चाल एक गहरी प्रतिलिपि जहां सब कुछ खरोंच से बनाया जाता है बनाता है:

> let c = JSON.parse(JSON.stringify(b)); 
> c 
{ k: { h: 2 } } 
> c.k.h = 3 
> c 
{ k: { h: 3 } } 
> a 
{ k: { h: 2 } } 
> b 
{ k: { h: 2 } } 

आईडी निरीक्षण करने के लिए एक और तरीका है संस्थाओं सख्त समानता उपयोग कर रहा है:

> let a = { k: { h: 1 } }; 
> let b = Object.assign({}, a); 
> a.k === b.k // both point to the same object 
true 
> let c = JSON.parse(JSON.stringify(b)); 
> c.k === b.k // different objects 
false 
0

मुझे लगता है कि परिणाम एक जैसा है, लेकिन प्रदर्शन परीक्षण में कोई अंतर है, object.assign JSON.parse (JSON.stringify (obj)) से बहुत तेज है।

enter link description here

संबंधित मुद्दे