JavaScript ਵਿੱਚ Shallow Copy ਬਨਾਮ Deep Copy
JavaScript ਡੇਟਾ ਟਾਈਪ ਦੇ ਆਧਾਰ 'ਤੇ ਕਾਪੀ ਕਰਨ ਦੇ ਦੋ ਤਰੀਕੇ ਵਰਤਦਾ ਹੈ।
Primitive Values (Copy by Value) Primitive types ਵਿੱਚ strings, numbers, booleans, symbols, bigInt, ਅਤੇ null ਸ਼ਾਮਲ ਹਨ। ਜਦੋਂ ਤੁਸੀਂ ਕਿਸੇ primitive ਨੂੰ ਕਾਪੀ ਕਰਦੇ ਹੋ, ਤਾਂ JavaScript ਮੈਮੋਰੀ ਵਿੱਚ ਇੱਕ ਨਵਾਂ ਸੁਤੰਤਰ ਵਰਜ਼ਨ ਬਣਾਉਂਦਾ ਹੈ।
Example: let a = 10; let b = a; b = 20; Result: a 10 ਹੀ ਰਹਿੰਦਾ ਹੈ।
Non-Primitive Values (Copy by Reference) Objects ਅਤੇ arrays ਵੱਖਰੇ ਤਰੀਕੇ ਨਾਲ ਕੰਮ ਕਰਦੇ ਹਨ। ਉਹ references ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਨ। ਜਦੋਂ ਤੁਸੀਂ ਕਿਸੇ object ਨੂੰ ਕਾਪੀ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ ਸਿਰਫ਼ ਮੈਮੋਰੀ ਵਿੱਚ ਉਸਦੇ ਸਥਾਨ (location) ਦੇ ਪੁਆਇੰਟਰ (pointer) ਨੂੰ ਕਾਪੀ ਕਰਦੇ ਹੋ।
Example: let original = { name: "YOO" }; let copy = original; copy.name = "NEW"; Result: original.name ਹੁਣ "NEW" ਹੈ।
The Difference: Shallow vs Deep
ਇੱਕ shallow copy ਕਿਸੇ object ਦੇ ਉੱਪਰਲੇ ਪੱਧਰ (top level) ਨੂੰ ਕਾਪੀ ਕਰਦੀ ਹੈ। ਜੇਕਰ object ਵਿੱਚ nested objects ਹਨ, ਤਾਂ ਇਹ ਅਜੇ ਵੀ ਅਸਲ nested references ਵੱਲ ਹੀ ਇਸ਼ਾਰਾ ਕਰਦੀ ਹੈ। ਇੱਕ deep copy ਸਾਰੀਆਂ ਨਵੀਆਂ ਵੈਲਿਊਜ਼ ਦੇ ਨਾਲ ਇੱਕ ਬਿਲਕੁਲ ਨਵਾਂ object ਬਣਾਉਂਦੀ ਹੈ।
ਇਸਨੂੰ ਪੀਜ਼ਾ ਵਾਂਗ ਸਮਝੋ:
- Shallow Copy: ਤੁਸੀਂ ਅਤੇ ਤੁਹਾਡਾ ਦੋਸਤ ਇੱਕ ਪੀਜ਼ਾ ਸਾਂਝਾ ਕਰਦੇ ਹੋ। ਜੇਕਰ ਤੁਹਾਡਾ ਦੋਸਤ ਇੱਕ ਸਲਾਈਸ ਖਾਂਦਾ ਹੈ, ਤਾਂ ਪੀਜ਼ਾ ਤੁਹਾਡੇ ਲਈ ਵੀ ਘੱਟ ਜਾਂਦਾ ਹੈ।
- Deep Copy: ਤੁਹਾਡੇ ਦੋਵਾਂ ਕੋਲ ਆਪਣੇ ਵੱਖਰੇ ਪੀਜ਼ਾ ਹਨ। ਜੇਕਰ ਤੁਹਾਡਾ ਦੋਸਤ ਇੱਕ ਸਲਾਈਸ ਖਾਂਦਾ ਹੈ, ਤਾਂ ਤੁਹਾਡਾ ਪੀਜ਼ਾ ਉਵੇਂ ਹੀ ਰਹਿੰਦਾ ਹੈ।
Shallow Copy Method ਤੁਸੀਂ shallow copy ਬਣਾਉਣ ਲਈ spread operator (...) ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹੋ।
let original = { name: "YOO", details: { age: 22 } }; let copy = { ...original };
Warning: ਜੇਕਰ ਤੁਸੀਂ original.details.age ਨੂੰ ਬਦਲਦੇ ਹੋ, ਤਾਂ copy.details.age ਵੀ ਬਦਲ ਜਾਂਦਾ ਹੈ। ਇਹ shallow copy ਦਾ ਜਾਲ (trap) ਹੈ।
Deep Copy Methods
- structuredClone() ਇਹ ਆਧੁਨਿਕ browsers ਅਤੇ Node.js ਵਿੱਚ ਇੱਕ built-in function ਹੈ। ਇਹ nested structures ਨੂੰ ਬਿਲਕੁਲ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਸੰਭਾਲਦਾ ਹੈ।
ਫਾਇਦੇ (Pros):
- ਤੇਜ਼ ਅਤੇ native ਹੈ।
- Dates, RegExp, ਅਤੇ Maps ਨੂੰ ਸੰਭਾਲਦਾ ਹੈ।
ਨੁਕਸਾਨ (Cons):
- ਜੇਕਰ object ਵਿੱਚ functions ਜਾਂ DOM nodes ਹਨ, ਤਾਂ ਇਹ ਕੰਮ ਨਹੀਂ ਕਰਦਾ।
- JSON.parse(JSON.stringify()) ਇਹ ਇੱਕ ਪੁਰਾਣੀ ਚਾਲ ਹੈ ਜਿੱਥੇ ਤੁਸੀਂ ਇੱਕ object ਨੂੰ string ਵਿੱਚ ਬਦਲਦੇ ਹੋ ਅਤੇ ਫਿਰ ਵਾਪਸ object ਵਿੱਚ ਬਦਲਦੇ ਹੋ।
ਇਸ ਤੋਂ ਕਿਉਂ ਬਚਣਾ ਚਾਹੀਦਾ ਹੈ:
- ਇਹ undefined, Map, Set, ਜਾਂ Infinity ਵਰਗਾ ਡੇਟਾ ਗੁਆ ਲੈਂਦਾ ਹੈ।
- ਇਹ ਕੁਝ ਵੈਲਿਊਜ਼ ਨੂੰ ਖਰਾਬ ਕਰ ਸਕਦਾ ਹੈ।
Source: https://dev.to/yogesh_992/shallow-copy-vs-deep-copy-in-java-script-explained-in-easiest-way-3dg5
