迭代javascript对象和valueOf toString方法

时间:2011-09-22 18:27:21

标签: javascript object

var x = {
    article: "bla bla bla ",
    journal: "le monde ",
    magazine: "playboy"
};

for (var i in x) { 
    alert(i + " "+ x[i]);
}

每个JS对象都有valueOftoString方法。当我遍历x对象的属性时,为什么我看不到它们?

2 个答案:

答案 0 :(得分:0)

引擎专门隐藏这些方法的枚举。

这样做的目的是允许迭代Object属性而不会被对象的原型属性所困扰。这样,您可以迭代数组索引,将对象用作哈希表并迭代其属性。

然而,这很容易被打破。例如,如果在Object.property中使用自定义方法,它将在枚举所有对象的属性时突然出现:

var obj = { foo: 0 };

Object.prototype.bar = 1;

// prints 'foo' and 'bar'
for (var k in obj) {
    console.log(k);
}

这使扩展Object.prototype变得很危险。

您可以使用Object.hasOwnProperty方法测试属性是来自对象本身还是原型:

// prints 'foo'
for (var k in obj) {
    if (!obj.hasOwnProperty(a)) continue;
    console.log(k);
}

或者,您可以使用Object.defineProperty定义不可枚举的属性,如果您不关心旧浏览器:

Object.defineProperty(Object.prototype, 'bar', {value: 1, enumerable: false});

// prints 'foo'
for (var k in obj) {
    console.log(k);
}

答案 1 :(得分:0)

它们不是可枚举的属性。尝试Object.getOwnPropertyNames。仅适用于某些浏览器:

这个DOESNT检查原型,所以你需要做一些非常复杂的事情:

var x, y, z, getAllKeys;
getAllKeys = function (obj,ar) {
    ar = ar || [new Array];
    ar[0] = ar[0].concat(Object.getOwnPropertyNames(obj));
    if (obj !== Function.prototype && Object.getPrototypeOf(obj)) {
        getAllKeys(Object.getPrototypeOf(obj),ar);
    }
    return ar[0];
}
console.log (getAllKeys(new Array));
for (x in y = getAllKeys(z = new Array)) {
    var key = y[x];
    var value = z[y[x]];
}

责备JavaScript是荒谬的,看起来像汇编,也许jASM会是一个更好的名字? (笑话)