我是JavaScript的新手,目前正在学习所谓的for...in
循环。
在JavaScript编码时,是否真的需要使用这些循环呢?
我可以看到所有其他类型的循环都很有用,但不包括这个。
如果可能,请举一个现实生活中的例子,帮忙解答一下。
我是JavaScript的新手,目前正在学习所谓的for...in
循环。
在JavaScript编码时,是否真的需要使用这些循环呢?
我可以看到所有其他类型的循环都很有用,但不包括这个。
如果可能,请举一个现实生活中的例子,帮忙解答一下。
Javascript中只有Array对象可以使用普通的for(;;)
循环进行迭代。而for..in
则用于枚举非数组对象:
for (var i in obj) {
if (obj.hasOwnProperty(i)) { // if you don't want to access prototype properties
alert(i);
alert(obj[i]);
}
}
通常用于循环遍历某个集合。例如,由于每个JavaScript对象都可以被视为属性的集合,因此您可以以这种方式枚举属性。
//let's loop throug all properties of a "document"
//we don't know what these will be
var txtProps = "";
for (var prop in window.document) {
txtProps += prop + "\n";
}
alert(txtProps);//pops out a message showing a looong list of all properties
我认为只要你理解一个对象可以保存不止简单的变量,那么这就没问题了。考虑一下这个例子,它是从w3schools.com修改而来,用来说明这一点:
<script type="text/javascript">
//This is probably as you expect:
var person={fname:"John",lname:"Doe",age:25};
//This is probably unexpected and unwanted, but is valid and will be an output of the for...in loop:
person.f = function(){
alert("Hi");
};
//Use typeof() function to check that the data type is what you expect:
for (x in person){
document.write(typeof(person[x]) + " ");
}
</script>
for (var i in myObject) {
alert(myObject[i]);
}
所以,如果我们设置的唯一属性是myProperty
,那么i
将等于"myProperty"
(请注意,它是一个字符串,这使得它比仅仅是一个变量名更具动态性)。
然而,这里有一个巨大的“但是”。对象有一个称为原型的东西,这些原型有自己的属性和方法。如果我执行以下操作:
for (var i in myArray) {
alert(i + ': ' + myArray[i]);
}
...我不仅会通过数字值(1、2、3等)获得警报,还会获得数组的属性,例如length
和方法,例如join
。这些属性实际上属于Array对象的原型,通过以下方式可以过滤掉原型属性:
for (var i in myArray) {
if (myArray.hasOwnProperty(i)) {
alert(i + ': ' + myArray[i]);
}
}
现在我只会再次收到数字值的警报,这意味着这几乎与for (var i = 0;; i < myArray.length; i++)
完全相同。为什么告诉你这个呢?因为所有对象都有原型,不仅仅是数组。每个对象都是从Object
对象继承而来的,所以如果有人定义了Object.prototype.myProperty = "some string value"
,那么它将始终显示在页面其余部分使用的任何for...in
循环中。幸运的是,hasOwnProperty
方法本身属于Object.prototype
,因此您应该始终在for...in
循环中使用它。
因此,这里是一个完整的for...in
示例:
// This is just one way of defining an object. We could also use a constructor function, or `new Object()`
var myObject = {
aProperty : "my first property value",
anotherProperty : "second property value"
4 : "numeric property names work too, you know"
}
for (var i in myObject) {
if (myObject.hasOwnProperty(i)) {
document.write(i + ': ' + myObject[i] + '<br />\n');
}
}
输出:
aProperty: my first property value
anotherProperty: secondPropertyValue
4: numeric property names work too, you know
希望这样解释清楚了。
for in
和for
都有特定的用途。让我们来看看一些。
如果你有一个对象
var obj = { one: 1, two: 2 };
然后您可以使用for in
循环迭代它的属性,例如:
for( var i in obj ) console.log( obj[i] ); //use obj.hasOwnProperty(i) to exclude prototype properties
obj[0]
将是未定义的。这是另外一个事实,获取对象的长度将比简单地编写obj.length
更加复杂。当然,如果您有数字属性,则可以使用for循环,但是对于对象迭代,for in
更自然适合。 var array = [1,2]
从技术上讲,您可以使用两者,但建议您使用for循环。原因如下:
为了说明第二点,让我们扩展数组。
Array.prototype.print_array = function(){ console.log(this) };
for in
来迭代数组。for( var i in array ) console.log( array[i] );
会产生
1
2
function (){ console.log(this) } // the prototype property was iterated over also
使用for
循环遍历数组
for( var i =0; i < array.length; i++) console.log( array[i] );
将会产生预期的结果。
1
2
for in
,而对于数组迭代,请使用for
。
arguments
是“只有数组对象才能被迭代”的一个例外,当然for
循环仅仅是偶尔用于遍历数组,但我认为这些事情并不真正重要于问题本身。 - deviousdodolength
属性。但是我认为在这个阶段,OP 真的不需要学习所有这些。 - Nathan MacInnes