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