我一直都在用
for( x in object ){}
但是我才来
for( var x in object){}
我知道变种很重要
for( var i=0;i<10;i++){}
语句,它在递归函数中曾经使我难过,但是当用于x in时,这有关系吗?...
var
:用于x in时有关系吗?
是的。它总是重要声明你的变量。如果您不这样做,并且使用的是宽松模式,那么您就会成为“隐式全球性恐怖”的牺牲品。(在严格模式下,这是一个很好的可检测错误。请使用严格模式。)这将在递归函数中以及在许多其他非递归情况中咬住您。
你不必声明它内部的for
构造,只要确保你的地方声明。
有几种正确的方法。像Mathletics一样,我偏爱使用Object.keys(...).forEach(...)
:
var obj = {
a: "ay",
b: "bee",
c: "see"
};
Object.keys(obj).forEach(function(key) {
snippet.log(key + ": " + obj[key]);
});
<!-- 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>
注意,Object.keys
它将仅查看对象自身的属性,而不是其原型的属性。
我喜欢它的原因是,它为我在每次“循环”迭代中所做的工作提供了一个很好的自包含范围。如果您担心这些回调的运行时成本,请不必担心。
但是您也可以只使用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
<!-- 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>
只是不要for-in
在没有适当防护措施的情况下在阵列上使用;有关此答案的原因(以及您的替代方案)的更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句