循环JavaScript对象的最安全的方法

时间:2011-07-28 22:12:52

标签: javascript

我想创建一个对象来保存一堆属性,比如

var o = {x: 20, y: 40, color: 'red'};

可以在对象的整个生命周期中添加更多属性,因此我想要一种通用的方法来循环遍历属性以便稍后设置它们。我知道Object.prototype是否被搞砸了,只是

for(var prop in o) { ... }

将导致其属性也被循环。还有什么其他因素会导致这种情况陷入困境,最安全的循环方式是什么?

3 个答案:

答案 0 :(得分:7)

如果要迭代对象上的所有属性,那么继承的属性是您必须处理的唯一真正的问题。 The Object.prototype.hasOwnProperty() method可用于确认属性直接存在于对象中,而不仅仅是继承属性。

Object.prototype.example = 2;
var o = {x: 4, y: 6};

for (var prop in o) {
    if (Object.prototype.hasOwnProperty.call(o, prop)) {
        console.log(o[prop]);
    }
}

这将打印对象本身的所有属性,但不会打印继承的.example

答案 1 :(得分:5)

作为@Jeremy Banks建议的替代方法,Object.keys方法也只返回对象的“自己的”属性名称。因此,ES5解决方案:

var o = { x: 20, y: 40, color: 'red' };

Object.keys(o).forEach(function (prop) { /* ... */ });

答案 2 :(得分:1)

使用object.hasOwnProperty()

var buz = {
    fog: 'stack'
};

for (var name in buz) {
    if (buz.hasOwnProperty(name)) {
        alert("this is fog (" + name + ") for sure. Value: " + buz[name]);
    }
    else {
        alert(name); // toString or something else
    }
}

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/hasOwnProperty#Example.3a_Iterating_over_the_properties_of_an_object