Mar*_*ark 5 javascript foreach typeof
我正在使用Google Chrome进行此测试:与直觉相反,第一个循环警告"字符串"3次,而第二个循环警告"数字"3次.
numarray = [1, 2, 3];
//for-each loop
for(num in numarray)
alert(typeof(num));
//standard loop
for(i=0; i<numarray.length; i++)
alert(typeof(numarray[i]));
Run Code Online (Sandbox Code Playgroud)
我期待两个循环警告"数字"3次.如何在Javascript中实现第一个循环?换句话说,如果for-each是语法糖,使用标准循环的等价物是什么?
另外,有没有办法使用标准循环迭代对象的命名空间?我希望使用第二种循环来触摸某些对象的方法和属性中的每一个.我是Javascript的新手,非常感谢任何帮助,谢谢.
你在第一个循环中看到"string"返回的原因是num引用数组索引,而不是该索引的值numarray.尝试将第一个循环更改为警报num而不是,typeof num您将看到它吐出0,1和2,这是指标而不是数组的值.
当您使用for in循环时,您将迭代对象的属性,这与for第二个示例中的循环不完全相同.JavaScript中的数组实际上只是具有序列号作为属性名称的对象.就所typeof涉及的问题而言,它们被视为字符串.
编辑:
正如Matthew所指出的那样,当使用for in循环时,你不能保证以任何特定顺序获取数组中的项,部分原因是,不推荐以这种方式迭代数组.
for in鉴于此行为,filip-fku会询问何时使用它会有用.一个例子是当属性名称本身具有含义时,对于数组指示不是这种情况.例如:
var myName = {
first: 'Jimmy',
last: 'Cuadra'
};
for (var prop in myName) {
console.log(prop + ': ' + myName[prop]);
}
// prints:
// first: Jimmy
// last: Cuadra
Run Code Online (Sandbox Code Playgroud)
值得注意的是,for in循环还将遍历对象原型链的属性.因此,这通常是您想要构建for in循环的方式:
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
这将检查属性是否由对象本身定义,而不是它通过原型链继承的对象.