关于js中for in的缺陷浅析


Posted in Javascript onDecember 02, 2013

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

var obj = { name:"jack",
      getName:function(){return this.name}
};
//输出name,getName    
for(var atr in obj) {
    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 in obj) {
    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 in obj) {
    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
        return function () {
            fn.apply(scope, arguments)
        }
    }
}
function greet(name) {  
    alert(this.greet + ', ' + name)
}
for (var n in greet) {
    alert(n)
}

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

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

Javascript 相关文章推荐
javascript 添加和移除函数的通用方法
Oct 20 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
Jun 09 Javascript
JS取request值以及自动执行使用示例
Feb 24 Javascript
全面兼容的javascript时间格式化函数(比较实用)
May 14 Javascript
JavaScript实现节点的删除与序号重建实例
Aug 05 Javascript
JavaScript入门教程之引用类型
May 04 Javascript
Bootstrap布局方式详解
May 27 Javascript
详解angular笔记路由之angular-router
Sep 12 Javascript
es6 filter() 数组过滤方法总结
Apr 03 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
Jun 05 Javascript
解决layui-open关闭自身窗口的问题
Sep 10 Javascript
一篇超完整的Vue新手入门指导教程
Nov 18 Vue.js
js验证整数加保留小数点的简单实例
Dec 02 #Javascript
ExtJs中gridpanel分组后组名排序实例代码
Dec 02 #Javascript
javascript操作html控件实例(javascript添加html)
Dec 02 #Javascript
解析Javascript中大括号“{}”的多义性
Dec 02 #Javascript
解析JavaScript中点号“.”的多义性
Dec 02 #Javascript
解析JavaScript中的不可见数据类型
Dec 02 #Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
Dec 02 #Javascript
You might like
我的论坛源代码(四)
2006/10/09 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
PHP编程中尝试程序并发的几种方式总结
2016/03/21 PHP
修改发贴的编辑功能
2007/03/07 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
2013/09/18 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
2014/07/17 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
jquery实现带缩略图的可定制高度画廊效果(5种)
2015/08/28 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
2015/12/30 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
实现div内部滚动条滚动到底部和顶部的代码
2017/11/15 Javascript
AngularJS实时获取并显示密码的方法
2018/02/06 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
vue实现扫码功能
2020/01/17 Javascript
JavaScript实现滚动加载更多
2020/12/27 Javascript
Eclipse + Python 的安装与配置流程
2013/03/05 Python
在Python中使用Neo4j数据库的教程
2015/04/16 Python
mac下给python3安装requests库和scrapy库的实例
2018/06/13 Python
在IPython中进行Python程序执行时间的测量方法
2018/11/01 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
大学运动会入场词
2014/02/22 职场文书
《大自然的语言》教学反思
2014/04/08 职场文书
冬季施工防火方案
2014/05/17 职场文书
工地安全生产标语
2014/06/06 职场文书
学习雷锋标语
2014/06/25 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
2022/04/07 Servers
Android studio 简单计算器的编写
2022/05/20 Java/Android