2012-01-01 23 views
26

Từ the jQuery documentation trên các loại Javascript đến đoạn mã này mô tả hành vi của chuỗi khi chuyển đổi sang các phép toán luận (chủ đề mà không liên quan đến câu hỏi này, nhưng nó chỉ là nơi tôi tìm thấy mã):Tại sao Boolean (sai) mới bằng false trong JavaScript?

!"" // true 
!"hello" // false 
!"true" // false 
!new Boolean(false) // false 

tôi nhận được ba ví dụ đầu tiên, nhưng tôi không nhận được ví dụ cuối cùng, bởi vì:

new Boolean(false) == false //true 
!false // true 

vì vậy, tôi sẽ giả định:

!new Boolean(false) // true 

Nhưng thay vì:

new Boolean(false) === false // false 

Nếu vậy, mục đích gì thực hiện điều này phục vụ:

!new Boolean(false) // false, mind = blown 

này, tôi thậm chí không ...

Có phải vì là gì?

+1

+1 cho câu hỏi được phân tích sâu. – Praveen

Trả lời

24

new Boolean(false) trả về một đối tượng không phải là rỗng. Các đối tượng không null luôn là sự thật.

Do đó, ! của bất kỳ đối tượng nào không phải rỗng sẽ luôn là sai.


Để chứng minh điều đó cho chính mình, bạn có thể chạy này trong giao diện điều khiển javascript của bạn

(typeof new Boolean(false)) //"object" 

Ngoài ra, bạn có thể sử dụng toán tử strict equality để xác nhận rằng new Boolean(false) là không thực sự false:

new Boolean(false) === false // false 

Ngẫu nhiên, gọi hàm Boolean làm chức năng — không có hàm mới — thực sự trả lại số nguyên thủy

!Boolean(false) // true 

(typeof Boolean(false)) //"boolean" 
8

new Boolean trả về một đối tượng as stated here.

Các ! được định nghĩa as follows:

11.4.9 logic NOT Điều Hành (!)

Việc sản xuất UnaryExpression: !UnaryExpression được đánh giá như sau:

  1. Hãy để expr là kết quả của việc đánh giá UnaryExpression.

  2. Hãy để cũGiá trịToBoolean(GetValue(expr)).

  3. Nếu OldValuetrue, trở false.

  4. Trả lại true.

and:

9,2 ToBoolean

Các ToBoolean hoạt động trừu tượng chuyển đổi đối số của nó đến một giá trị kiểu Boolean theo Bảng 11:

Bảng 11 - ToBoolean Chuyển đổi

Argum ent Loại - Kết quả

...

Object - true

Vì vậy, nó là một đối tượng, do đó lợi nhuận ToBooleantrue, do đó lợi nhuận !false.

Các vấn đề liên quan