判断对象是否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和jquery设置disabled属性为true使按钮失效
Aug 07 Javascript
浅谈Javascript变量作用域问题
Dec 16 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
Apr 16 Javascript
简述JavaScript对传统文档对象模型的支持
Jun 16 Javascript
Bootstrap CSS布局之代码
Dec 17 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
Mar 24 jQuery
angular仿支付宝密码框输入效果
Mar 25 Javascript
js 获取html5的data属性实现方法
Jul 28 Javascript
Vue组件通信实践记录(推荐)
Aug 15 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
Sep 27 Javascript
JavaScript数组特性与实践应用深入详解
Dec 30 Javascript
vue单文件组件lint error自动fix与styleLint报错自动fix详解
Jan 08 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
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
php的curl封装类用法实例
2014/11/07 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
php版交通银行网银支付接口开发入门教程
2016/09/26 PHP
用ADODB.Stream转换
2007/01/22 Javascript
javascript 操作文件 实现方法小结
2009/07/02 Javascript
javascript 限制输入脚本大全
2009/11/03 Javascript
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
javascript制作2048游戏
2015/03/30 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
AngularJS指令详解及示例代码
2016/08/16 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
2017/04/21 jQuery
Vue自定义指令详解
2017/07/28 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
通过javascript实现扫雷游戏代码实例
2020/02/09 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
Javascript 模拟mvc实现点餐程序案例详解
2020/12/24 Javascript
[02:11]2016国际邀请赛中国区预选赛全程回顾
2016/07/01 DOTA
利用python写个下载teahour音频的小脚本
2017/05/08 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
Python逐行读取文件内容的方法总结
2020/02/14 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
HTML5 embed 标签使用方法介绍
2013/08/13 HTML / CSS
介绍一下MD5加密算法
2016/11/12 面试题
金融系应届毕业生求职信
2014/05/26 职场文书
小学课外阅读总结
2014/07/09 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
终止或解除劳动合同及劳动关系的证明书
2014/10/06 职场文书
学校运动会广播稿
2014/10/11 职场文书
长城导游词
2015/01/30 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
小学生安全教育心得体会
2016/01/15 职场文书
2019暑期安全倡议书!
2019/06/27 职场文书
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS