Cách copy object trong javascript (Passing object by value)

Có phải chỉ cần dùng lệnh gán (newObj = oldObj) là xong?

Câu trả lời không đơn giản như vậy, newObj và oldObj vẫn liên kết với nhau, muốn thay đổi giá trị trong newObj mà không ảnh hưởng đến oldObj cách đơn giản nhất là dùng Object.assign() - một hàm trong ECMAScript 2015 (ES6):

var newObj = Object.assign({}, oldObj);

Ví dụ làm rõ vấn đề:

var oldObj = {a: 123}

var newObj = oldObj;
newObj.a = 456;
console.log("oldObj.a is changed to: "+oldObj.a); //oldObj.a is changed to: 456

newObj = Object.assign({},oldObj);
newObj.a = 789;
console.log("oldObj.a is still: "+oldObj.a); //oldObj.a is still : 456
1 Like

Nếu trình duyệt chưa hỗ trợ ES6, như Internet Explorer chẳng hạn. Vẫn có cách giải quyết vấn đề mà chứ nhỉ?

Đương nhiên là có. Lúc đó ta sẽ tự dựng hàm để clone Object.
Ở đây có 4 phương pháp: http://heyjavascript.com/4-creative-ways-to-clone-objects/
Cách dùng thư viện JSON rất ngắn nhưng có lẽ hao điện lắm đây.

Mình thì khoái dung spread operator. Nó chưa thành ES chính thức (lần cuối check nó đang ở Stage 3) nên cần phải dùng babel :slight_smile:

newObj = { ...oldObj }

Oh. Mình vừa thử Spread Operator như bạn nói, giờ nó đã là Standard trong ES6 nhưng đa phần hỗ trợ Firefox, Các browser khác không hỗ trợ đầy đủ. Mình dùng chrome 51 trên Fedora chỉ áp dụng được Spread Operator cho array thôi, object thì chưa bao giờ thành công.

Spread operator hỗ trợ object vẫn đang ở Stage 2 :smiley:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?