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 相关文章推荐
破除一些网站复制、右键限制
Nov 04 Javascript
javascript 数组排序函数
Aug 20 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
Dec 29 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
Apr 16 Javascript
js获取url中"?"后面的字串方法
May 15 Javascript
jquery插件推荐 jquery.cookie
Nov 09 Javascript
微信小程序调用PHP后台接口 解析纯html文本
Jun 13 Javascript
Vue组件之极简的地址选择器的实现
May 31 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
Nov 23 Javascript
jQuery表单校验插件validator使用方法详解
Feb 18 jQuery
Javascript作用域和作用域链原理解析
Mar 03 Javascript
vue中的计算属性和侦听属性
Nov 06 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
JpGraph php柱状图使用介绍
2011/08/23 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
利用PHP生成CSV文件简单示例
2016/12/21 PHP
php实现数据库的增删改查
2017/02/26 PHP
PHP中检查isset()和!empty()函数的必要性
2019/02/13 PHP
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
百度地图api应用标注地理位置信息(js版)
2013/02/01 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
Vue.js实现价格计算器功能
2020/03/30 Javascript
Thinkjs3新手入门之添加一个新的页面
2017/12/06 Javascript
如何开发出更好的JavaScript模块
2017/12/22 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
详解IOS微信上Vue单页面应用JSSDK签名失败解决方案
2018/11/14 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
微信小程序文章详情页跳转案例详解
2019/07/09 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
numpy中矩阵合并的实例
2018/06/15 Python
python-str,list,set间的转换实例
2018/06/27 Python
python Scrapy爬虫框架的使用
2021/01/21 Python
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
财务总监管理岗位职责
2014/03/08 职场文书
法人授权委托书范本
2014/04/04 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
网络技术专业求职信
2014/07/13 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
立春观后感
2015/06/18 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python