2012-03-01 18 views
8

Tôi hiểu tại sao bạn cần phải sử dụng Object.prototype.toString() hoặc String() cho các mảng đánh máy, nhưng không phải là typeof đủ cho các chức năng và chuỗi đánh máy? Ví dụ polyfill trên MDN cho Array.isArray sử dụng:Tại sao sử dụng toString() để đánh máy args rằng bạn có thể kiểm tra với typeof?

Object.prototype.toString.call(arg) == '[object Array]'; 

Nó khá rõ ràng trong trường hợp mảng bởi vì bạn không thể sử dụng typeof để kiểm tra các mảng. Valentine sử dụng instanceof cho việc này:

ar instanceof Array 

Nhưng đối với chuỗi/chức năng/boolean/số, tại sao không sử dụng typeof?

jQueryUnderscore đều sử dụng một cái gì đó như thế này để kiểm tra các chức năng:

Object.prototype.toString.call(obj) == '[object Function]'; 

Mà không phải là tương đương với làm điều này?

typeof obj === 'function' 

hoặc thậm chí điều này?

obj instanceof Function 

Trả lời

15

Ok Tôi nghĩ rằng tôi đã tìm ra lý do tại sao bạn thấy sử dụng toString. Xem xét việc này:

var toString = Object.prototype.toString; 
var strLit = 'example'; 
var strStr = String('example')​; 
var strObj = new String('example'); 

console.log(typeof strLit); // string  
console.log(typeof strStr); // string 
console.log(typeof strObj); // object 

console.log(strLit instanceof String); // false 
console.log(strStr instanceof String); // false 
console.log(strObj instanceof String); // true 

console.log(toString.call(strLit)); // [object String] 
console.log(toString.call(strStr)); // [object String] 
console.log(toString.call(strObj)); // [object String] 

+1

Lưu ý rằng nó không hoạt động với Promises, ít nhất là trong Chrome trong Firefox. 'typeof mypromise === 'object',' toString.call (mypromise) ===' [Object] '', nhưng' mypromise instanceof Promise === true' – Hurelu

1

Lý do đầu tiên tôi có thể nghĩ đến là typeof null lợi nhuận object, mà không phải là thường những gì bạn muốn (kể từ null không phải là một đối tượng, nhưng một loại theo đúng nghĩa của nó).

Tuy nhiên, Object.prototype.toString.call(null) trả về [object Null]. Tuy nhiên, như bạn đề nghị, nếu bạn mong đợi một chuỗi hoặc loại khác hoạt động tốt với typeof, tôi không thấy lý do tại sao bạn không thể sử dụng typeof (và tôi thường sử dụng typeof trong trường hợp đó).

Một lý do khác như các thư viện mà bạn đề cập đến sử dụng phương pháp đã chọn của họ có thể đơn giản là cho tính nhất quán. Bạn có thể sử dụng typeof để kiểm tra một số Array, vì vậy hãy sử dụng một phương pháp khác và dán vào đó.

Để biết thêm thông tin, Angus Croll has an excellent article on the typeof operator.

+0

Tôi đang nói về việc kiểm tra thứ dường như sẽ làm việc mà không có một xô như dây/chức năng/boolean/số – ryanve

+0

++ đẹp link:] – ryanve

+0

Do lưu ý rằng nó không làm việc với Promises, ít nhất là trong Chrome trong firefox. 'typeof mypromise === 'object',' toString.call (mypromise) ===' [Object] '', nhưng' mypromise instanceof Promise === true' – Hurelu