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 相关文章推荐
FireFox下XML对象转化成字符串的解决方法
Dec 09 Javascript
原生javascript图片自动或手动切换示例附演示源码
Sep 04 Javascript
jquery获取css中的选择器(实例讲解)
Dec 02 Javascript
JavaScript插件化开发教程 (一)
Jan 27 Javascript
javascript实现状态栏中文字动态显示的方法
Oct 20 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
Apr 20 Javascript
angularjs手动识别字符串中的换行符方法
Oct 02 Javascript
nuxt.js中间件实现拦截权限判断的方法
Nov 21 Javascript
使用微信SDK自定义分享的方法
Jul 03 Javascript
jQuery实现轮播图效果
Nov 26 jQuery
JavaScript中继承原理与用法实例入门
May 09 Javascript
vue的项目如何打包上线
Apr 13 Vue.js
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
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
smarty自定义函数用法示例
2016/05/20 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
原型方法的不同写法居然会影响调试的解决方法
2007/03/08 Javascript
IE bug table元素的innerHTML
2010/01/11 Javascript
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
2016/09/21 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
vue中实现Monaco Editor自定义提示功能
2019/07/05 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
在Django的视图中使用数据库查询的方法
2015/07/16 Python
Python切片操作深入详解
2018/07/27 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
python树的同构学习笔记
2019/09/14 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
pytorch读取图像数据转成opencv格式实例
2020/06/02 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
网络管理员岗位职责
2014/03/17 职场文书
大学毕业生求职自荐书
2014/06/05 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
消防演习通知
2015/04/25 职场文书
2015年人事专员工作总结
2015/04/29 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
2016大一新生军训心得体会
2016/01/11 职场文书
门面租赁合同范文
2019/08/06 职场文书
详解Java实践之抽象工厂模式
2021/06/18 Java/Android
Java集成swagger文档组件
2021/06/28 Java/Android