js中的for in循环的用法和注意事项

JavaScript for…in 语句

for…in 语句用于对数组或者对象的属性进行循环操作。

for … in 循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作。

Tip:for-in循环应该用在非数组对象的遍历上,使用for-in进行循环也被称为“枚举”。·

语法:

for (变量 in 对象)
{ 在此执行代码 }

“变量”用来指定变量,指定的变量可以是数组元素,也可以是对象的属性。

实例:使用 for … in 循环遍历数组。

<html>
<body> 
    <script type="text/javascript"> 
        var x;
        var mycars = new Array();
        mycars[0] = "Saab"; 
        mycars[1] = "Volvo";
        mycars[2] = "BMW";
        for (x in mycars)
       {
           document.write(mycars[x] + "<br />");
       } 
   </script>
</body> 
</html>

注意一:for in循环不会按照属性的下标来排列输出。

var obj = {"first":"first", "zoo":"zoo", "2":"2", "34":"34", "1":"1", "second":"second" };
for (var i in obj) {
    console.log(i);
}; 

输出: 1 2 34 first zoo second

执行时按chrome执行,先把当中的非负整数键提出来,排序好输出,然后将剩下的定义时的顺序输出。由于这个奇葩的设定,让avalon的ms-with对象排序不按预期输出了。只能强制用户不要以纯数字定义键名。

实例1:在数组的原型对象上定义了一个新的属性,使用for循环没出现问题

function getNewArray(){
    var array=[1,2,3,4,5];
    Array.prototype.age=13;
    var result = [];
    for(var i=0;i<array.length;i++){
       result.push(array[i]);
    }
    alert(result.join(''));
}

实例2:采用了for in循环,但是给我们期望的一样还是得到了12345的正确结果

function getArrayTwo(){
    var array=[1,2,3,4,5 ];
    var result=[];
    for(var i in array){
    result.push(array[i]);
}
    alert(result.join(''));
}

实例3:给原型添加属性之后,默认情况下枚举,最后输出1234513

getNewArrayTwo(){
    var array=[1,2,3,4,5 ];
    Array.prototype.age=13;
    var result=[];
    for(var i in array){
        result.push(array[i]);
    }
    alert(result.join(''));
}

所以建议不要对数组执行for in循环,事实上,在高性能javascript这本书中,也强调了for in循环的不好,因为它总是会访问该对象的原型,看下原型上是否有属性,这在无意中就给遍历增加了额外的压力。

解决方法:

如果某个对象具有给定名称的属性,那么Object.prototype.hasOwnProperty(name)返回true。如果该对象是从原型链中继承了该属性,或者根本没有这样的一个属性,则返回false。通过hasOwnProperty限定for in循环在当前中遍历,而不用去考虑它的原型属性。

function finalArray(){
    var array=[1,2,3,4,5 ];
    Array.prototype.age=13;
    var result=[];
    for(var i in array){
       if(array.hasOwnProperty(i)){
           result.push(array[i]);
       }
   } 
   alert(result.join(''));
}

注意事项:
1.有一部分浏览器,例如早期的safari浏览器,不支持这个方法
2.对象经常被用作哈希值,这就是存在hasOwnProperty被另外的属性屏蔽的风险

发布者

cylyiou

cylyiou

分享前端知识

支付宝扫码打赏微信打赏

如果文章对您有帮助,不妨移至上方按钮小额赞助我一下,让我有动力继续写出高质量的教程。

发表评论

电子邮件地址不会被公开。