判断对象是否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 相关文章推荐
Js之软键盘实现(js源码)
Jan 30 Javascript
javascript显示选择目录对话框的代码
Nov 10 Javascript
为指定元素增加样式的js代码
Dec 09 Javascript
js动态生成指定行数的表格
Jul 11 Javascript
Boostrap入门准备之border box
May 09 Javascript
Bootstrap Table使用方法详解
Aug 01 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
Jan 03 Javascript
微信小程序 UI与容器组件总结
Feb 21 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
Apr 18 Javascript
微信小程序动态增加按钮组件
Sep 14 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
Aug 09 Javascript
vue全局使用axios的操作
Sep 08 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
坏狼php学习 计数器实例代码
2008/06/15 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
解析Ubuntu下crontab命令的用法
2013/06/24 PHP
php获得用户ip地址的比较不错的方法
2014/02/08 PHP
使用PHP如何实现高效安全的ftp服务器(二)
2015/12/30 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
checkbox选中与未选中判断示例
2014/08/04 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
AngularJS使用指令增强标准表单元素功能
2016/07/01 Javascript
jQuery实现打开页面渐现效果示例
2016/07/27 Javascript
JavaScript中windows.open()、windows.close()方法详解
2016/07/28 Javascript
Ubuntu系统下Angularjs开发环境安装
2016/09/01 Javascript
vue 计时器组件的实现代码
2017/09/14 Javascript
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
详解webpack4多入口、多页面项目构建案例
2018/05/25 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
Python判断操作系统类型代码分享
2014/11/22 Python
用Python生成器实现微线程编程的教程
2015/04/13 Python
对于Python中RawString的理解介绍
2016/07/07 Python
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
Anaconda+Pycharm环境下的PyTorch配置方法
2020/03/13 Python
如何基于Python和Flask编写Prometheus监控
2020/11/25 Python
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
财务学生的职业生涯发展
2014/02/11 职场文书
2014年采购员工作总结
2014/11/18 职场文书
2014大学辅导员工作总结
2014/12/02 职场文书
学生退学证明
2015/06/23 职场文书
小学生必读成语故事大全:送给暑假的你们
2019/07/09 职场文书
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android