30/09/2018, 21:46

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
Võ Hoài Nam viết 23:59 ngày 30/09/2018

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ỉ?

Cao Chí Tâm viết 23:50 ngày 30/09/2018

Đươ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.

Khoa Nguyen viết 23:51 ngày 30/09/2018

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

newObj = { ...oldObj }
Cao Chí Tâm viết 23:51 ngày 30/09/2018

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.

Khoa Nguyen viết 23:49 ngày 30/09/2018

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

GitHub

tc39/proposal-object-rest-spread

proposal-object-rest-spread - Rest/Spread Properties for ECMAScript

Bài liên quan
0