All primitive datatypes are copied with direct assignment operator, whereas non-primitive datatypes just assigns the reference. Object
and Array
are non-primitive datatypes in JavaScript.
const car1 = {
speed: 200,
color: 'yellow'
}
const car2 = car1; // This does not copy car1 to car2, instead assigns only the reference
console.log(car1 == car2); // true
car2.speed = 300; // Changing car2 also changes car1
console.log(car1.speed); // 300
console.log(car2.speed); // 300
With spread operator, non-primitive datatypes can be shallow copied.
const car1 = {
speed: 200,
color: 'yellow'
}
const car2 = { ...car1 }; // Shallow copy
const car3 = Object.assign({}, car1); // Using Object.assign
console.log(car1 == car2); // false
console.log(car1 == car3); // false
car2.speed = 300;
car3.speed = 400;
console.log(car1.speed); // 200
console.log(car2.speed); // 300
console.log(car3.speed); // 400
Similarly, Arrays can be shallow copied as below.
const fruits1 = ['apple', 'orange'];
const fruits2 = [ ...fruits1 ];
const fruits3 = fruits1.slice();
const fruits4 = [].concat(fruits1);