关于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 面向对象 对象(Object)
May 13 Javascript
Jquery知识点二 jquery下对数组的操作
Jan 15 Javascript
jquery 使用点滴函数代码
May 20 Javascript
JQuery 中几个类选择器的简单使用介绍
Mar 14 Javascript
JavaScript判断对象是否为数组
Dec 22 Javascript
angular+bootstrap的双向数据绑定实例
Mar 03 Javascript
JavaScript登录验证基础教程
Nov 01 Javascript
Webpack框架核心概念(知识点整理)
Dec 22 Javascript
JavaScript面向对象中接口实现方法详解
Jul 24 Javascript
Node.js API详解之 zlib模块用法分析
May 19 Javascript
原生js实现自定义难度的扫雷游戏
Jan 22 Javascript
jQuery ajax - getScript() 方法和getJSON方法
May 14 jQuery
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/12/04 PHP
PHP迭代器实现斐波纳契数列的函数
2013/11/12 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
php获取ip及网址的简单方法(必看)
2017/04/01 PHP
手把手教你自己写一个js表单验证框架的方法
2010/09/14 Javascript
jQuery代码优化之基本事件
2011/11/01 Javascript
window.showModalDialog()返回值的学习心得总结
2014/01/07 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
jQuery 回调函数(callback)的使用和基础
2015/02/26 Javascript
jQuery动态效果显示人物结构关系图的方法
2015/05/07 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
2015/08/21 Javascript
JQuery点击行tr实现checkBox选中的简单实例
2016/05/26 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
2016/07/06 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
Angular路由简单学习
2016/12/26 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
微信小程序实现登录注册功能
2020/12/29 Javascript
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
2013/11/27 Python
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
Python实现文件内容批量追加的方法示例
2017/08/29 Python
python3下载抖音视频的完整代码
2019/06/05 Python
使用Keras 实现查看model weights .h5 文件的内容
2020/06/09 Python
CSS3媒体查询(Media Queries)介绍
2013/09/12 HTML / CSS
个人简历中自我评价
2014/02/11 职场文书
统计系教授推荐信
2014/02/28 职场文书
商业计算机应用专业自荐书
2014/06/09 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
我的中国梦主题教育活动总结
2015/05/07 职场文书
毕业生学校组织意见
2015/06/04 职场文书
放飞理想主题班会
2015/08/14 职场文书
2015年大学组织委员个人工作总结
2015/10/23 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python