01/10/2018, 10:06
Về object trong javascript
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 ạ
Bài liên quan
Có thể là

var obj2 = obj1
khiến choobj1
vàobj2
cùng ở một vị trí vùng nhớ. Do đó khi thay củaobj1
thì cũng gián tiếp thayobj2
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ồiCó thể bạn nghĩ nó lấy giá trị của
obj1
ra để gán choojb2
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
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ị.Mình tách
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.Tìm kiếm sâu hơn các khái niệm pass by value và pass by reference chỉ gây tranh cãi chứ không hoàn toàn giải thích được vấ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: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.
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:
Nếu bạn muốn copy một object, có thể dùng
Object.assign
VD
var obj2 = Object.assign({}, obj1);
Object.assign()
Object.assign() được sử dụng để sao chép các giá trị của tất cả thuộc tính có thể liệt kê từ một hoặc nhiều đối tượng nguồn đến một đối tượng đích. Nó sẽ trả về đối tượng đích đó.