判断对象是否Window的实现代码


Posted in Javascript onJanuary 10, 2012

直入正题吧.
先看jQuery的$.isWindow函数:

function isWin(obj){ 
return obj && typeof obj === 'object' && 'setInterval' in obj; 
}

这个函数本身是很科学的, 它主要是通过检查目标对象是否拥有setInterval属性来判断.
然而问题在于, 在缺少约定的情况下, 它也许并不太可靠, 比如:
var o={xx:'oo'}; 
o['setInterval']=true; 
console.log( isWin(o) ); // true

上例通过给对象字面量添加setInterval属性, 欺诈成功.
而事实上, 任何一个非null的Object都可以如此伪装, 比如数组:
var arr=[1,2,3]; 
arr['setInterval']=true; 
console.log( isWin(arr) ); // true

相比上面的属性属性检查, 一个更为妥善的方法是使用对象的toString函数来判断:
function isWin(obj){ 
return Object.prototype.toString.call(obj)==='[object Window]' 
}

以上函数在标准浏览器中妥妥的, 但同时又带来了新的兼容问题:
// ie6-8中的结果 
Object.prototype.toString.call(window)==='[object Window]'; // false 
Object.prototype.toString.call(window)==='[object Object]'; // true 
// chrome 
Object.prototype.toString.call(window)==='[object global]'; // true 
// safari 
Object.prototype.toString.call(window)==='[object DOMWindow]'; // true

果然, 主要的问题又是来自万恶的ie们. 所幸天无绝人之路, 这又让我想起了ie中的一个灵异事件:
// 下面两行, 信不信? 
console.log( window==document ); // true 
console.log( document==window ); // false

写到这里, 我想最终的解决方案已经出来了:
function isWin(obj){ 
return/Window|global/.test({}.toString.call(obj))||obj==obj.document&&obj.document!=obj; 
}
Javascript 相关文章推荐
学习ExtJS 访问容器对象
Oct 07 Javascript
JS实现日期加减的方法
Nov 29 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
Apr 12 Javascript
JavaScript返回网页中锚点数目的方法
Apr 03 Javascript
jQuery实现表格行上下移动和置顶效果
Jun 05 Javascript
js表单提交和submit提交的区别实例分析
Dec 10 Javascript
基于node实现websocket协议
Apr 25 Javascript
jQuery.uploadify文件上传组件实例讲解
Sep 23 Javascript
详解vue 数组和对象渲染问题
Sep 21 Javascript
vue-router源码之history类的浅析
May 21 Javascript
layer弹出层倒计时关闭的实现方法
Sep 27 Javascript
Nuxt配置Element-UI按需引入的操作方法
Jul 06 Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
Jan 10 #Javascript
javascript中onmouse事件在div中失效问题的解决方法
Jan 09 #Javascript
jQuery 阴影插件代码分享
Jan 09 #Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
Jan 08 #Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
Jan 08 #Javascript
分享几个超级震憾的图片特效
Jan 08 #Javascript
关于JAVASCRIPT urldecode URL解码的问题
Jan 08 #Javascript
You might like
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
调试php程序的简单步骤
2019/10/04 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
node.js中的console.time方法使用说明
2014/12/09 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
JS 组件系列之BootstrapTable的treegrid功能
2017/06/16 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
工作中常用到的ES6语法
2018/09/04 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
微信小程序实现发送验证码按钮效果
2018/12/20 Javascript
谈谈JavaScript中super(props)的重要性
2019/02/12 Javascript
Vue 实现手动刷新组件的方法
2019/02/19 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
[58:15]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 NB vs Liquid
2018/04/02 DOTA
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
python3-flask-3将信息写入日志的实操方法
2019/11/12 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
基于CSS3实现立方体自转效果
2016/03/01 HTML / CSS
使用css如何制作时间ICON方法实践
2012/11/12 HTML / CSS
Dune London官网:英国著名奢华鞋履品牌
2017/11/30 全球购物
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
学校安全检查制度
2014/01/27 职场文书
大学校运会广播稿
2014/02/03 职场文书
城市创卫标语
2014/06/17 职场文书
网上祭先烈心得体会
2014/09/01 职场文书
自我检讨书范文
2015/01/28 职场文书
医药公司采购员岗位职责
2015/04/03 职场文书
2015年为民办实事工作总结
2015/05/26 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书
2016五一手机促销广告语
2016/01/28 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python