我一直使用
for( x in object ){}
但我刚来了accros
for( var x in object){}
我知道常规
中的var问题for( var i=0;i<10;i++){}
语句,它在递归函数中咬了我一次, 但在使用x in时是否重要?...
答案 0 :(得分:4)
var
部分:使用x in时是否重要?
<强> 是的即可。声明变量非常重要总是。如果你没有,并且你正在使用松散模式,那么你就会成为The Horror of Implicit Globals的牺牲品。 (在严格模式下,它是一个很好的可检测错误。使用严格模式。)这会使你陷入递归函数,并在任何大量其他非递归情况下。
您不必在 for
构造中声明,只需确保在某处声明它。
有几种正确的方法。 Like Mathletics,我偏爱使用Object.keys(...).forEach(...)
:
var obj = {
a: "ay",
b: "bee",
c: "see"
};
Object.keys(obj).forEach(function(key) {
snippet.log(key + ": " + obj[key]);
});
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
请注意,Object.keys
只会查看对象的拥有属性,而不会查看其原型的属性。
我喜欢它的原因是它为我提供了一个很好的自包含范围,用于我在每个&#34;循环&#34;迭代。如果您担心这些回调的运行时成本,don't be。
但您也可以使用for in
循环。如果这样做,您可能会或可能不想包含hasOwnProperty
,具体取决于您是否要访问原型属性。
var proto = {
a: "ay (proto)",
b: "bee (proto)",
c: "see (proto)",
d: "dee (proto)"
};
var obj = Object.create(proto);
obj.a = "ay";
obj.b = "bee";
obj.c = "see";
// Includes prototype properties if not shadowed by the object's own
snippet.log("for-in without hasOwnProperty");
var key;
for (key in obj) {
snippet.log(key + ": " + obj[key]);
}
// Does not include prototype properties
snippet.log("for-in using obj.hasOwnProperty");
for (key in obj) {
if (obj.hasOwnProperty(key)) {
snippet.log(key + ": " + obj[key]);
}
}
// If you're feeling paranoid about `obj` having had
// `hasOwnProperty` overridden, you can use it from `Object.prototype`:
snippet.log("for-in using Object.prototype.hasOwnProperty");
for (key in obj) {
// Does not include prototype properties
if (Object.prototype.hasOwnProperty.call(obj, key)) {
snippet.log(key + ": " + obj[key]);
}
}
// I've never needed to do that in the real world, though
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
在没有使用适当的安全措施的情况下,不要在数组上使用for-in
;更多关于this answer中的原因(以及您的替代方案)。