2011-08-01 30 views
6

Câu hỏi về việc triển khai hàm "từng" tôi tìm thấy trong mã nguồn underscore.js (nguồn bên dưới).mỗi triển khai trong thư viện underscore.js

Trước tiên, ai đó có thể giải thích dòng "else if (obj.length === + obj.length)" đang kiểm tra.

Thứ hai, ai đó có thể giải thích tại sao hasOwnProperty.call (obj, key) được sử dụng, thay vì obj.hasOwnProperty? Có phải vì thông qua trong obj có thể không thực hiện hasOwnProperty (mà tôi nghĩ mọi đối tượng javascript đã làm)

bất kỳ thông tin chi tiết nào được đánh giá cao. Cảm ơn.

// The cornerstone, an `each` implementation, aka `forEach`. 
    // Handles objects with the built-in `forEach`, arrays, and raw objects. 
    // Delegates to **ECMAScript 5**'s native `forEach` if available. 

    var each = _.each = _.forEach = function(obj, iterator, context) { 

    if (obj == null) return; 
    if (nativeForEach && obj.forEach === nativeForEach) { 
     obj.forEach(iterator, context); 
    } else if (obj.length === +obj.length) { 
     for (var i = 0, l = obj.length; i < l; i++) { 
     if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return; 

     } 
    } else { 
     for (var key in obj) { 
     if (hasOwnProperty.call(obj, key)) { 
      if (iterator.call(context, obj[key], key, obj) === breaker) return; 
     } 
     } 
    } 
    }; 
+0

'+ obj.length' là toán tử cộng nhất unary javascript. xem: http://xkr.us/articles/javascript/unary-add/ – mikeycgto

+0

Vì vậy, tuyên bố là một kiểm tra để đảm bảo tài sản dài của obj thực sự là một con số? – user772110

+0

câu lệnh '+ obj.length' chuyển' obj.length' thành một số – mikeycgto

Trả lời

5

này:

+obj.length 

... sẽ làm một sự chuyển đổi toNumber vào giá trị của length.

Dường như họ đang đảm bảo rằng length tham chiếu một số bằng cách thực hiện chuyển đổi toNumber và xác minh rằng số đó vẫn bằng số sau khi chuyển đổi.

Nếu có, chúng giả định rằng đó là một mảng hoặc ít nhất một đối tượng giống như mảng để lặp lại.

Nếu không, chúng giả định rằng việc liệt kê tất cả các cặp giá trị khóa là mong muốn.

var obj = { 
    length:null, 
    someprop:'some value' 
}; 

obj.length === +obj.length; // false, so do the enumeration 
var obj = { 
    length: 2, 
    "0":'some value', 
    "1":'some other value' 
}; 

obj.length === +obj.length; // true, not an actual Array, 
          //  but iteration is still probably wanted 

Tất nhiên bạn có thể có một đối tượng với một tài sản đó là một số nguyên thủy length, nhưng vẫn có ý định liệt kê các thuộc tính.

var obj = { 
    length: 2, 
    "prop1":'some value', 
    "prop2":'some other value' 
}; 

obj.length === +obj.length; // true, it will iterate, but it would 
          //   seem that enumeration is intended 
Các vấn đề liên quan