2015-04-20 21 views
5

Sau đây cho biết biểu thức "true instanceof Boolean" đánh giá sai. Tại sao biểu thức này lại đánh giá sai?Tại sao 'true instanceof Boolean' bằng false trong JavaScript

$(document).ready(function() { 
 
    
 
    var $result = $('#result'); 
 
    
 
    if(true instanceof Boolean) { 
 
    $result.append('I\'m a Boolean!'); 
 
    } else { 
 
    $result.append('I\'m something other than a Boolean!'); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div id="result"></div>

+0

Điều bạn có thể muốn cho cụm từ của mình là 'typeof true == 'boolean'' – Shashank

Trả lời

11

Giá trị true là một boolean nguyên thủy — đó là "boolean" với một chữ "b". Nó không phải là một vật thể.

Tương tự, "hello" không phải là một thể hiện của Chuỗi, vì một chuỗi nguyên thủy không phải là một đối tượng.

Bạn có thể kiểm tra các loại nguyên thủy với toán tử typeof.

Sự khác biệt giữa giá trị nguyên thủy và giá trị đối tượng có thể hơi khó hiểu trong JavaScript vì ngôn ngữ ngầm bao bọc nguyên thủy trong trình bao bọc đối tượng thích hợp khi nguyên thủy được sử dụng như tham chiếu đối tượng. Đó là lý do tại sao bạn có thể viết

var length = "hello world".length; 

Chuỗi được ngầm chuyển đổi sang một trường hợp String cho rằng hoạt động . để làm việc. Bạn thậm chí có thể làm điều đó với một boolean:

var trueString = true.toString(); 

Nó xảy ra với những con số quá, mặc dù cú pháp được trong cách đôi khi:

var failure = 2.toString(); // an error 
var success = (2).toString(); // works 
+0

Cảm ơn Pointy, có vẻ instanceOf chỉ hoạt động với các đối tượng chứ không phải các kiểu nguyên thủy! Câu trả lời tốt. –

+1

Câu trả lời hay! Nhưng một chút khó hiểu, có thể gắn thẻ trên một ví dụ mã để kết thúc cho những người ít quen thuộc hơn: if (typeof true === "boolean") .... –

-2

The Boolean object is an object wrapper for a boolean value.

giá trị Vì vậy, boolean và các wrapper đối tượng không giống nhau.

Ngoài ra, boolean objects are verboten. Nói cách khác, nó không phải là phong cách tốt để sử dụng một đối tượng Boolean.

+0

@Shashank có, hãy thử 'true.toString()' – Pointy

+1

Bạn đang thiếu mới. Hãy thử 'Boolean (true) instance mới của Boolean' và bạn sẽ nhận được sự thật. – dcabines

+0

@Pointy Đó không thực sự là một trình bao bọc đối tượng. Nó chỉ là một sự thay đổi cho một kiểu nguyên thủy khác, một trình bao bọc đối tượng sẽ giống như Object (true). – Shashank

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