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 相关文章推荐
Javascript this 的一些学习总结
Aug 31 Javascript
jQuery队列操作方法实例
Jun 11 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
Dec 09 Javascript
jQuery中:password选择器用法实例
Jan 03 Javascript
深入剖析JavaScript编程中的对象概念
Oct 21 Javascript
Angularjs 滚动加载更多数据
Mar 17 Javascript
浅谈js的ajax的异步和同步请求的问题
Oct 07 Javascript
Vue数据驱动模拟实现1
Jan 11 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
Mar 02 Javascript
js链表操作(实例讲解)
Aug 29 Javascript
JS异步函数队列功能实例分析
Nov 28 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
Apr 20 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
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
PHP调用MySQL存储过程并返回值的方法
2014/12/26 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
Json字符串转换为JS对象的高效方法实例
2013/05/01 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
JavaScript中的比较操作符>、=、
2014/12/31 Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
2016/07/27 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
vue子组件使用自定义事件向父组件传递数据
2017/05/27 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
详解Angular结合zTree异步加载节点数据
2018/01/20 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
详解基于electron制作一个node压缩图片的桌面应用
2019/01/29 Javascript
vue-router源码之history类的浅析
2019/05/21 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
python实现高斯投影正反算方式
2020/01/17 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
军校本科大学生自我评价
2014/01/14 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
学期个人自我总结
2015/02/13 职场文书
商务代表岗位职责
2015/02/15 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle