Javascript for in的缺陷总结


Posted in Javascript onFebruary 03, 2017

Javascript for in的缺陷总结

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 相关文章推荐
基于jquery实现的可以编辑选择的下拉框的代码
Nov 19 Javascript
事件绑定之小测试  onclick && addEventListener
Jul 31 Javascript
jquery如何改变html标签的样式(两种实现方法)
Jan 16 Javascript
JS中showModalDialog 的使用解析
Apr 17 Javascript
常用jQuery选择器总结
Jul 11 Javascript
浅谈javascript中return语句
Jul 15 Javascript
JS使用eval解析JSON的注意事项分析
Nov 14 Javascript
jQuery双向列表选择器DIV模拟版
Nov 01 Javascript
Bootstrap模态框案例解析
Mar 05 Javascript
vue项目实战总结篇
Feb 11 Javascript
vue远程加载sfc组件思路详解
Dec 25 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
Aug 10 Javascript
canvas绘制七巧板
Feb 03 #Javascript
JS对象是否拥有某属性如何判断
Feb 03 #Javascript
jQuery实现的浮动层div浏览器居中显示效果
Feb 03 #Javascript
JavaScript中捕获与冒泡详解及实例
Feb 03 #Javascript
JS基于正则截取替换特定字符之间字符串操作示例
Feb 03 #Javascript
几种tab切换详解
Feb 03 #Javascript
Bootstrap页面缩小变形的快速解决办法
Feb 03 #Javascript
You might like
追忆往昔!浅谈收音机的百年发展历史
2021/03/01 无线电
php Undefined index的问题
2009/06/01 PHP
PHP教程 基本语法
2009/10/23 PHP
php递归使用示例(php递归函数)
2014/02/14 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
vue项目中,main.js,App.vue,index.html的调用方法
2018/09/20 Javascript
vue3 源码解读之 time slicing的使用方法
2019/10/31 Javascript
Javascript如何实现双指控制图片功能
2020/02/25 Javascript
JS控制下拉列表左右选择实例代码
2020/05/08 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
2020/06/22 Javascript
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python实现控制台进度条功能
2016/01/04 Python
使用python生成杨辉三角形的示例代码
2018/08/29 Python
分享Python切分字符串的一个不错方法
2018/12/14 Python
Python基于stuck实现scoket文件传输
2020/04/02 Python
前端实现打印图像功能
2019/08/27 HTML / CSS
瑞士国际航空官网:SWISS
2016/07/21 全球购物
世界最大的海报和艺术印刷商店:AllPosters.com
2017/02/01 全球购物
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
2014基层党员干部学习全国两会心得体会
2014/03/17 职场文书
物资采购方案
2014/06/12 职场文书
教师个人工作总结范文2014
2014/11/10 职场文书
2014会计年终工作总结
2014/12/20 职场文书
罚款通知怎么写
2015/04/22 职场文书
小学五年级班主任工作经验交流材料
2015/11/02 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书