Helpex - Trao đổi & giúp đỡ Đăng nhập
32

Tôi có mã này:

var object1 = {same:'test'}
var object2 = {same:'test'};       
console.log(object1 === object2)

Nó trả về false trong bảng điều khiển.

Tôi cũng có mã này:

var object1 = {same:'test'}
var object2 = object1;
console.log(object1 === object2)  

Nó trả về true trong bảng điều khiển.

Tôi biết '===' là một toán tử bình đẳng, nhưng tôi không biết nó hoạt động như thế nào trên các đối tượng.

Tại sao ví dụ đầu tiên trả về false?

32 hữu ích 5 bình luận 3.2k xem chia sẻ
10 trả lời 10
82

Nhìn thấy quả bóng này? Màu của nó là màu đỏ. Gọi nó là ball1.

Nhìn thấy quả bóng này? Màu của nó là màu đỏ. Gọi nó là quả bóng2.

Ball1 có phải là vật giống với ball2 không? Không, chúng là các đối tượng riêng biệt có các thuộc tính giống hệt nhau.


Nhìn thấy quả bóng này? Màu của nó là màu đỏ. Gọi nó là ball1.

Hãy gọi ball1, ball2.

Ball1 có phải là vật giống với ball2 không? Đúng. Chúng là cùng một quả bóng.

82 hữu ích 5 bình luận chia sẻ
36

Các đối tượng được so sánh bằng tham chiếu bình đẳng, và vì object1object2là hai trường hợp riêng biệt, chúng là các đối tượng khác nhau (hãy nghĩ về nó như: chúng chiếm những vị trí khác nhau trong bộ nhớ).

Tuy nhiên, nếu bạn gán object1 cho object2, cả hai đều trỏ đến cùng một vị trí trong bộ nhớ và do đó bằng nhau (chúng là hai tham chiếu đến cùng một đối tượng duy nhất, nó chỉ tồn tại một lần trong bộ nhớ). Việc thay đổi thuộc tính thông qua object1.same = 'uiae';cũng sẽ cập nhật thuộc tính object2.same(vì trên thực tế chúng là cùng một đối tượng giống hệt nhau và cùng một thuộc tính)

36 hữu ích 0 bình luận chia sẻ
9
var object1 ={same:'test'}
var object2 ={same:'test'};       
console.log(object1 === object2)

Trong trường hợp này, bạn đang tạo hai đối tượng khác nhau. đó là lý do tại sao nó trả về giá trị sai trong bảng điều khiển khi kiểm tra với toán tử === .

var object1 ={same:'test'}
var object2 =object1;
console.log(object1 === object2)

Trong trường hợp này, bạn đang tạo một đối tượng và object1 & object2 tham chiếu đến đối tượng đã tạo, đó là lý do tại sao nó trả về true khi bạn kiểm tra với toán tử === .

Trong trường hợp thứ hai, nếu chúng ta thay đổi object2["same"]="test2"giá trị then object1 ["same"] cũng sẽ thay đổi thành test2 .

Trong trường hợp đầu tiên, nó sẽ không xảy ra như vậy, bởi vì object1 & object2 là hai đối tượng khác nhau.

tham khảo phần này: Bình đẳng đối tượng trong JavaScript

hy vọng điều này có thể hữu ích.

9 hữu ích 0 bình luận chia sẻ
6

Trong trường hợp đầu tiên, Object1 và Object2 là hai điểm tham chiếu (hoặc biến) khác nhau trỏ đến hai đối tượng khác nhau trong bộ nhớ. Vì vậy, khi bạn kiểm tra chúng xem có bằng nhau thì kết quả là false.

Trong trường hợp thứ hai, bạn chỉ đang sao chép điểm tham chiếu (địa chỉ) từ Object1 sang Object2 nghĩa là cả hai điểm tham chiếu hiện đang tham chiếu đến cùng một đối tượng trong bộ nhớ. Do đó kết quả là true.

Các đối tượng luôn được so sánh bằng cách tham chiếu.

6 hữu ích 0 bình luận chia sẻ
4

Khi bạn gán các đối tượng hoặc mảng từ biến này sang biến khác, nó sẽ sao chép một tham chiếu đến đối tượng ban đầu, do đó hai đối tượng là bằng nhau.

Mỗi khi bạn viết một đối tượng hoặc mảng theo nghĩa đen, nó sẽ tạo ra một đối tượng hoặc mảng khác nhau, vì vậy chúng không bằng nhau, ngay cả khi nội dung tương tự nhau.

4 hữu ích 0 bình luận chia sẻ
3

Khi bạn đã tạo đối tượng theo cách này, bạn đã tạo một bản đồ. Không có gì giống như giá trị của một bản đồ vì nó không phải là các kiểu nguyên thủy. Vì vậy, bằng sẽ chỉ kiểm tra sự bình đẳng tham chiếu. Do đó điều này không thành công. Trong trường hợp thứ hai, đẳng thức tham chiếu đi qua.

3 hữu ích 0 bình luận chia sẻ
3

Hai đối tượng khác nhau không thể bằng nhau theo định nghĩa trong JavaScript. Các thuộc tính và giá trị bằng nhau không quan trọng. Chúng có các con trỏ khác nhau (ví dụ đầu tiên).

Trong ví dụ thứ hai, bạn đang nhân bản đối tượng với tham chiếu. Vì vậy, "===" sẽ trả về true.

3 hữu ích 0 bình luận chia sẻ
2

Trong ví dụ đầu tiên, bạn đã tạo hai đối tượng riêng biệt với nội dung tùy ý, ngẫu nhiên giống nhau: {same:'test'}{same:'test'}

Trong ví dụ thứ hai, bạn chỉ tạo một đối tượng và lưu trữ nó trong hai biến: object1object2

Việc ===kiểm tra nhận dạng đối tượng, có nghĩa là các đối tượng trong các biến được so sánh phải giống nhau.

2 hữu ích 5 bình luận chia sẻ
2

Ví dụ của bạn không liên quan đến sự khác biệt toán tử == so với ===. Như mọi người đã giải thích trước đây, ví dụ của bạn chỉ đơn giản là tạo ra hai đối tượng khác nhau và trong ví dụ tiếp theo tham chiếu giống nhau. Cả hai == và === sẽ hoạt động giống nhau ở đó.

Vì các đối tượng là các đối tượng có đèn chiếu sáng và không phải theo bất kỳ cách nào hoàn toàn có thể chuyển đổi được, nên == và === sẽ luôn hoạt động giống nhau đối với các đối tượng. Một số kiểu khác như NaN, null và tương tự, bạn nhận được kết quả kỳ lạ / hài hước khi so sánh với == và ===

2 hữu ích 0 bình luận chia sẻ
0

Đây là cách javascript xử lý và so sánh các đối tượng:

So sánh các đối tượng trong JavaScript

0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ javascript , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading