A hack for "for in"

for in 用于遍历对象的可枚举属性,如:

var obj = {a: 1};
for (var prop in obj) {
	alert(prop);
}

只会打印 "a"


显然属性a是可枚举属性,那什么是不可枚举属性呢?

通过JavaScript代码添加到对象的属性是可枚举的,而内部对象的预定义属性(或方法)通常是不可枚举的,如toString(), valueOf()等。

 

通常遍历对象属性会这么做:

var obj = {a: 1};
for (var prop in obj) {
	if (obj.hasOwnProperty(prop)) {
		alert(prop);
	}
}

这样可以确保打印的prop是可枚举属性,当然如果你想更严格些,就写成Object.prototype.hasOwnProperty.call(obj, prop)。


这些都是很常规的知识,今天发现一个不是那么好懂的hack,如下:

var forIn = function() {
	var empty = {};
	return function(obj) {
		for (var prop in obj) {
			if (!(prop in empty)) {
				alert(prop);
			} 
		}
	}
}();

原理就是 in运算符 会找对象的原型链,所以给个空对象,如果 prop in empty,那必然就是不可枚举的了。

posted @ 2011-12-28 17:57  越己  阅读(252)  评论(0编辑  收藏  举报