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 相关文章推荐
P3P Header解决Cookie跨域的问题
Mar 12 Javascript
css结合js制作下拉菜单示例代码
Feb 27 Javascript
js实现字符串的16进制编码不加密
Apr 25 Javascript
JS获取下拉框显示值和判断单选按钮的方法
Jul 09 Javascript
JS实现的竖向折叠菜单代码
Oct 21 Javascript
js制作网站首页图片轮播特效代码
Aug 30 Javascript
javascript防篡改对象实例详解
Apr 10 Javascript
详解微信第三方小程序代开发
Jun 23 Javascript
jQuery 实现左右两侧菜单添加、移除功能
Jan 02 jQuery
Vue-router的使用和出现空白页,路由对象属性详解
Sep 03 Javascript
vue项目设置scrollTop不起作用(总结)
Dec 21 Javascript
ES6中new Function()语法及应用实例分析
Feb 19 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
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
延长phpmyadmin登录时间的方法
2011/02/06 PHP
php数组去重实例及分析
2013/11/26 PHP
php使用mysqli向数据库添加数据的方法
2015/03/20 PHP
php创建多级目录的方法
2015/03/24 PHP
在WordPress的文章编辑器中设置默认内容的方法
2015/12/29 PHP
简单的自定义php模板引擎
2016/08/26 PHP
PHP文件上传处理案例分析
2016/10/15 PHP
利用PHP计算有多少小于当前数字的数字方法示例
2020/08/26 PHP
javascript编程起步(第五课)
2007/01/10 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
使用隐藏的new来创建对象
2011/03/29 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
走进javascript——不起眼的基础,值和分号
2017/02/24 Javascript
vue路由组件按需加载的几种方法小结
2018/07/12 Javascript
layer iframe 设置关闭按钮的方法
2019/09/12 Javascript
JavaScript中的this原理及6种常见使用场景详解
2020/02/14 Javascript
简单理解Python中基于生成器的状态机
2015/04/13 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
2015/06/26 Python
Python遍历目录并批量更换文件名和目录名的方法
2016/09/19 Python
Python基于time模块求程序运行时间的方法
2017/09/18 Python
selenium+python实现自动登录脚本
2018/04/22 Python
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
食品营养与检测应届生求职信
2013/11/08 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
2015年办公室个人工作总结
2015/04/20 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书
python中if和elif的区别介绍
2021/11/07 Python
Sql Server之数据类型详解
2022/02/28 SQL Server