JavaScript中for..in循环陷阱介绍

大家都知道在JavaScript中提供了两种方式迭代对象:
(1)for 循环;
(2)for..in循环;
使用for循环进行迭代数组对象,想必大家都已经司空见惯了。但是,使用for.. in循环时,大家可要注意了,为什么这么说呢?大家听我娓娓道来....
javascript提供了一种特殊的循环(也就是for .. in循环),用来迭代对象的属性或数组的每个元素,for...in循环中的循环计数器是字符串,而不是数字。它包含当前属性的名称或当前数组元素的索引。
案例一:


代码如下:

//使用for..in循环遍历对象属性
varperson={
name: "Admin",
age: 21,
address:"shandong"
};
for(vari in person){
console.log(i);
}

执行结果为:
name
age
address
当遍历一个对象的时候,变量 i 也就是循环计数器 为 对象的属性名


代码如下:

//使用for..in循环遍历数组
vararray = ["admin","manager","db"]
for(vari in array){
console.log(i);
}

执行结果:
0
1
2
当遍历一个数组的时候,变量 i 也就是循环计数器 为 当前数组元素的索引
案例二:
但是,现在看来for .. in循环还挺好用啊,不过,别高兴太早,看看下面的例子:


代码如下:

var array =["admin","manager","db"];
//给Array的原型添加一个name属性
Array.prototype.name= "zhangsan";
for(var i in array){
alert(array[i]);
}

运行结果:
admin
manager
db
zhangsan
咦,奇观了,怎么平白无故的冒出来一个zhangsan
现在,再看看使用 for循环会怎样?


代码如下:

vararray = ["admin","manager","db"];
//给Array的原型添加一个name属性
Array.prototype.name = "zhangsan";
for(var i =0 ; i<array.length; i++){
alert(array[i]);
};

运行结果:
admin
manager
db
哦, 现在明白了,for..in循环会把某个类型的原型(prototype)中方法与属性给遍历出来,所以这可能会导致代码中出现意外的错误。为了避免这个问题,我们可以使用对象的hasOwnProperty()方法来避免这个问题,如果对象的属性或方法是非继承的,那么hasOwnProperty() 方法返回true。即这里的检查不涉及从其他对象继承的属性和方法,只会检查在特定对象自身中直接创建的属性。
案例三:


代码如下:

vararray = ["admin","manager","db"];
Array.prototype.name= "zhangshan";
for(vari in array){
//如果不是该对象自身直接创建的属性(也就是该属//性是原型中的属性),则跳过显示
if(!array.hasOwnProperty(i)){
continue;
}
alert(array[i]);
}

运行结果:
admin
manager
db
一切又完好如初,哎,不知道,同志们看完有什么感受,是不是有种“拨开云雾见晴天”的感觉啊,呵呵

(0)

