什么是迭代对象的正确方法?

时间:2015-08-19 14:30:49

标签: javascript

我一直使用

for( x in object ){}

但我刚来了accros

for( var x in object){}

我知道常规

中的var问题
for( var i=0;i<10;i++){}

语句,它在递归函数中咬了我一次, 但在使用x in时是否重要?...

1 个答案:

答案 0 :(得分:4)

重新var部分:

  

使用x in时是否重要?

<强> 的即可。声明变量非常重要总是。如果你没有,并且你正在使用松散模式,那么你就会成为The Horror of Implicit Globals的牺牲品。 (在严格模式下,它是一个很好的可检测错误。使用严格模式。)这会使你陷入递归函数,并在任何大量其他非递归情况下。

您不必在 for构造中声明,只需确保在某处声明它。

重新&#34;什么是迭代对象的正确方法?&#34;

有几种正确的方法。 Like Mathletics,我偏爱使用Object.keys(...).forEach(...)

&#13;
&#13;
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;
&#13;
&#13;

请注意,Object.keys只会查看对象的拥有属性,而不会查看其原型的属性。

我喜欢它的原因是它为我提供了一个很好的自包含范围,用于我在每个&#34;循环&#34;迭代。如果您担心这些回调的运行时成本,don't be

但您也可以使用for in循环。如果这样做,您可能会或可能不想包含hasOwnProperty,具体取决于您是否要访问原型属性。

&#13;
&#13;
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;
&#13;
&#13;

在没有使用适当的安全措施的情况下,不要在数组上使用for-in;更多关于this answer中的原因(以及您的替代方案)。