अंतर यह है कि
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
स्रोत
2017-01-25 10:00:50
'Object.assign' deepcopy नहीं है, यह [" प्रतियां एक या अधिक स्रोत वस्तुओं से सभी गणनीय खुद गुण के मूल्यों लक्ष्य वस्तु के लिए। "] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) –
यहां क्रोम कंसोल var obj1 = {"d": 22, "k": 33} var obj2 = Object.assign ({}, obj1) obj2 वस्तु {घ: 22, कश्मीर: 33} obj2.k = 44 obj1 वस्तु {घ: 22, कश्मीर: 33} ... यहाँ obj1 किया बदल नहीं है तो इसका मतलब है कि यह गहरी प्रतिलिपि सही है? – Ram
नहीं, यह एक उथली प्रतिलिपि है। आप प्रतिलिपि के अपने गुणों को बदल रहे हैं। ऑब्जेक्ट्स का ऑब्जेक्ट बनाने, प्रतिलिपि बनाने और फिर "इंगित" ऑब्जेक्ट्स को म्यूट करने का प्रयास करें। –