相关推荐

  • 比较搞笑的js陷阱题

    看如下代码: 复制代码 代码如下: var a = function(t) { return t; } (1 + 2).toString(); alert(a); 结果是多少? 其实主要问题出在第一行后面没有分号,所以其实是var a = function(t) { return t; }(1 + 2).toString(); 先建立变量a,然后执行赋值语句,匿名函数传入参数1+2执行,返回结果.toString(),赋值给a. 关于这种function() {}()的写法,具体可参看js的命名

  • JavaScript 存在陷阱 删除某一区域所有节点

    比较简单的,例如:有一区域<div id="newbody" ></div>,现要求删除其中所有节点.相信很多人会这样写: 复制代码 代码如下: var divpanel = document.getElementById("newbody"); var controlinfo= divpanel.childNodes; for(var index = 0;index < controlinfo.length ;index++) { d

  • JavaScript的9个陷阱及评点分析

    1. 最后一个逗号 如这段代码,注意最后一个逗号,按语言学角度来说应该是不错的(python的类似数据类型辞典dictionary就允许如此).IE会报语法错误,但语焉不详,你只能用人眼从几千行代码中扫描. <script>   var theObj = {         city : "Boston",         state : "MA",   } </script>  2. this的引用会改变 如这段代码: <input 

  • 在JavaScript中遭遇级联表达式陷阱

    依稀还记得,在学习C语言的库函数时,很多字符串操作相关的函数都会返回和结果相关的指针.其实这个返回值很多时候都并不是非常必要,因为在我们的传入的参数中,十有八九已包含了这个指针.而加上这个返回值的最大好处就是,可以让我们方便的书写出级联表达式.但是这些年的实际工作中,越发觉得级联表达式是个魔鬼馅饼. 比如在C语言中,我们熟悉的字符串操作函数strcpy,strcat等,它们的原形一般是: extern char *strxxx(char *dest, char *src);     返回值cha

  • JavaScript性能陷阱小结(附实例说明)

    1.避免使用eval或者Function构造函数 2.避免使用with 3.不要在性能要求关键的函数中使用try-catch-finally 4.避免使用全局变量 5.避免在性能要求关键的函数中使用for-in 6.使用字符串累加计算风格 7.原操作会比函数调用快 8.设置setTimeout() 和 setInterval() 时传递函数名而不是字符串 9.避免在对象中使用不需要的DOM引用 10.最清晰的目标速度,最小化作用域链 11.试着在脚本中少使用注释,避免使用长变量名 12.在当前作

  • JavaScript中常见的八个陷阱总结

    前言 这里我们针对JavaScript初学者给出一些技巧和列出一些陷阱.如果你已经是一个砖家,也可以读一读. 1. 你是否尝试过对数组元素进行排序? JavaScript默认使用字典序(alphanumeric)来排序.因此, [1,2,5,10].sort()的结果是[1, 10, 2, 5]. 如果你想正确的排序,应该这样做: [1,2,5,10].sort((a, b) => a - b) 2. new Date() 十分好用 new Date()可以接收: - 不接收任何参数:返回当前时

  • 错误剖析之JavaScript的9个陷阱及评点

    来自Nine Javascript Gotchas, 以下是JavaScript容易犯错的九个陷阱.虽然不是什么很高深的技术问题,但注意一下,会使您的编程轻松些,即所谓make life easier. 笔者对某些陷阱会混杂一些评点. 1.最后一个逗号 如这段代码,注意最后一个逗号,按语言学角度来说应该是不错的(python的类似数据类型辞典dictionary就允许如此).IE会报语法错误,但语焉不详,你只能用人眼从几千行代码中扫描. var theObj = { city : "Boston

  • Javascript 陷阱 window全局对象

    function Test(){ this.name='Test'; var name=2; this.show=function(){ alert(name); alert(this.name);//显示名字 } } var test=new Test();//通过构造器创建一个对象 test.show();//输出2和'Test' ,说明对象方法访问其属性时必须加this. function Test2(){ this.name='Test2'; this.show=function(){

  • 帮助避免错误的Javascript陷阱清单

    翻译讲究"信\雅\达",我就谈不上了.希望能把文章的意思不要弄错就行. 编程的陷阱(gotcha)是指计算机系统中的意想不到的文档特征而不是bug.这些陷阱使得初学者远离javascript编程.在我看来,因为所有的浏览器都能运行javascript使得它是使用最广泛的语言之一,但它也是最少人研究的.让我们从一个基础的示例开始. 1.浮点运算 这可能是挫败一些对javascript不熟悉并准备执行一些数学运算的人的主要原因. <script>   alert(0.02 / 

  • JavaScript中常见陷阱小结

    你所创建的所有函数都是区分大小写的 单引号('字符串')和双引号("字符串")在JavaScript中没有特殊的区别,都可以用来创建字符串.但作为一般原则,大多数WEB开发者都选择使用单引号 而不是双引号,因为XHTML规范要求所有XHTML属性值都必须使用双引号括起来. JavaScript不支持重载,在JavaScript中,脚本在执行时不会顾及函数定义时的参数,而是直接使用在作用域链中最后定义的那个函数.这意味着,相同名称的函数永远只存在一个实例 闭包是与作用域相关的一个概念,它

随机推荐