for...in主要用于对数组和对象的属性进行遍历。for ... in 循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作。

语法:for (variable in object) {...}

variable:每次迭代,一个不同的属性名将会赋予variable。
object:可枚举属性被迭代的对象。

对数组操作

        var a=[5,4,3,2,1];
var x=0;
console.log(typeof x);//number
for (x in a) {
console.log("a["+x+"]: "+a[x]);
console.log(typeof x);//string
}
console.log(x);//
console.log(typeof x);//string
//output:
// a[0]: 5
// a[1]: 4
// a[2]: 3
// a[3]: 2
// a[4]: 1

可以发现在for in函数中变量以字符串的形式出现,这时候在函数中操作a[x+1]的话是无效的,x+1会进行字符串拼接。

对象操作

var obj={"1":"first",
"two":"zoo",
"3":"2",
"three":"34",
"4":"1",
"2":"second"
};
for (var i in obj) {
console.log(i+":"+obj[i]);
};
//output:
//1:first
//2:second
//3:2
//4:1
//two:zoo
//three:34

可发现,for...in 并不能够保证返回的是按一定顺序的索引,但是它会返回所有可枚举属性,包括继承属性。

给原型添加属性之后,默认情况下枚举,会把原型属性一并输出,如下所示。由于它总是会访问该对象的原型,看下原型上是否有属性,这在无意中就给遍历增加了额外的压力。

例:

function fun4(){
var a=[1,2,3,4,5];
Array.prototype.age=13;
for(var i in a){
console.log("a["+i+"]: "+a[i]);
}
}
//outuput:
//a[0]: 1
//a[1]: 2
//a[2]: 3
//a[3]: 4
//a[4]: 5
//a[age]: 13

解决方法:

如果你只要考虑对象本身的属性,而不是它的原型,那么使用 getOwnPropertyNames() 或执行  hasOwnProperty() 来确定某属性是否是对象本身的属性 (也能使用propertyIsEnumerable)。

下面利用 hasOwnProperty() 的方法使隐藏的继承属性不会被显示。如果该对象是从原型链中继承了该属性,或者根本没有这样的一个属性,则返回false。如果某个对象具有给定名称的属性,则返回true。

function fun4(){
var a=[1,2,3,4,5];
Array.prototype.age=13;
for(var i in a){
if( a.hasOwnProperty( i ) ) {
console.log("a["+i+"]: "+a[i]);
}
}
}
//outuput:
//a[0]: 1
//a[1]: 2
//a[2]: 3
//a[3]: 4
//a[4]: 5

在迭代进行时被添加到对象的属性,可能在之后的迭代被访问,也可能被忽略。通常,在迭代过程中最好不要在对象上进行添加、修改或者删除属性的操作,除非是对当前正在被访问的属性。这里并不保证是否一个被添加的属性在迭代过程中会被访问到,不保证一个修改后的属性(除非是正在被访问的)会在修改前或者修改后被访问,不保证一个被删除的属性将会在它被删除之前被访问。

Note: 意思就是尽量不要对数组对象使用for in遍历。

不要用for in语句对数组进行遍历的更多相关文章

  1. Java使用foreach语句对数组成员遍历输出

    /** * 本程序使用foreach语句对数组成员进行遍历输出 * @author Lei * @version 2018-7-23 */ public class ForeachDemo { pub ...

  2. Javascript技巧之不要用for in语句对数组进行遍历

    一,为什么不要用for in语句 jqModal这个jquery插件估计很多人都使用过,在jqModal源码内部,有一个函数为hs,其中有个嵌套循环如下, for(var i in {jqmShow: ...

  3. 使用typedef语句定义数组类型

    使用typedef语句定义数组类型     1. 一维数组类型的定义格式 typedef <元素类型关键字><数组类型名>[<常量表达式>]; 例如: (1) ty ...

  4. 使用foreach语句对数组成员进行遍历

    /*** 使用foreach语句对数组成员进行遍历* **/ public class ForeachDemo { public static void main(String[] args) { i ...

  5. for+next()实现数组的遍历及while list each 的使用

    //要求使用for循环语句来完成该数组的遍历//输出每一项的键名和对应值:    $a = array(           'a' => 34,           5 => 51,  ...

  6. 手写js代码(一)javascript数组循环遍历之forEach

    注:原文地址http://blog.csdn.net/oscar999/article/details/8671546 我这里是仿照学习! 1.js的数组循环遍历 ①数组的遍历首先想到的是for()循 ...

  7. 初识Javascript.03 -- switch、自增、while循环、for、break、continue、数组、遍历数组、合并数组concat

    除了注意大小写,别的木啥了 Switch语句 Switch(变量){ case 1: 如果变量和1的值相同,执行该处代码 break; case 2: 如果变量和2的值相同,执行该处代码 break; ...

  8. java 数组声明定义 数组内存分配 数组初始化 数组引用 数组的遍历

    一,数组的定义 Java 中定义数组的语法有两种: 1. type arrayName[]; 2. type[] arrayName;type 为Java中的任意数据类型,包括基本类型和组合类型,ar ...

  9. PHP之旅3 php数组以及遍历数组 以及each() list() foreach()

    php的数组的定义 <?php //php中定义数组时可以通过索引直接进行赋值: $mArr[0]="哈哈"; $mArr[1]=70; $mArr[2]='haha'; e ...

随机推荐

  1. MIT提出精细到头发丝的语义分割技术,打造效果惊艳的特效电影

    来自 MIT CSAIL 的研究人员开发了一种精细程度远超传统语义分割方法的「语义软分割」技术,连头发都能清晰地在分割掩码中呈现.在对比实验中,他们的结果远远优于 PSPNet.Mask R-CNN. ...

  2. 基于Linux的Samba开源共享解决方案测试(五)

    对于客户端的网络监控如图: 双NAS网关50Mb码率视音频文件的稳定写测试结果如下: 100Mb/s负载性能记录 NAS网关资源占用 稳定写 稳定写 CPU空闲 内存空闲 网卡占用 NAS1 16个稳 ...

  3. C# window Service实现调用有UI的应用程序(关于win xp以后的window系统)

    我开发的系统中有一接口程序(这里就称Task,是一个C#的Console Application)经常无故的死掉,导致第二天的数据不能正常解析,所以,我写了一个window service去监视Tas ...

  4. CSS层叠样式

    为了让网页元素的样式更加丰富,也为了让网页的内容和样式能拆分开,CSS由此思想而诞生,CSS是 Cascading Style Sheets 的首字母缩写,意思是层叠样式表.有了CSS,html中大部 ...

  5. smfony设置量表之间的关系

    设置量表之间的关系 验证是否ok 查看我们定义是否有问题 数据库操作 http://www.2cto.com/database/201504/387197.html  设置时间段数据库自动插入时间 不 ...

  6. smyfony2-curd-数据库创建

    1创建类

  7. Win10 C盘根目录权限

    cmd管理员运行 icacls c:\ /setintegritylevel M c盘属性,安全,完全控制.

  8. position_css

    position: 定位,元素的定位与这五个属性相关.left,top,bottom,right,z-index 1. static (默认值).没有定位,五个属性都不起作用. 2. inherit ...

  9. Python之从头开始建立项目流程

    一,需求是在桌面建立一个名字为美妆的项目 1)cd desktop 2)mkdir meizhuang_server 3)安装虚拟环境 要在meizhuang_server文件夹下  pipenv - ...

  10. SpringMVC post和get乱码解决方式

    如何解决POST请求中文乱码问题,GET的又如何处理呢? 在web.xml中加入: <filter>     <filter-name>CharacterEncodingFil ...