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代码(自写)
Aug 12 Javascript
jquery鼠标停止移动事件
Dec 21 Javascript
简单的代码实现jquery定时器
Jan 03 Javascript
javascript实现3D变换的立体圆圈实例
Aug 06 Javascript
使用Angular.js开发的注意事项
Oct 19 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
Jul 17 Javascript
基于JavaScript表单脚本(详解)
Oct 18 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
Jan 05 Javascript
通过npm或yarn自动生成vue组件的方法示例
Feb 12 Javascript
vue下载excel的实现代码后台用post方法
May 10 Javascript
简介JavaScript错误处理机制
Aug 04 Javascript
微信小程序canvas动态时钟
Oct 22 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
PHP获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
PHP类的使用 实例代码讲解
2009/12/28 PHP
PHPMailer发送邮件
2016/12/28 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
JavaScript常用验证函数实例汇总
2014/11/25 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
简介JavaScript中的setDate()方法的使用
2015/06/11 Javascript
JavaScript数组操作函数汇总
2016/08/05 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
ionic+AngularJs实现获取验证码倒计时按钮
2017/04/22 Javascript
详解升级react-router 4 踩坑指南
2017/08/14 Javascript
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
elementUI select组件默认选中效果实现的方法
2019/03/25 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
python版简单工厂模式
2017/10/16 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
python多线程下信号处理程序示例
2019/05/31 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
基于Pytorch SSD模型分析
2020/02/18 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
24个canvas基础知识小结
2014/12/17 HTML / CSS
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
中国梦的演讲稿
2014/01/08 职场文书
奥巴马获胜演讲稿
2014/05/15 职场文书
超市客服工作职责
2014/06/11 职场文书
创业计划书之珠宝饰品
2019/08/26 职场文书
angular4实现带搜索的下拉框
2022/03/25 Javascript
Windows Server 版本 20H2 于 8 月 9 日停止支持,Win10 版本 21H1 将于 12 月结束支
2022/07/23 数码科技