var x = {
article: "bla bla bla ",
journal: "le monde ",
magazine: "playboy"
};
for (var i in x) {
alert(i + " "+ x[i]);
}
每个JS对象都有valueOf
和toString
方法。当我遍历x
对象的属性时,为什么我看不到它们?
答案 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会是一个更好的名字? (笑话)