判断对象是否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类后台管理菜单类-MenuSwitch
Sep 12 Javascript
jquery退出each循环的写法
Feb 26 Javascript
JavaScript模拟实现继承的方法
Mar 30 Javascript
JavaScript中用于生成随机数的Math.random()方法
Jun 15 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
Nov 06 Javascript
JavaScript提升性能的常用技巧总结【经典】
Jun 20 Javascript
AngularJS实现标签页的两种方式
Sep 05 Javascript
Javascript的console['']常用输入方法汇总
Apr 26 Javascript
微信小程序实现下拉菜单切换效果
Mar 30 Javascript
webpack.DefinePlugin与cross-env区别详解
Feb 23 Javascript
Javascript Web Worker使用过程解析
Mar 16 Javascript
Vue + iView实现Excel上传功能的完整代码
Jun 22 Vue.js
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
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
PHP中strtr字符串替换用法详解
2014/11/26 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
PHP开发中AJAX技术的简单应用
2015/12/11 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
基于Jquery的动态添加控件并取值的实现代码
2010/09/24 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
jquery实现input输入框实时输入触发事件代码
2014/01/28 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
2014/04/10 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
2016/08/11 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
使用form-create动态生成vue自定义组件和嵌套表单组件
2019/01/18 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
微信小程序开发之转发分享功能
2019/10/22 Javascript
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
Python单体模式的几种常见实现方法详解
2017/07/28 Python
浅谈python 读excel数值为浮点型的问题
2018/12/25 Python
PyCharm的设置方法和第一个Python程序的建立
2019/01/16 Python
python实现桌面壁纸切换功能
2019/01/21 Python
Python实现Event回调机制的方法
2019/02/13 Python
python获取引用对象的个数方式
2019/12/20 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
超市实习总结自我鉴定
2013/09/19 职场文书
艺术爱好者的自我评价分享
2013/10/08 职场文书
创业计划书怎样才能打动风投
2014/01/01 职场文书
护理个人求职信范文
2014/01/08 职场文书
如何写好优秀的创业计划书
2014/01/30 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书
PHP使用QR Code生成二维码实例
2021/07/07 PHP
Python实现提取PDF简历信息并存入Excel
2022/04/02 Python
python playwrigh框架入门安装使用
2022/07/23 Python