关于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 给汉字排序实例代码
Jun 28 Javascript
javascript 动态修改样式和层叠样式表代码
Apr 27 Javascript
基于jquery+thickbox仿校内登录注册框
Jun 07 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
Nov 08 Javascript
jquery实现非叠加式的搜索框提示效果
Jan 07 Javascript
浅谈javascript中this在事件中的应用
Feb 15 Javascript
删除table表格行的实例讲解
Sep 21 Javascript
js中this对象用法分析
Jan 05 Javascript
微信小程序分享海报生成的实现方法
Dec 10 Javascript
vue cli安装使用less的教程详解
Jul 12 Javascript
微信小程序 调用微信授权窗口相关问题解决
Jul 25 Javascript
node.js +mongdb实现登录功能
Jun 18 Javascript
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
PHP开发文件系统实例讲解
2006/10/09 PHP
PHP 高手之路(二)
2006/10/09 PHP
yii框架中的Url生产问题小结
2012/01/16 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
2016/11/10 PHP
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
prototype Element学习笔记(篇二)
2008/10/26 Javascript
刷新页面实现方式总结(HTML,ASP,JS)
2008/11/13 Javascript
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
Javascript 制作图形验证码实例详解
2016/12/22 Javascript
实现jquery放大镜的两种方法
2018/02/22 jQuery
jQuery插件jsonview展示json数据
2018/05/26 jQuery
boostrap模态框二次弹出清空原有内容的方法
2018/08/10 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
2018/11/28 Javascript
微信小程序进入广告实现代码实例
2019/09/19 Javascript
js实现简单的秒表
2020/01/16 Javascript
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
[26:21]浴火之凤-TI4世界冠军Newbee战队纪录片
2014/08/07 DOTA
Python中集合类型(set)学习小结
2015/01/28 Python
python在控制台输出进度条的方法
2015/06/20 Python
Python3中类、模块、错误与异常、文件的简易教程
2017/11/20 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
用css3制作纸张效果(外翻卷角)
2013/02/01 HTML / CSS
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
幼儿教师工作感言
2014/02/14 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
2014年祖国生日寄语
2014/09/19 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
垂直极限观后感
2015/06/08 职场文书
《成长的天空》读后感3篇
2019/12/06 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang
sql字段解析器的实现示例
2021/06/23 SQL Server