代码改变世界

JavaScript Patterns 2.4 For-in loop

2014-05-19 11:06  小郝(Kaibo Hao)  阅读(332)  评论(2编辑  收藏  举报

Principle

  1. Enumeration should be used to iterate over nonarray objects.
  2. It's important to use the method hasOwnProperty()when iterating over object properties to filter out properties that come down the prototype chain. 
// the object
var man = {
    hands: 2,
    legs: 2,
    heads: 1
};

// somewhere else in the code

// a method was added to all objects
if (typeof Object.prototype.clone = = = "undefined") {
    Object.prototype.clone = function () {};
}

// 1. for-in loop
for (var i in man) {
    if (man.hasOwnProperty(i)) { // filter
        console.log(i, ":", man[i]);
    }
}

/*
    result in the console
    hands : 2
    legs : 2
    heads : 1
*/

// 2. antipattern:
// for-in loop without checking hasOwnProperty()
for (var i in man) {
    console.log(i, ":", man[i]);
}

/*
    result in the console
    hands : 2
    legs : 2
    heads : 1
    clone: function()
*/

Call method off of the Object.prototype to avoid naming collisions that man object redefined hasOwnProperty. And use a local variable to cache it.

var i,
    hasOwn = Object.prototype.hasOwnProperty;
    for (i in man) {
        if (hasOwn.call(man, i)) { // filter
            console.log(i, ":", man[i]);
    }
}