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,那必然就是不可枚举的了。

浙公网安备 33010602011771号