判断对象是否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 相关文章推荐
jQuery使用手册之三 CSS操作
Mar 24 Javascript
jQuery实现点击该行即可删除HTML表格行
Oct 17 Javascript
jquery简单的弹出层浮动层代码
Apr 27 Javascript
IE6兼容透明背景图片及解决方案
Aug 19 Javascript
js实现仿百度风云榜可重复多次调用的TAB切换选项卡效果
Aug 31 Javascript
AngularJS中处理多个promise的方式
Feb 02 Javascript
jquery trigger函数执行两次的解决方法
Feb 29 Javascript
JQuery PHP图片在线裁剪实例
Jul 27 Javascript
jquery.Callbacks的实现详解
Nov 30 Javascript
JS简单判断滚动条的滚动方向实现方法
Apr 28 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
Sep 27 Javascript
JavaScript实现Tab选项卡切换
Feb 13 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 Squid中可缓存的动态网页设计
2008/09/17 PHP
使用PHP获取网络文件的实现代码
2010/01/01 PHP
浅析PHP微信支付通知的处理方式
2014/05/25 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
关于 byval 与 byref 的区别分析总结
2007/10/08 Javascript
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
基于jQuery实现音乐播放试听列表
2016/04/14 Javascript
JavaScript 控制字体大小设置的方法
2016/11/23 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
浅谈Webpack下多环境配置的思路
2018/06/27 Javascript
Vue 全家桶实现移动端酷狗音乐功能
2018/11/16 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
VuePress 快速踩坑小结
2019/02/14 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
深入理解Python中的super()方法
2017/11/20 Python
python文本数据相似度的度量
2018/03/12 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
《小猫刮胡子》教学反思
2014/02/21 职场文书
小学社团活动总结
2014/06/27 职场文书
大学生心理活动总结
2014/07/04 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
2015年会计人员工作总结
2015/05/22 职场文书
离婚案件原告代理词
2015/05/23 职场文书
《坐井观天》教学反思
2016/02/18 职场文书
redis内存空间效率问题的深入探究
2021/05/17 Redis
nginx rewrite功能使用场景分析
2022/05/30 Servers