2012-05-01 74 views
10

Nhìn dưới mui xe trong UnderscoreJS, tôi thấy:Tại sao UnderscoreJS sử dụng toString.call() thay vì typeof?

_.isFunction = function(obj) { 
    return toString.call(obj) == '[object Function]'; 
    }; 

    _.isString = function(obj) { 
    return toString.call(obj) == '[object String]'; 
    }; 

    _.isNumber = function(obj) { 
    return toString.call(obj) == '[object Number]'; 
    }; 

Điều này có vẻ như một sự lựa chọn lẻ. Tại sao không chỉ sử dụng typeof để xác định xem một giá trị là một chuỗi, hàm hay số? Có hiệu suất đạt được bằng cách sử dụng toString? Typeof không được hỗ trợ bởi các trình duyệt cũ hơn?

+0

'typeof' đã tồn tại trong mọi phiên bản JavaScript kể từ phiên bản 1.1 năm 1996. –

Trả lời

13

Thực ra điều này là do kiểm tra nhanh hơn [[Class]] bằng cách kiểm tra với toString. Cũng có thể có ít sai lầm, vì toString mang đến cho bạn lớp chính xác ...

việc kiểm tra này:

var fn = function() { 
    console.log(typeof(arguments)) // returns object 
    console.log(arguments.toString()) // returns object Arguments 
} 

Bạn có thể thấy điểm chuẩn cho gạch typeof vs toString đây:

http://jsperf.com/underscore-js-istype-alternatives

Ngoài ra còn có một số vấn đề về github có giải thích tốt hơn:

https://github.com/documentcloud/underscore/pull/332

https://github.com/documentcloud/underscore/pull/321

EDIT 1:

Bạn cũng có thể kiểm tra bài viết tuyệt vời này: Câu trả lời

http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/

+0

Tham chiếu tuyệt vời. Cảm ơn! –

+1

/! \ Http://jsperf.com/underscore-js-istype-alternatives/7 (? Câu trả lời của DriverDan) – BeauCielBleu

2

drinchev là một phần đúng. toString hiện tại là nhiều hơn chậm hơn so với sử dụng typeOf trong hầu hết các trình duyệt. See the 7th revision of the test he posted sử dụng typeOf. Cả hai vẫn còn rất nhanh mặc dù vậy trong hầu hết các trường hợp, sự khác biệt về hiệu năng này sẽ không đáng chú ý và sự cân bằng có giá trị phù hợp với thông số kỹ thuật tốt hơn so với gõ/gõOf.

Underscore pull request 321 (danh sách drinchev được liệt kê) có thảo luận sâu về sự cân bằng và lý do họ quyết định sử dụng toString.

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