判断对象是否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 相关文章推荐
理解Javascript_10_对象模型
Oct 16 Javascript
javascript的parseFloat()方法精度问题探讨
Nov 26 Javascript
jquery将一个表单序列化为一个对象的方法
Jan 03 Javascript
javascript实现拖动元素交换位置
Nov 29 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
Mar 02 Javascript
JS ES6多行字符串与连接字符串的表示方法
Apr 26 Javascript
React Native 通告消息竖向轮播组件的封装
Aug 25 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
Sep 30 Javascript
nuxt.js中间件实现拦截权限判断的方法
Nov 21 Javascript
JS async 函数的含义和用法实例总结
Apr 08 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
Jul 26 Javascript
vue+node 实现视频在线播放的实例代码
Oct 19 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环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
php格式化时间戳显示友好的时间实现思路及代码
2014/10/23 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
2017/07/09 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
2019/10/15 PHP
jquery 滚动条事件简单实例
2013/07/12 Javascript
JavaScript极简入门教程(一):基础篇
2014/10/25 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
2019/09/05 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
python自动翻译实现方法
2016/05/28 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
Python扩展内置类型详解
2018/03/26 Python
Python实现的求解最小公倍数算法示例
2018/05/03 Python
django 多数据库配置教程
2018/05/30 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
python 模拟登陆github的示例
2020/12/04 Python
Snapfish爱尔兰:在线照片打印和个性化照片礼品
2018/09/17 全球购物
大学生怎样进行自我评价
2013/12/07 职场文书
关心下一代工作先进事迹
2014/08/15 职场文书
党的群众路线教育实践活动个人整改措施材料
2014/11/04 职场文书
董事长秘书工作总结
2015/08/14 职场文书
JavaScript与JQuery框架基础入门教程
2021/07/15 Javascript
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python