2012-01-09 24 views
5

Tôi đã nhìn vào mã nguồn cho các thư viện Underscore.js, đặc biệt là đối với phương pháp map (khoảng dòng 85 trên trang đó, và sao chép ở đây):độ dài đối tượng phủ định có thể có trong JavaScript hoặc underscore.js? Ý nghĩa?

_.map = function(obj, iterator, context) { 
    var results = []; 
    if (obj == null) return results; 
    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); 
    each(obj, function(value, index, list) { 
     results[results.length] = iterator.call(context, value, index, list); 
    }); 
    if (obj.length === +obj.length) results.length = obj.length; 
    return results; 
    }; 

hoàn toàn đơn giản TRỪ cho dòng sau

if (obj.length === +obj.length) results.length = obj.length; 

Bây giờ, tôi đọc điều này có nghĩa là "nếu chiều dài đối tượng không phải là số âm ..."
, nếu diễn giải của tôi là đúng, ngụ ý rằng nó có thể!

Vì vậy, các chuyên gia thân yêu, cho những gì loại của các đối tượng có thể

obj.length === +obj.length 

được false? Sự hiểu biết của tôi về === có nghĩa là nó có thể trả lại false nếu loại obj.length không khớp với loại +obj.length, nhưng ở đây kiến ​​thức của tôi không đủ. Những thứ gì có thể + có thể làm với những thứ mà obj.length có thể là? Có phải là x === +x một số loại thử nghiệm thành ngữ chung mà tôi không biết? Có phải nó phản ứng với một số trường hợp đặc biệt phát sinh sâu hơn trong underscore.js, ví dụ: underscore.js có gán và theo dõi đối tượng phủ định.độ dài cho một số mục đích thông thường không? Hướng dẫn và tư vấn sẽ được đánh giá cao.

+2

Lưu ý rằng '+ x' là * không * nhất thiết là dương - nó chỉ là giá trị số của' x'. Vì vậy, nếu 'var x = -10',' + x' cũng là '-10'. –

+0

Có, nhận ra rằng + x không làm bất cứ điều gì với giá trị của x (không tăng tạm thời để so sánh). – grantwparks

Trả lời

4

Tôi nghĩ đó là thử nghiệm để xem nếu typeof obj.length === 'number'

Trái ngược với nếu nó là một đối tượng mà có một giá trị chiều dài của '2 days'

Vì vậy, nó biết nếu nó là một đối tượng như:

var obj = { app: 'doctor', length: '45 min' }; 

so với

var obj = [ 0, 2, 1]; 
+0

Tôi hiểu - tôi nghĩ vậy. Nếu 'obj = {app: 'doctor', length: '45 min '}' thì 'obj.length' sẽ là' undefined', và '+ obj.Length' sẽ là' NaN'. Nhưng nếu 'obj' là một mảng thì chiều dài của nó sẽ là một số dương và tất cả sẽ tốt. Vì vậy, đây thực sự là một thử nghiệm của mảng-ness. Bây giờ câu hỏi là "tại sao không' obj instanceof Array'? –

+0

obj.length sẽ không được xác định bởi vì có một chiều dài đặc biệt cụ thể trong obj và giá trị của nó là '45 phút '. Nhưng nó sẽ là khó chịu để sử dụng như là một chiều dài. – grantwparks

3

Trong javascript, toán tử + cũng có thể được sử dụng để chuyển đổi chuỗi đại diện của một số thành một số. Vì vậy, dòng:

obj.length === +obj.length 

cũng có thể có nghĩa là: "Độ dài là số và không phải là chuỗi".

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