关于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 相关文章推荐
js关闭父窗口时关闭子窗口
Apr 01 Javascript
css与javascript跨浏览器兼容性总结
Sep 15 Javascript
JavaScript返回网页中超链接数量的方法
Apr 03 Javascript
解析预加载显示图片艺术
Dec 05 Javascript
使用JavaScript为一张图片设置备选路径的方法
Jan 04 Javascript
JS实现中国公民身份证号码有效性验证
Feb 20 Javascript
分分钟学会vue中vuex的应用(入门教程)
Sep 14 Javascript
Three.js加载外部模型的教程详解
Nov 10 Javascript
Vue.js用法详解
Nov 13 Javascript
使用pkg打包Node.js应用的方法步骤
Oct 19 Javascript
微信小程序wx.request拦截器使用详解
Jul 09 Javascript
token 机制和实现方式
Dec 15 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
文章推荐系统(三)
2006/10/09 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
formvalidator验证插件中有关ajax验证问题
2013/01/04 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
Vue.js组件使用开发实例教程
2016/11/01 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
2017/12/06 Javascript
JavaScript 判断对象中是否有某属性的常用方法
2018/06/14 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
Vue表单输入绑定的示例代码
2018/11/01 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
vue-router为激活的路由设置样式操作
2020/07/18 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
[08:29]DOTA2每周TOP10 精彩击杀集锦vol.7
2014/06/25 DOTA
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
Python 实现字符串中指定位置插入一个字符
2018/05/02 Python
python调用xlsxwriter创建xlsx的方法
2018/05/03 Python
使用Python更换外网IP的方法
2018/07/09 Python
django 将model转换为字典的方法示例
2018/10/16 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
Django框架模板的使用方法示例
2019/05/25 Python
python实现点击按钮修改数据的方法
2019/07/17 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
Django用内置方法实现简单搜索功能的方法
2020/12/18 Python
pandas数据分组groupby()和统计函数agg()的使用
2021/03/04 Python
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
母婴店促销方案
2014/03/05 职场文书
药店促销活动总结
2014/07/10 职场文书
2015年前台文员工作总结
2015/05/18 职场文书
用 Python 定义 Schema 并生成 Parquet 文件详情
2021/09/25 Python
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