js中for in 可以遍历对象或数组的显性属性,也就是说我们自己定义的属性是可以遍历的,那些原型上默认已有的属性,例如:Object.prototype.toString、Object.prototype.hasOwnProperty 是遍历不出来的。

for in 的基本规则如上,不过还有“坑”的地方需要我们注意:

1、for in循环出的值不一定是按顺序的。代码如下:

var b = {3:1,42:2,11:3}

for( var key in b ){

    alert( b[key] )

}

低版本浏览器弹窗的顺序是:1、2、3。现代浏览器弹窗的顺序是1、3、2。

2、在原型上加扩展方法,会被for in 出来。代码如下:

Object.prototype.test = "I am test"

var b = {"name":"txj"}

for( var key in b ){

    alert(key + " : "+ b[key])

}

我们手动加在原型上的方法,for in的时候会被遍历出来。一般我们遍历对象并不需要其原型的属性,所以遍历时最好Object.prototype.hasOwnProperty方法进行判断。

3、在实例中定义原型中已有的方法,浏览器for in 情况不一致。代码如下:

var b = {"name":"txj"}

b.toString = function(){ alert("I am toString") }

for( var key in b ){

    alert(key + " : "+ b[key])

}

我们给b实例加了一个原型上已有的方法toString。现代浏览器能循环出toString 低版本浏览器却不能。所以给实例定属性名时,不要和原型已有的一致。

4、各浏览器循环出的属性顺序不同。代码与2中的一样:

Object.prototype.test = "I am test"

var b = {"name":"txj"}

for( var key in b ){

    alert(key + " : "+ b[key])

}

现代浏览器先循环实例中的属性,再循环原型中的属性。低版本浏览器相反。

这让我想到了jQuery对$.isPlainObject()方法实现的一段代码:

// Own properties are enumerated firstly, so to speed up,

// if last one is own, then all properties are own.

var key

for ( key in obj ) {}

return key === undefined || hasOwn.call( obj, key );

它这里说如果一个对象的最后一个属性是实例自己的属性,那么所有的属性都是实例自己的属性。这对低版本浏览器来说应该是不对的。所以jquery后来又加了如下代码修复:

复制代码

// Support: IE<9

// Handle iteration over inherited properties before own properties.

if ( support.ownLast ) {

    for ( key in obj ) {

        return hasOwn.call( obj, key );

    }

}

js的for in具有不适应性(转)的更多相关文章

  1. js模拟抛出球运动

    js练手之模拟水平抛球运动 -匀加速运动 -匀减速运动 模拟运动有些基本的思路,当前所在点的坐标,元素的长宽是多少,向右/向下运动x/y增加,向上/向左运动x/y减少,运动的路程是多少,用什么方程进行 ...

  2. [JS进阶] 编写可维护性代码 (1)

    今天的web应用大至成千上万行的javascript代码,执行各种复杂的过程,这种演化让我们开发者必须得对可维护性有一定的认识!编写可维护性代码很重要,很多情况下我们是以他人的工作成果为基础,确保代码 ...

  3. 原生JS和JQuery代码编写窗口捕捉函数和页面视觉差效果(scroll()、offsetTop、滚动监听的妙用)

    想实现窗口滚动到一定位置时,部分网页的页面发生一些变化,但是手头没有合适的插件,所以就想到自己编写一个简易的方法, 想到这个方法要有很高的自由度和适应性,在这,就尽量的削减其功能,若有错误的地方或者更 ...

  4. 前端基础面试题(JS部分)

    1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined.Null.Boolean.Number.String 值类型:数值.布尔值.null.und ...

  5. node.js之十大Web框架

    之前接触过Node.js是因为好奇大前端越来越能干了,连我后台的饭碗都要抢了,太嚣张了,于是我想打压打压它,然后就这样接触它了.再到后来是因为Settings-Sync插件二次开发,我需要用node. ...

  6. 13 款惊艳的 Node.js 框架——第2部分

    [编者按]本文作者为 Peter Wayner,主要介绍13款至精至简的 Node.js 框架,帮助你简化高速网站.丰富 API 以及实时应用的开发流程.本文系国内 ITOM 管理平台 OneAPM ...

  7. 阿里云ECS安装最新版本Node.js

    原文  http://www.w3ctech.com/topic/1610 主题 Node.js操作系统服务器 我的ECS实例是Ubuntu操作系统,直接使用 apt-get install node ...

  8. 前端读者 | 百度前端编码规范(JS)

    本文来自:百度FEX 1 前言 JavaScript在百度一直有着广泛的应用,特别是在浏览器端的行为管理.本文档的目标是使JavaScript代码风格保持一致,容易被理解和被维护. 虽然本文档是针对J ...

  9. 互联网部-供应商团队js规范

    文件命名 页面.js文件命名:采用中划线连接方式,比如说: error-report.html js文件夹命名:scripts 公共js命名:common.js 文件结构组织 每个页面中中独有的js文 ...

随机推荐

  1. js获取服务器时间

    Ajax HTTP Head法原理:一般服务器在发送静态页面的时候(apache, nginx, lighttpd就目前所知)都是会在 HTTP 头里带一个Date的头信息的,那么我用Ajax直接取头 ...

  2. DF学Mysql(三)——索引操作

    概要: 数据库对象索引其实与书的目录非常相似,主要是为了提高从表中检索数据的速度. 由于数据存储在数据库表中,所以索引是创建在数据库表对象上的,由表中的一个字段或多个字段生成的键组成,这些键存储在数据 ...

  3. poj 3159(差分约束经典题)

    题目链接:http://poj.org/problem?id=3159思路:题目意思很简单,都与给定的条件dist[b]-dist[a]<=c,求dist[n]-dist[1]的最大值,显然这是 ...

  4. volatile 关键字的复习

    今天早上看何登成的微博(http://hedengcheng.com/?p=725) 对volatile 关键字语意进行了深入分析. 看完之后,用自己的话总结如下: 1.c/c++ volatile中 ...

  5. webmatrix

    http://www.microsoft.com/web/webmatrix/ WebMatrix is a free, lightweight, cloud-connected web develo ...

  6. 华为OJ:字符串加解密

    题目描述 1.对输入的字符串进行加解密,并输出. 2加密方法为: 当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B:字母Z时则替换为a: 当内容是数字时则把该 ...

  7. iOS 关于微信检测SDK应用的原理浅析

    微信作为一个开放平台,各方面都是做得比较好的,推出了SDK之后,微信与使用了SDK的应用便能进行更多交互.但在iOS平台上,应用间交换数据还是相对麻烦的,那么微信为什么能直接在应用检测到其他使用了SD ...

  8. 299. Bulls and Cows

    题目: You are playing the following Bulls and Cows game with your friend: You write down a number and ...

  9. Data Flow ->> Character Map

    这个组件可以实现几个功能,可以选择替换或者生成新的字段传递给下游用. 1)中文简体转繁体 2)英文字母大小写转换 3)字符在半角和全角间转换 4)byte字节倒转过来

  10. 用rbenv给整个系统安装ruby(所有用户都可用)

    rbenv非常好用,但有一个小问题,每个用户都需要单独安装和设置版本. 下面安装步骤可以安装在/usr/local/rbenv下,所有用户都可以共享rbenv.   #rbenv安装(/usr/loc ...