value instanceof Constructor
cũng giống như Constructor.prototype.isPrototypeOf(value)
và cả kiểm tra [[Prototype]] - chuỗi value
cho lần xuất hiện của một đối tượng cụ thể.
Chuỗi và số là giá trị nguyên thủy, không phải đối tượng và do đó không có [[Prototype]], vì vậy nó sẽ chỉ hoạt động nếu bạn quấn chúng trong đối tượng thông thường (gọi là 'boxing' trong Java).
Ngoài ra, khi bạn chú ý, String(value)
và new String(value)
thực hiện các việc khác nhau: Nếu bạn gọi hàm dựng của các kiểu dựng sẵn mà không sử dụng toán tử new
, họ cố chuyển đổi ('đúc') đối số thành loại cụ thể . Nếu bạn sử dụng toán tử new
, họ tạo đối tượng bao bọc.
new String(value)
tương đương với Object(String(value))
, hoạt động tương tự như new Object(String(value))
.
Một số chi tiết trên các loại trong JavaScript: ECMA-262 định nghĩa các kiểu dữ liệu sau: Undefined, Null, Boolean, Số, và Chuỗi. Ngoài ra, có loại Đối tượng cho những thứ có thuộc tính.
Ví dụ, chức năng là loại Object (họ chỉ cần có một tài sản đặc biệt gọi là [[Gọi]]), và null
là một giá trị nguyên thủy của loại Null. Điều này có nghĩa là kết quả của toán tử typeof
không thực sự trả về loại giá trị ...
Theo truyền thống, các đối tượng JavaScript có một thuộc tính khác được gọi là [[Class]]. Bạn có thể nhận được thông qua Object.prototype.toString.call(value)
(điều này sẽ trả lại '[object
Classname
]'
).Mảng và chức năng thuộc loại Đối tượng nhưng các lớp của chúng là Mảng và Chức năng.
Thử nghiệm đối với một lớp của đối tượng được nêu ở trên khi instanceof
không thành công (ví dụ: khi đối tượng được chuyển giữa ranh giới cửa sổ/khung và không chia sẻ cùng nguyên mẫu).
Ngoài ra, bạn có thể muốn kiểm tra phiên bản cải tiến này của typeof
:
function typeOf(value) {
var type = typeof value;
switch(type) {
case 'object':
return value === null ? 'null' : Object.prototype.toString.call(value).
match(/^\[object (.*)\]$/)[1]
case 'function':
return 'Function';
default:
return type;
}
}
Đối với nguyên thủy, nó sẽ trở lại của họ loại trong thấp hơn trường hợp, cho các đối tượng, nó sẽ trở lại của họ lớp trong trường hợp tiêu đề.
Ví dụ:
Đối với nguyên thủy của loạiSố (ví dụ 5
), nó sẽ trở lại 'number'
, cho các đối tượng wrapper của lớpSố (ví dụ new Number(5)
), nó sẽ trả về 'Number'
;
Đối với các chức năng, nó sẽ trả lại 'Function'
.
Nếu bạn không muốn phân biệt giữa giá trị nguyên thủy và đối tượng bao bọc (vì lý do nào đó, có thể là xấu), hãy sử dụng typeOf(...).toLowerCase()
.
Lỗi đã biết là một số chức năng tích hợp trong IE, được coi là 'Object'
và giá trị trả lại là 'unknown'
khi được sử dụng với một số đối tượng COM +.
bạn phải sử dụng 'Number.prototype.isPrototypeOf (inp)' - cách của bạn cũng sẽ hoạt động nếu được thực hiện đúng: 'inp.constructor === Number'; nó có thể thất bại, bởi vì 'constructor' chỉ là một thuộc tính của nguyên mẫu và có thể được ghi đè! – Christoph
Tôi không chắc tôi hiểu ý của bạn với 'có thể bị ghi đè'. Nó không có nghĩa là tôi có thể ghi đè lên hàm tạo với một số hàm tạo khác (đã thử nó). Number.prototype.isPrototypeOf (4) trả về false bằng cách này, vì vậy tôi không thể sử dụng nó để kiểm tra kiểu giá trị nguyên thủy, tôi có đúng không? – KooiInc
Đó là toàn bộ điểm (nguyên thủy! == bọc nguyên thủy)! Việc kiểm tra các hàm tạo là nguy hiểm vì 'obj ['constructor'] = ???' works! Tôi muốn đề nghị sử dụng hàm 'typeOf()' của tôi; để xử lý nguyên thủy và bọc các nguyên thủy giống nhau, hãy sử dụng 'if (typeOf (x). toLowerCase() === 'string')' – Christoph