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 相关文章推荐
js 深拷贝函数
Dec 04 Javascript
Jquery Validation插件防止重复提交表单的解决方法
Mar 05 Javascript
打造基于jQuery的高性能TreeView(asp.net)
Feb 23 Javascript
常用的jQuery前端技巧收集
Dec 24 Javascript
jQuery中filter()方法用法实例
Jan 06 Javascript
JavaScript DOM基础
Apr 13 Javascript
利用jQuery解析获取JSON数据
Apr 08 jQuery
详解使用webpack构建多页面应用
Dec 21 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
Apr 19 Javascript
深入了解JavaScript 私有化
May 30 Javascript
在博客园博文中添加自定义右键菜单的方法详解
Feb 05 Javascript
webpack介绍使用配置教程详解webpack介绍和使用
Jun 25 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
Protoss兵种介绍
2020/03/14 星际争霸
php自动跳转中英文页面
2008/07/29 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
PHP与Web页面的交互示例详解二
2020/08/04 PHP
基于PHP实现邮箱验证激活过程详解
2020/10/28 PHP
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
js光标定位文本框回车表单提交问题的解决方法
2015/05/11 Javascript
纯js实现动态时间显示
2020/09/07 Javascript
javascript+html5+css3自定义提示窗口
2017/06/21 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
2018/12/13 Javascript
vue中 v-for循环的用法详解
2020/02/19 Javascript
js实现贪吃蛇小游戏(加墙)
2020/07/31 Javascript
[09:13]DOTA2-DPC中国联赛 正赛 Ehome vs Magma 选手采访 1月19日
2021/03/11 DOTA
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
widows下安装pycurl并利用pycurl请求https地址的方法
2018/10/15 Python
python BlockingScheduler定时任务及其他方式的实现
2019/09/19 Python
python实现文件批量编码转换及注意事项
2019/10/14 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
2020/02/21 Python
pycharm第三方库安装失败的问题及解决经验分享
2020/05/09 Python
python如何从键盘获取输入实例
2020/06/18 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
CSS3圆角和渐变2种常用功能详解
2016/01/06 HTML / CSS
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
曼城官方网上商店:Manchester City
2019/09/10 全球购物
优秀实习自我鉴定
2013/12/04 职场文书
创新型城市实施方案
2014/03/06 职场文书
文员岗位职责范本
2014/03/08 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书
实用求职信模板范文
2019/05/13 职场文书
nginx设置资源请求目录的方式详解
2022/05/30 Servers