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 相关文章推荐
jquery 插件 人性化的消息显示
Jan 21 Javascript
jQuery之ajax技术的详细介绍
Jun 19 Javascript
JavaScript数组去重的3种方法和代码实例
Jul 01 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
Dec 08 Javascript
jquery.validate表单验证插件使用方法解析
Nov 07 Javascript
Three.js基础部分学习
Jan 08 Javascript
Vue.js中的图片引用路径的方式
Jul 28 Javascript
ES6新特性:使用export和import实现模块化详解
Jul 31 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
Jan 09 jQuery
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
Jun 27 Javascript
vue项目引入ts步骤(小结)
Oct 31 Javascript
JavaScript canvas实现文字时钟
Jan 10 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
一条久听不愿放下的DIY森海MX500,三言两语话神奇
2021/03/02 无线电
php 截取字符串并以零补齐str_pad() 函数
2011/05/07 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
php动态生成缩略图并输出显示的方法
2015/04/20 PHP
PHP之正则表达式捕获组与非捕获组(详解)
2015/07/29 PHP
PHP文件上传操作实例详解
2016/09/27 PHP
javascript中函数作为参数调用的方法
2015/02/09 Javascript
JS实现支持多选的遍历下拉列表代码
2015/08/20 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
2016/06/26 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
2016/07/28 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
js实现分页功能
2017/05/24 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
Python的MongoDB模块PyMongo操作方法集锦
2016/01/05 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
Python简单基础小程序的实例代码
2019/04/28 Python
python实现websocket的客户端压力测试
2019/06/25 Python
python把ipynb文件转换成pdf文件过程详解
2019/07/09 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
python 基于opencv实现高斯平滑
2020/12/18 Python
UML设计模式笔试题
2014/06/07 面试题
公司成立感言
2014/01/11 职场文书
残疾人创业典型事迹
2014/02/01 职场文书
党员教师一句话承诺
2014/05/30 职场文书
2014年基建工作总结
2014/12/12 职场文书
红白喜事主持词
2015/07/06 职场文书
煤矿安全生产管理协议书
2016/03/22 职场文书
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js
Golang表示枚举类型的详细讲解
2021/09/04 Golang
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android