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 相关文章推荐
JQuery1.6 使用方法三
Nov 23 Javascript
JavaScript定时器详解及实例
Aug 01 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
Dec 16 Javascript
js中indexof的用法详细解析
Dec 24 Javascript
JavaScript四种调用模式和this示例介绍
Jan 02 Javascript
javascript工厂方式定义对象
Dec 26 Javascript
js基础知识(公有方法、私有方法、特权方法)
Nov 06 Javascript
Vue.js每天必学之Class与样式绑定
Sep 05 Javascript
js 模仿锚点定位的实现方法
Nov 19 Javascript
vue实现word,pdf文件的导出功能
Jul 31 Javascript
使用ECharts实现状态区间图
Oct 25 Javascript
vue+SSM实现验证码功能
Dec 07 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
延长phpmyadmin登录时间的方法
2011/02/06 PHP
php 错误处理经验分享
2011/10/11 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
PHP中curl_setopt函数用法实例分析
2015/04/16 PHP
CI框架的安全性分析
2016/05/18 PHP
PHP _construct()函数讲解
2019/02/03 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
Mootools 1.2教程 滑动效果(Slide)
2009/09/15 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
5个javascript的数字格式化函数分享
2011/12/07 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
JavaScript基于setTimeout实现计数的方法
2015/05/08 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
JS产生随机数的几个用法详解
2016/06/22 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
Python爬虫框架Scrapy安装使用步骤
2014/04/01 Python
提升Python程序运行效率的6个方法
2015/03/31 Python
基于python socketserver框架全面解析
2017/09/21 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
python实现画出e指数函数的图像
2019/11/21 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
利用python实现汉诺塔游戏
2021/03/01 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
Under Armour美国官网:美国知名高端功能性运动品牌
2016/09/05 全球购物
酒店工作职员求职简历的自我评价
2013/10/23 职场文书
会计电算化专业毕业生求职信范文
2013/12/10 职场文书
会计工作心得体会
2014/01/13 职场文书
领导党性分析材料
2014/02/15 职场文书
2014年秋季开学演讲稿
2014/05/24 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书
2019大学生实习报告
2019/06/21 职场文书
python内置进制转换函数的操作
2021/06/02 Python