判断对象是否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解密入门之凭直觉解
Jun 25 Javascript
JavaScript 组件之旅(三):用 Ant 构建组件
Oct 28 Javascript
jquery ajax 同步异步的执行示例代码
Jun 23 Javascript
jQuery参数列表集合
Apr 06 Javascript
javascript获取四位数字或者字母的随机数
Jan 09 Javascript
JavaScript比较两个对象是否相等的方法
Feb 06 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
Sep 09 Javascript
基于Layer+jQuery的自定义弹框
May 26 Javascript
jquery实现拖动效果(代码分享)
Jan 25 Javascript
vue中echarts3.0自适应的方法
Feb 26 Javascript
对VUE中的对象添加属性
Sep 18 Javascript
uniapp微信小程序实现一个页面多个倒计时
Nov 01 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做的端口嗅探器--可以指定网站和端口
2006/10/09 PHP
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
提高PHP编程效率的53个要点(经验小结)
2010/09/04 PHP
php使用cookie保存用户登录的用户名实例
2015/01/26 PHP
php筛选不存在的图片资源
2015/04/28 PHP
WordPress导航菜单的滚动和淡入淡出效果的实现要点
2015/12/14 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
IE8下关于querySelectorAll()的问题
2010/05/13 Javascript
js的逻辑运算符 ||
2010/05/31 Javascript
jQuery学习基础知识小结
2010/11/25 Javascript
js数组去重的常用方法总结
2014/01/24 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
javascript伸缩型菜单实现代码
2015/11/16 Javascript
jQuery根据name属性进行查找的用法分析
2016/06/23 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
JavaScript提升机制Hoisting详解
2019/10/23 Javascript
JQuery事件冒泡和默认行为代码实例
2020/05/13 jQuery
Python Tkinter GUI编程入门介绍
2015/03/10 Python
深入理解python中的闭包和装饰器
2016/06/12 Python
Pandas中把dataframe转成array的方法
2018/04/13 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
python实现桌面气泡提示功能
2019/07/29 Python
Python使用Pandas对csv文件进行数据处理的方法
2019/08/01 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
2020/01/08 Python
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
YBF Beauty官网:美丽挚友,美国知名彩妆品牌
2020/11/22 全球购物
史上最全面的Java面试题汇总!
2015/02/03 面试题
材料成型专业个人求职信范文
2013/09/25 职场文书
升职自荐信
2013/11/28 职场文书
生产厂长岗位职责
2014/02/21 职场文书
高中军训感言500字
2014/02/24 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书