for ie无效 in js_关于js中for in的缺陷浅析
转自: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的缺陷浅析相关推荐
- vue中引用js_从JS中的内存管理说起 —— JS中的弱引用
点击上方"蓝字"关注本公众号 写在前面 在所有的编程语言中,我们声明一个变量时,需要系统为我们分配一块内存.当我们不再需要这个变量时,需要将内存进行回收(这个过程称之为垃圾回收). ...
- js 中meta 移除head_浅析JS中数据结构
目录 列表(链表) 数组 栈 队列 哈希表 堆 图 二叉查找树 分享一句话:算法即原力,即正义 列表(链表) 链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的 ...
- js中style.display=无效的解决方法
本文实例讲述了js中style.display=""无效的解决方法.分享给大家供大家参考.具体解决方法如下: 一.问题描述: 在js中我们有时想动态的控制一个div显示或隐藏或更多 ...
- draft.js_如何使用快捷方式在Draft.js中创建有序列表和无序列表
draft.js by Andrey Semin 通过安德烈·塞米(Andrey Semin) 如何使用快捷方式在Draft.js中创建有序列表和无序列表 (How to create ordered ...
- 引入js_好程序员web前端教程分享js中的模块化一
好程序员web前端教程分享js中的模块化一:我们知道最常见的模块化方案有CommonJS.AMD.CMD.ES6,AMD规范一般用于浏览器,异步的,因为模块加载是异步的,js解释是同步的,所以有时候导 ...
- vue main.js中引入js_手把手教你深入Vue3.0(Vue-cli4)项目打包性能优化实践
记录了自己的博客在禁用缓存的情况下,从八九秒加载时间到最终985ms的优化实践,开启缓存的情况下能达到138ms的访问速度 本人的个人博客采用的是Vue-cli4.1.2 + typescript构建 ...
- ie浏览器查看vue中js_浅析 Vue.js 中那些空间换时间的操作
Hello,各位小伙伴,接下来的一段时间里,我会把我的课程<Vue.js 3.0 核心源码解析>中问题的答案陆续在我的公众号发布,由于课程的问题大多数都是开放性的问题,所以我的答案也不一定 ...
- node.js中模块_在Node.js中需要模块:您需要知道的一切
node.js中模块 by Samer Buna 通过Samer Buna 在Node.js中需要模块:您需要知道的一切 (Requiring modules in Node.js: Everythi ...
- 如何在Node.js中退出
用于退出的命令是什么? (即终止Node.js进程) #1楼 从命令行, .exit就是你想要的: $ node > .exit $ 它在REPL文档中有记录 . REPL(Read-Eval- ...
最新文章
- 据说,程序员已成为女生年度最喜欢男友职业Top3?
- python可以用于机电控制么_都知道砂石骨料可以用于建筑,但是砂石的分类你都清楚么?...
- Sum-product Networks
- 安装mysql 没有快捷_快速安装mysql
- Spring component detection logic
- 牛客练习赛26 D	xor序列 (线性基)
- [ZJOI2016]小星星
- 重磅出击,体验Win2008 Hyper-V(下)
- h3c交换机配置telnet_H3C路由器交换机配置 命令行操作基础 视频学习
- PowerShell实现“机器人定时在企业微信群中发送消息”功能(下)
- 首届Ceph亚太峰会来了!内有粉丝福利
- EasyAndroid基础集成组件库之:EasyPhoto (单张)图片选择库
- K-th Number Poj - 2104 主席树
- notepad 怎么配置编译c语言,Notepad++ 配置c/c++编译环境
- pgadmin3连接mysql_postgresql – PgAdmin III – 密码为空时如何连接数据库?
- 外贸软件进口业务流程管理方案
- matlab 太阳系仿真,三维仿真太阳系
- 一、学海无涯,再出发!【2020.02.14-25】
- python中assert的用法(简洁明了)
- 外媒:三星确认Galaxy S10 5G版4月5日开始销售
热门文章
- SAP Spartacus 用户认证的实现
- css类选择器优先级 大于 标签选择器
- SAP Fiori Elements - Smart table add button debug 2 setDirty
- SAP CRM,C4C和Hybris的product Cockpit
- SAP OData schema version and backend version
- How to configure a different backend system for OData consumption
- 在Ubuntu上以精灵进程daemon process的方式启动一个命令
- CALL FUNCTION START NEW TASK
- IBASE logical view和physical view
- How is Aggregation designed