Chào mọi người, mình có thắc mắc về vấn đề sau. Hi vọng mọi người có thể giải đáp giúp ạ.
obj1 = {
ten: 'Duong',
tuoi: 18,
};
var obj2 = obj1;
obj1.tuoi = 30;
console.log(obj2);
Kết quả là: 30.
Tại sao lại như vậy ạ
Chào mọi người, mình có thắc mắc về vấn đề sau. Hi vọng mọi người có thể giải đáp giúp ạ.
obj1 = {
ten: 'Duong',
tuoi: 18,
};
var obj2 = obj1;
obj1.tuoi = 30;
console.log(obj2);
Kết quả là: 30.
Tại sao lại như vậy ạ
Có thể là var obj2 = obj1
khiến cho obj1
và obj2
cùng ở một vị trí vùng nhớ. Do đó khi thay của obj1
thì cũng gián tiếp thay obj2
Ví dụ như bạn có một xe mà bạn cho thằng bạn của bạn 2 đứa sài chung. Khi nó làm hỏng xe của nó cũng có nghĩa nó cũng làm hỏng xe của bạn
hi bạn,
mình cũng nghĩ vậy. nhưng vấn đề là tại sao nó lại cho 2 thằng có cùng địa chỉ trong vùng nhớ
Đơn giản mà vì bạn gán nó mà
Như vậy bạn đã cho obj2
và obj1
cùng chạy một chiếc xe rồi
Có thể bạn nghĩ nó lấy giá trị của obj1
ra để gán cho ojb2
nhưng tiếc là nó không làm thế
Nhưng nếu bạn lập trình C hay C++ thì nó khác
Ví dụ:
int i=6;
int d=i;
i++;
cout<<d : Kết quả là: 6
Mỗi ngôn ngữ có cách xử lý vùng nhớ khác nhau.
Việc bê nguyên lý của ngôn ngữ này sang ngôn ngữ kia và mong là nó làm việc giống nhau là điều hoàn toàn sai lầm.
Cái bạn cần làm là google “shadow copy javascript” ngta sẽ chỉ cho bạn biết cách để copy 1 object theo đúng chuẩn js
Không bạn à Thật ra gán biến như vậy thì nó chỉ lấy giá trị thôi khôn tin bạn thử bên js xem nó cũng như C/C++ thôi. Quan trọng ở đây là bạn đang thao tác với object
obj1 và obj2 suy cho cùng cũng chỉ là hai tham chiếu đến đối tượng chứ không phải chính đối tượng đó, gán khơi khơi thì nó vậy. Còn primitive thì gán vậy được do nó có trỏ đâu.
Nếu chuyển từ C/C++ qua thì nó khá giống con trỏ, do tham chiếu C++ chỉ bind 1 lần duy nhất và bind ngay từ đầu.
Ný luận làm gì cho cực vậy bạn! Bạn muốn copy phải không phải làm thế này mới ok
var obj2=JSON.parse(JSON.stringify(obj1));
Tại sao phải lấy JSON làm trung gian?
lấy json làm trung gian thì nó sẽ tạo ra bản sao nhưng hoàn toàn riêng biệt với object ban đầu. gán bằng toán tử “=” thực chất chỉ là 2 biến cùng trỏ về một vùng nhớ
Việc gán biến (variable) trong js
object
(bao gồm array) thì nó chỉ tham chiếu đến.function
thì nó sẽ lưu lại giá trị.function
ra vì tùy thuộc vào cách bạn gán là hàm thực thi hay chưa, và giá trị được trả về, mà nó quay lại 2 kiểu trên.Trừ khi object của bạn hoàn toàn theo chuẩn json, nếu không cách này sẽ làm hỏng dữ liệu, và đây cũng là cách chậm nhất để tạo bản sao của object.
@Nguyen_Duong221 Nếu bạn muốn kế thừa lại mẫu thì OOJS là cái bạn cần. Nên xem thêm Working with objects .
Mình giải thích theo typeof
, vì nói object trong js thì cái gì cũng từ Object mà ra. Nếu nói thế dễ gây nhầm lẫn. Mình thấy chỉ cần tập trung vào đang gán cái gì. Ví dụ thế này:
var x = function() {
console.log(1);
return 2;
};
Nếu gán var y = x;
thì console.log(y());
luôn ra 12.
Nếu gán var y = x();
thì console.log(y);
lần đầu sẽ ra 12, các lần sau sẽ chỉ ra 2.
Còn các thuật ngữ kia thì mình không tìm thấy tài liệu chuẩn nào đề cập đến, lấy trong cách tranh luận trên stackoverflow và quora.
Câu lệnh trên thực chất là làm thế này
obj2.ten=obj1.ten;
obj2.tuoi=obj1.tuoi;
....
có 1 trăm cái chắc chết!!!!
Biến Object trong javascript là reference variable bạn ạ.
Đây là video giải thích rất hay về 2 loại biến reference và primitive trong javascript:
Object.assign
var obj2 = Object.assign({}, obj1);