关于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 相关文章推荐
How to Auto Include a Javascript File
Feb 02 Javascript
JavaScript Timer实现代码
Feb 17 Javascript
Javascript下判断是否为闰年的Datetime包
Oct 26 Javascript
改变隐藏的input中value的值代码
Dec 30 Javascript
jQuery应用之jQuery链用法实例
Jan 19 Javascript
jquery合并表格中相同文本的相邻单元格
Jul 17 Javascript
JS继承之借用构造函数继承和组合继承
Sep 07 Javascript
angular和BootStrap3实现购物车功能
Jan 25 Javascript
vue实现留言板todolist功能
Aug 16 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
Dec 19 Javascript
JavaScript中CreateTextFile函数
Aug 30 Javascript
js中延迟加载和预加载的具体使用
Jan 14 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代码
2010/07/17 PHP
PHP版国家代码、缩写查询函数代码
2011/08/14 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
PHP数组实际占用内存大小原理解析
2020/12/11 PHP
jquery 学习笔记一
2010/04/07 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
2013/12/23 Javascript
jQuery+AJAX实现无刷新下拉加载更多
2015/07/03 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
JS学习之表格的排序简单实例
2016/05/16 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
Javascript如何实现双指控制图片功能
2020/02/25 Javascript
javascript使用Blob对象实现的下载文件操作示例
2020/04/18 Javascript
Python实现partial改变方法默认参数
2014/08/18 Python
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
讲解Python中的标识运算符
2015/05/14 Python
如何高效使用Python字典的方法详解
2017/08/31 Python
python 剪切移动文件的实现代码
2018/08/02 Python
使用Python处理BAM的方法
2018/09/28 Python
浅谈解除装饰器作用(python3新增)
2018/10/15 Python
Django Channels 实现点对点实时聊天和消息推送功能
2019/07/17 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
python 实现简易的记事本
2020/11/30 Python
css3动画效果小结(推荐)
2016/07/25 HTML / CSS
Staples加拿大官方网站:办公用品一站式采购
2016/09/25 全球购物
时尚孕妇装:HATCH Collection
2019/09/24 全球购物
新驾驶员个人自我评价
2014/01/03 职场文书
大学毕业感言
2014/01/10 职场文书
运动会开幕式邀请函
2014/02/03 职场文书
买房协议书
2014/04/11 职场文书
市委常委会班子党的群众路线教育实践活动整改方案
2014/10/25 职场文书
教师工作总结范文2014
2014/11/10 职场文书
2015年基层党支部工作总结
2015/05/21 职场文书
简历自我评价:教师师德表现自我评价
2019/04/24 职场文书
MySQL 如何限制一张表的记录数
2021/09/14 MySQL