我有办法循环遍历Javascript对象的内置属性吗?
for ... in让我接近我想去的地方,但是“A for ... in循环不会迭代内置属性。”
答案 0 :(得分:17)
我意识到这个问题已经有三年了,但是现在,有了ES5,它有可能:
>>> Object.getOwnPropertyNames(Object)
["prototype", "getPrototypeOf", "getOwnPropertyDescriptor", "keys", "defineProperty", "defineProperties", "create", "getOwnPropertyNames", "isExtensible", "preventExtensions", "freeze", "isFrozen", "seal", "isSealed", "length", "arity", "name", "arguments", "caller"]
答案 1 :(得分:5)
答案是否定的。您不能枚举不可枚举的属性。然而,至少有两种方法可以解决这个问题。
第一种是生成所有可能的字符组合以用作测试属性名称(想想:a,b,c,... aa,ab,ac,ad,...)。鉴于标准社区以提出非常长的方法名称(getElementsByTagNames,propertyIsEnumerable)而闻名,这种方法需要一些耐心。 : - )
另一种方法是从某些预定义列表中测试已知的本机属性。
例如:对于array
,您将测试Function.prototype
的所有已知原生属性:
prototype caller constructor length name apply call toSource toString valueOf toLocaleString
......以及从Object.prototype
继承的东西:
__defineGetter__ __defineSetter__ hasOwnProperty isPrototypeOf __lookupGetter__
__lookupSetter__ __noSuchMethod__ propertyIsEnumerable unwatch watch
......以及从Array
继承的东西:
index input pop push reverse shift sort splice unshift concat join slice indexOf lastIndexOf
filter forEach every map some reduce reduceRight
..最后,以及(可选)您正在测试的对象的每个可枚举属性:
for (var property in myArrayObject) myPossibleProperties.push( property );
然后,您将能够测试其中的每一个,以查看它们是否存在于对象实例上。
这不会显示未知的非可枚举成员(未记录,或由其他脚本设置),但允许您列出可用的本机属性。
我在Mozilla Developer Center和MSDN上找到了有关原生Array
媒体资源的信息。
答案 2 :(得分:0)
当你说“内置属性”时,你正在谈论哪一组属性?
来自Douglas Crockford的'JavaScript - The Good Parts':
for in语句可以循环遍历所有 对象中的属性名称。 枚举将包括所有 属性 - 包括函数和 您可能的原型属性 不感兴趣 - 所以它是 过滤掉你的价值所必需的 不想要。最常见的过滤器 是hasOwnProperty方法和 使用typeof排除函数:
var name; for (name in another_stooge) { if (typeof another_stooge[name] !== 'function') { document.writeln(name + ': ' + another_stooge[name]); } }
答案 3 :(得分:-1)
这适用于JSON。它没有经过多少测试:
<style>
.tree {
margin-left:5px;
}
</style>
<div id='out'></div>
<script type="text/javascript">
data = {"feep":{"bar":{"baz":"37628","quux":{"a":"179","b":"7"}},"foo":"1025"},"Bleh":"1234"}
$('out').innerHTML = renderJSON(data)
function renderJSON(obj) {
var keys = []
var retValue = ""
for (var key in obj) {
//$('out').innerHTML = $('out').innerHTML +"<br />" + key + ", " + obj[key]
if(typeof obj[key] == 'object') {
retValue += "<div class='tree'>" + key
retValue += renderJSON(obj[key])
retValue += "</div>"
}
else {
retValue += "<div class='tree'>" + key + " = " + obj[key] + "</div>"
}
keys.push(key)
}
return retValue
}
</script>
答案 4 :(得分:-1)
否则您无法列出对象的内置属性。 但是你可以参考实施者的参考。 例如,要了解在Firefox上实现的Math对象的所有方法和属性,您将使用Firefox的Javascript Math Reference:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math