关于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 动态数据下的锚点错位问题解决方法
Dec 24 Javascript
javascript 学习之旅 (3)
Feb 05 Javascript
js css后面所带参数含义介绍
Aug 18 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
Mar 17 Javascript
表单验证正则表达式实例代码详解
Nov 09 Javascript
更高效的使用JQuery 这里总结了8个小技巧
Apr 13 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
Jun 16 Javascript
JavaScript中Array对象用法实例总结
Nov 29 Javascript
深入理解javascript中concat方法
Dec 12 Javascript
教你一步步用jQyery实现轮播器
Dec 18 Javascript
JS验证字符串功能
Feb 22 Javascript
详解Vue中过度动画效果应用
May 25 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
利用curl抓取远程页面内容的示例代码
2013/07/23 PHP
smarty模板中拼接字符串的方法
2014/02/14 PHP
php实例化一个类的具体方法
2019/09/19 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
setInterval 和 setTimeout会产生内存溢出
2008/02/15 Javascript
js onpropertychange输入框 事件获取属性
2009/03/26 Javascript
jQuery EasyUI 的EasyLoader功能介绍
2010/09/12 Javascript
JavaScript获取客户端计算机硬件及系统等信息的方法
2014/01/02 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
Javascript核心读书有感之语言核心
2015/02/01 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
JavaScript获取当前运行脚本文件所在目录的方法
2016/02/03 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
2017/11/14 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
python实现的重启关机程序实例
2014/08/21 Python
Python深度优先算法生成迷宫
2018/01/22 Python
tensorflow建立一个简单的神经网络的方法
2018/02/10 Python
python 实现视频流下载保存MP4的方法
2019/01/09 Python
Django CBV类的用法详解
2019/07/26 Python
Python imutils 填充图片周边为黑色的实现
2020/01/19 Python
银行类自荐信
2014/02/04 职场文书
双创工作实施方案
2014/03/26 职场文书
协议书的格式
2014/04/23 职场文书
导游个人求职信
2014/04/25 职场文书
文明礼仪伴我行演讲稿
2014/05/12 职场文书
支部组织生活会方案
2014/06/10 职场文书
授权委托书范文
2014/07/31 职场文书
我爱幼儿园演讲稿
2014/09/11 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
mysql实现将字符串字段转为数字排序或比大小
2022/06/14 MySQL