转自:http://www.jb51.net/article/44028.htm

for in 语句用来列举对象的属性(成员),如下

var obj = { name:"jack",

getName:function(){return this.name}

};//输出name,getName

for(var atr inobj) {

alert(atr);

}

注意了吗,没有输出obj的toString,valueOf等内置属性(或称内置成员,隐藏属性和预定义属性)。即for in用来列举对象的显示成员(自定义成员)。

如果重写了内置属性呢,下面就重写obj的toString

var obj = {name:"jack",

getName:function(){return this.name},

toString:function(){return "I'm jack."}

}for(var atr inobj) {

alert(atr);

}

会输出什么呢?

1、IE6/7/8 下和没有重写toString一样,仍然只输出name,getName

2、IE9/Firefox/Chrome/Opera/Safari下则输出name,getName,toString

如果给内置原型添加属性/方法,那么for in时也是可遍历的

Object.prototype.clone =function() {}var obj ={

name:'jack',

age:33}//name, age, clone

for (var n inobj) {

alert(n)

}

给Object.prototype添加了方法clone,for in时所有浏览器都显示了clone。

这或许还没什么,因为一般不建议去扩展内置构造器的原型,这也是Prototype.js走向没落的原因之一。jQuery和Underscore没有扩展自原型,前者在jQuery对象上做文章,后者索性将所有方法都挂在下划线上。

但有时我们为了兼容ES5或后续版本,会在不支持ES5的浏览器上(IE6/7/8)去扩展内置构造器的原型,这时for in在各浏览器中就不同了。如下

if (!Function.prototype.bind) {

Function.prototype.bind=function(scope) {var fn = this

returnfunction () {

fn.apply(scope, arguments)

}

}

}

function greet(name) {

alert(this.greet + ',' +name)

}for (var n ingreet) {

alert(n)

}

IE6/7/8输出了bind,其它浏览器则无。因为现代浏览器中bind是原生支持的,for in不到,IE6/7/8则是给Function.prototype添加了bind。

总结下:在跨浏览器的设计中,我们不能依赖于for in来获取对象的成员名称,一般使用hasOwnProperty来判断下。

for ie无效 in js_关于js中for in的缺陷浅析相关推荐

  1. vue中引用js_从JS中的内存管理说起 —— JS中的弱引用

    点击上方"蓝字"关注本公众号 写在前面 在所有的编程语言中,我们声明一个变量时,需要系统为我们分配一块内存.当我们不再需要这个变量时,需要将内存进行回收(这个过程称之为垃圾回收). ...

  2. js 中meta 移除head_浅析JS中数据结构

    目录 列表(链表) 数组 栈 队列 哈希表 堆 图 二叉查找树 分享一句话:算法即原力,即正义 列表(链表) 链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的 ...

  3. js中style.display=无效的解决方法

    本文实例讲述了js中style.display=""无效的解决方法.分享给大家供大家参考.具体解决方法如下: 一.问题描述: 在js中我们有时想动态的控制一个div显示或隐藏或更多 ...

  4. draft.js_如何使用快捷方式在Draft.js中创建有序列表和无序列表

    draft.js by Andrey Semin 通过安德烈·塞米(Andrey Semin) 如何使用快捷方式在Draft.js中创建有序列表和无序列表 (How to create ordered ...

  5. 引入js_好程序员web前端教程分享js中的模块化一

    好程序员web前端教程分享js中的模块化一:我们知道最常见的模块化方案有CommonJS.AMD.CMD.ES6,AMD规范一般用于浏览器,异步的,因为模块加载是异步的,js解释是同步的,所以有时候导 ...

  6. vue main.js中引入js_手把手教你深入Vue3.0(Vue-cli4)项目打包性能优化实践

    记录了自己的博客在禁用缓存的情况下,从八九秒加载时间到最终985ms的优化实践,开启缓存的情况下能达到138ms的访问速度 本人的个人博客采用的是Vue-cli4.1.2 + typescript构建 ...

  7. ie浏览器查看vue中js_浅析 Vue.js 中那些空间换时间的操作

    Hello,各位小伙伴,接下来的一段时间里,我会把我的课程<Vue.js 3.0 核心源码解析>中问题的答案陆续在我的公众号发布,由于课程的问题大多数都是开放性的问题,所以我的答案也不一定 ...

  8. node.js中模块_在Node.js中需要模块:您需要知道的一切

    node.js中模块 by Samer Buna 通过Samer Buna 在Node.js中需要模块:您需要知道的一切 (Requiring modules in Node.js: Everythi ...

  9. 如何在Node.js中退出

    用于退出的命令是什么? (即终止Node.js进程) #1楼 从命令行, .exit就是你想要的: $ node > .exit $ 它在REPL文档中有记录 . REPL(Read-Eval- ...

最新文章

  1. 据说,程序员已成为女生年度最喜欢男友职业Top3?
  2. python可以用于机电控制么_都知道砂石骨料可以用于建筑,但是砂石的分类你都清楚么?...
  3. Sum-product Networks
  4. 安装mysql 没有快捷_快速安装mysql
  5. Spring component detection logic
  6. 牛客练习赛26 D xor序列 (线性基)
  7. [ZJOI2016]小星星
  8. 重磅出击,体验Win2008 Hyper-V(下)
  9. h3c交换机配置telnet_H3C路由器交换机配置 命令行操作基础 视频学习
  10. PowerShell实现“机器人定时在企业微信群中发送消息”功能(下)
  11. 首届Ceph亚太峰会来了!内有粉丝福利
  12. EasyAndroid基础集成组件库之:EasyPhoto (单张)图片选择库
  13. K-th Number Poj - 2104 主席树
  14. notepad 怎么配置编译c语言,Notepad++ 配置c/c++编译环境
  15. pgadmin3连接mysql_postgresql – PgAdmin III – 密码为空时如何连接数据库?
  16. 外贸软件进口业务流程管理方案
  17. matlab 太阳系仿真,三维仿真太阳系
  18. 一、学海无涯,再出发!【2020.02.14-25】
  19. python中assert的用法(简洁明了)
  20. 外媒:三星确认Galaxy S10 5G版4月5日开始销售

热门文章

  1. SAP Spartacus 用户认证的实现
  2. css类选择器优先级 大于 标签选择器
  3. SAP Fiori Elements - Smart table add button debug 2 setDirty
  4. SAP CRM,C4C和Hybris的product Cockpit
  5. SAP OData schema version and backend version
  6. How to configure a different backend system for OData consumption
  7. 在Ubuntu上以精灵进程daemon process的方式启动一个命令
  8. CALL FUNCTION START NEW TASK
  9. IBASE logical view和physical view
  10. How is Aggregation designed