Câu trả lời được chấp nhận là không đúng (hiện nay, mặc dù), xem ví dụ sau:
if([5] == true) {
console.log("hello"); \t
}
Nếu mọi thứ thực sự là xử lý như các tiểu bang trả lời chấp nhận, sau đó [5] == true
nên có được đánh giá là true
vì mảng [5]
sẽ được chuyển thành đối số chuỗi của nó ("5"
) và chuỗi "5"
là trung thực (Boolean("5") === true
là true
), vì vậy true == true
phải đúng.
Nhưng điều này rõ ràng không phải là trường hợp vì điều kiện không đánh giá là true
.
Vì vậy, những gì đang thực sự xảy ra là:
1.![]
sẽ chuyển đổi toán hạng của nó để một boolean và sau đó lật rằng giá trị boolean, mỗi đối tượng là truthy, vì vậy ![]
sẽ đánh giá để false
.
Tại thời điểm này, việc so sánh trở nên [] == false
2. gì được vào chơi sau đó là những quy tắc 2, clearly stated trong # 6 trong số kỹ thuật cho các thuật toán Tóm tắt bình đẳng So sánh:
- Nếu loại (x) là boolean, trả về kết quả của phép so sánh ToNumber (x) == y.
- Nếu Kiểu (y) là boolean, trả lại kết quả của việc so sánh x == ToNumber (y)
Tại thời điểm này, việc so sánh trở nên [] == 0
.
3. Sau đó, nó là quy tắc này:
Nếu Type (x) là đối tượng và Type (y) là một trong hai String hoặc Number, trả lại kết quả của việc so sánh ToPrimitive (x) == y.
Như @Jonas_W tuyên bố, một ToPrimitive
của mảng sẽ gọi toString
của nó, mà sẽ trả về một danh sách bằng dấu phẩy của nội dung của nó (tôi quá đơn giản).
Tại thời điểm này, so sánh trở thành "" == 0
.
4. Và cuối cùng (tốt, hầu như), quy tắc này:
Nếu Type (x) là String và Type (y) là Number, trả lại kết quả của việc so sánh ToNumber (x) == y.
Chuỗi rỗng được chuyển đổi thành một số là 0
(Number("") == 0
là true
).
Tại thời điểm này, so sánh trở thành 0 == 0
.
5. Cuối cùng, quy tắc này sẽ được áp dụng:
Nếu Type (x) cũng giống như Kiểu (y), sau đó
.........
Nếu Type (x) là Number, sau đó
.........
Nếu x là giá trị số tương tự như y, tru trở lại e.
Và, đây là lý do tại sao việc so sánh để đánh giá true
. Bạn cũng có thể áp dụng các quy tắc này cho ví dụ đầu tiên của tôi để xem lý do tại sao nó không đánh giá thành true
.
Tất cả các quy tắc tôi đã nêu ở trên được nêu rõ ràng here trong thông số kỹ thuật.
'! []' Là 'false', không phải' true', vì '[]' là một đối tượng. 'ToPrimitive' không được gọi trước khi phủ định, nó được gọi ở điểm phủ định, nếu có. '==' ép buộc mảng đầu tiên. – Xufox
yes! [] IS sai nhưng CÁCH hoạt động? TẠI SAO nó sai? Đây là những câu hỏi thực sự. Lời giải thích rằng mảng trống là một đối tượng không thuyết phục tôi xin lỗi –
@KonradAlbrecht, nhưng đó là lời giải thích. Nếu bạn không hài lòng với điều đó, thì đó thực sự là vấn đề của bạn. Trong JavaScript * tất cả * đối tượng (ngoại trừ 'null' không thực sự là một đối tượng và' document.all', là một câu chuyện hoàn toàn khác) đều là sự thật. Không có gì để hiểu về điều đó, nó là [a given] (https://developer.mozilla.org/en-US/docs/Glossary/Truthy). Mảng là các đối tượng, và vì vậy '[]' là sự thật. – trincot