2013-02-12 30 views
23

Tôi đang làm việc với node.js, vì vậy điều này có thể dành riêng cho V8.Sự khác biệt giữa typeof và instanceof trong JavaScript

Tôi luôn nhận thấy một số weirdness với sự khác biệt giữa typeof và instanceof, nhưng đây là một trong đó thực sự làm tôi phát cáu:

var foo = 'foo'; 
console.log(typeof foo); 

Output: "string" 

console.log(foo instanceof String); 

Output: false 

gì đang xảy ra ở đó?

+3

Trong JavaScript, tôi tin rằng có một sự phân đôi giữa kiểu chuỗi nguyên thủy và loại "đối tượng" 'String'. Hầu hết thời gian chúng có thể hoán đổi cho nhau, dường như không phải vì mục đích kiểm tra 'instanceof'. – millimoose

+3

Hãy xem này: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String#Distinction_between_string_primitives_and_String_objects – Waxen

+0

Bah, nên đã tìm kiếm SO đầu tiên: http: // stackoverflow .com/questions/11571923/instanceof-string-not-behaving-as-expected-in-google-apps-script/11572009 # 11572009 – Eric

Trả lời

38

typeof là cấu trúc "trả về" loại nguyên thủy của bất kỳ loại nào bạn vượt qua.
instanceof kiểm tra xem liệu toán hạng bên phải có xuất hiện ở bất kỳ vị trí nào trong chuỗi nguyên mẫu bên trái hay không.

Điều quan trọng cần lưu ý là có sự khác biệt lớn giữa chuỗi ký tự "abc" và đối tượng chuỗi new String("abc"). Trong trường hợp thứ hai, typeof sẽ trả về "đối tượng" thay vì "chuỗi".

7

Có các chuỗi chữ và có lớp String. Chúng tách biệt, nhưng chúng hoạt động liền mạch, tức là bạn vẫn có thể áp dụng các phương thức String cho chuỗi ký tự bằng chữ và chuỗi đó sẽ hoạt động như thể chuỗi ký tự là một đối tượng String đối tượng.

Nếu bạn rõ ràng tạo ra một trường hợp String, nó là một đối tượng, và nó là một thể hiện của lớp String:

var s = new String("asdf"); 
console.log(typeof s); 
console.log(s instanceof String); 

Output:

object 
true 
+1

Bạn nên lưu ý rằng đầu ra 'typeof' thực ra sẽ là đối tượng' "(' chuỗi chữ thường) – rgthree

+0

@ rgthree: Vâng, bạn nói đúng. Tôi đã sửa đầu ra. – Guffa

+0

@rgthree cũng nên được thêm vào để trả lời – kittu