判断对象是否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 13 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
Jul 10 Javascript
两个select多选模式的选项相互移动(示例代码)
Jan 11 Javascript
javascript实现全角与半角字符的转换
Jan 07 Javascript
JavaScript动态修改网页元素内容的方法
Mar 21 Javascript
JavaScript与ActionScript3两者的同性与差异性
Sep 22 Javascript
jquery 实现回车登录详解及实例代码
Oct 23 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
Apr 13 Javascript
node使用UEditor富文本编辑器的方法实例
Jul 11 Javascript
vue生成token保存在客户端localStorage中的方法
Oct 25 Javascript
vue 点击按钮增加一行的方法
Sep 07 Javascript
在vue和element-ui的table中实现分页复选功能
Dec 04 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+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
PHP socket 模拟POST 请求实例代码
2016/07/18 PHP
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
使用JS 清空File控件的路径值
2013/07/08 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
深入探寻javascript定时器
2015/01/02 Javascript
JS的数组迭代方法
2015/02/05 Javascript
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
jQuery实现简单的列表式导航菜单效果代码
2015/08/31 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
Node.js中路径处理模块path详解
2016/11/14 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
vue使用原生swiper代码实例
2020/02/05 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
python自动点赞功能的实现思路
2020/02/26 Python
windows下Pycharm安装opencv的多种方法
2020/03/05 Python
深入研究HTML5实现图片压缩上传功能
2016/03/25 HTML / CSS
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
美国领先的机场停车聚合商:Airport Parking Reservations
2020/02/28 全球购物
温泉秘密:Onsen Secret
2020/07/06 全球购物
环境工程毕业生自荐信
2013/11/17 职场文书
单位在职证明范本
2014/01/09 职场文书
团队精神口号
2014/06/06 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
python 如何执行控制台命令与操作剪切板
2021/05/20 Python
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL
httpclient调用远程接口的方法
2022/08/14 Java/Android