判断对象是否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文本框追加多个下拉框的值的简单实例
Jul 12 Javascript
ExtJS4如何给同一个formpanel不同的url
May 02 Javascript
jQuery中scrollTop()方法用法实例
Jan 16 Javascript
初识Javascript小结
Jul 16 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
Oct 10 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
Apr 12 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
Aug 17 Javascript
在Vue 中使用Typescript的示例代码
Sep 10 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
Nov 02 Javascript
jQuery中each和js中forEach的区别分析
Feb 27 jQuery
vue请求本地自己编写的json文件的方法
Apr 25 Javascript
微信小程序如何再次获取用户授权的方法
May 10 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
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
百度地图API使用方法详解
2015/08/25 PHP
php自动加载方式集合
2016/04/04 PHP
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
js修改input的type属性问题探讨
2013/10/12 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
javascript模块化简单解析
2016/04/07 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
Vue多种方法实现表头和首列固定的示例代码
2018/02/02 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
wxPython中文教程入门实例
2014/06/09 Python
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
python简单线程和协程学习心得(分享)
2017/06/14 Python
python 爬取疫情数据的源码
2020/02/09 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
基于Python爬虫采集天气网实时信息
2020/06/05 Python
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
EJB的激活机制
2013/10/25 面试题
高考寄语大全
2014/04/08 职场文书
医院院务公开实施方案
2014/05/03 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
党员剖析材料范文
2014/12/18 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
个人优缺点总结
2015/02/28 职场文书
企业承诺书格式范文
2015/04/28 职场文书
清明节文明祭祀倡议书
2015/04/28 职场文书
违规违纪检讨书范文
2015/05/06 职场文书