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

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

js for in的更多相关文章

  1. Vue.js 和 MVVM 小细节

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...

  2. js学习笔记:操作iframe

    iframe可以说是比较老得话题了,而且网上也基本上在说少用iframe,其原因大致为:堵塞页面加载.安全问题.兼容性问题.搜索引擎抓取不到等等,不过相对于这些缺点,iframe的优点更牛,跨域请求. ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  5. jquery和Js的区别和基础操作

    jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...

  6. 利用snowfall.jquery.js实现爱心满屏飞

    小颖在上一篇一步一步教你用CSS画爱心中已经分享一种画爱心的方法,这次再分享一种方法用css画爱心,并利用snowfall.jquery.js实现爱心满屏飞的效果. 第一步: 利用伪元素before和 ...

  7. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  8. JS正则表达式常用总结

    正则表达式的创建 JS正则表达式的创建有两种方式: new RegExp() 和 直接字面量. //使用RegExp对象创建 var regObj = new RegExp("(^\\s+) ...

  9. 干货分享:让你分分钟学会 JS 闭包

    闭包,是 Javascript 比较重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...

  10. JS核心系列:理解 new 的运行机制

    和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...

随机推荐

  1. 搭建Vue环境总是出错,就重新安装就好了

    总是报错,还不如重新安装.. 错误千奇百怪,解决了 这个错误又会出现另外一个. 百度了一个挺好用的e 在window下搭建Vue.Js开发环境   nodejs官网http://nodejs.cn/下 ...

  2. Tmux 的常用命令详解

    Tmux 的常用命令详解  常用命令: tmux #开启tmux tmux ls #显示已有tmux列表(C-b s) tmux attach-session -t 数字 #选择tmux C-b c ...

  3. Android性能优化典范(一)

    2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关 ...

  4. [Exception Android 19] - android.widget.HeaderViewListAdapter.isEnabled

    java.lang.IndexOutOfBoundsException: Invalid index , size at java.util.ArrayList.throwIndexOutOfBoun ...

  5. C#指南,重温基础,展望远方!(3)类型和变量

    C# 有两种类型:值类型和引用类型. 值类型的变量直接包含数据,而引用类型的变量则存储对数据(称为“对象”)的引用.对于引用类型,两个变量可以引用同一对象:因此,对一个变量执行的运算可能会影响另一个变 ...

  6. Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet] 异常

    1. 异常描述 FATAL EXCEPTION: main Process: com.whereru.greengrass.goforit, PID: 13847 java.lang.RuntimeE ...

  7. NoSQL(二)

    redis介绍 1.aof存储的文件会越来越大,当文件很大时我们可以进行一次rdb存储原来的aof文件就可以删除了,因为aof就相当与mysql中的binlog文件会一致增长,当redis里面的key ...

  8. WebKit(Blink分支)各组件的创建与逻辑关系

    从render_view_impl.cc開始说起. 1.     方法RenderViewImpl::Initialize中有: WebLocalFrame* web_frame = WebLocal ...

  9. Python Kivy 安装问题解决

    Fix: Running this was suggested by @matham in #3889 and solves the problem described below:python -m ...

  10. FPGA开发流程1(详述每一环节的物理含义和实现目标)

    要知道,要把一件事情做好,不管是做哪们技术还是办什么手续,明白这个事情的流程非常关键,它决定了这件事情的顺利进行与否.同样,我们学习FPGA开发数字系统这个技术,先撇开使用这个技术的基础编程语言的具体 ...