判断对象是否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 相关文章推荐
Dom 是什么的详细说明
Oct 25 Javascript
jQuery实现渐变下拉菜单的简单方法
Mar 11 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
Mar 26 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
May 31 Javascript
JavaScript必知必会(七)js对象继承
Jun 08 Javascript
JS判断是否在微信浏览器打开的简单实例(推荐)
Aug 24 Javascript
Angular 4.0学习教程之架构详解
Sep 12 Javascript
详解vue-cli项目中用json-sever搭建mock服务器
Nov 02 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
Aug 14 Javascript
vue+iview 兼容IE11浏览器的实现方法
Jan 07 Javascript
vue中v-show和v-if的异同及v-show用法
Jun 06 Javascript
jquery实现简单拖拽效果
Jul 20 jQuery
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与已存在的Java应用程序集成
2006/10/09 PHP
PHP实现分页的一个示例
2006/10/09 PHP
PHP多例模式介绍
2013/06/24 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
JS继承--原型链继承和类式继承
2013/04/08 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
node.js中的http.response.getHeader方法使用说明
2014/12/14 Javascript
JavaScript淡入淡出渐变简单实例
2015/08/06 Javascript
贴近用户体验的Jquery日期、时间选择插件
2015/08/19 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
2016/08/05 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
解析vue中的$mount
2017/12/21 Javascript
基于vue v-for 多层循环嵌套获取行数的方法
2018/09/26 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
2019/07/10 jQuery
vue内置组件component--通过is属性动态渲染组件操作
2020/07/28 Javascript
Python中__init__和__new__的区别详解
2014/07/09 Python
python机器学习之KNN分类算法
2018/08/29 Python
解决python运行启动报错问题
2020/06/01 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
酒店保安员岗位职责
2014/01/31 职场文书
艺术学院毕业生自我评价
2014/03/02 职场文书
保护动物倡议书
2014/04/15 职场文书
群众路线批评与自我批评发言稿
2014/10/16 职场文书
思想政治表现评语
2015/01/04 职场文书
开学第一周总结
2015/07/16 职场文书
Python 如何安装Selenium
2021/05/06 Python
Python使用scapy模块发包收包
2021/05/07 Python
css filter和getUserMedia的联合使用
2022/02/24 HTML / CSS
MySQL数据库简介与基本操作
2022/05/30 MySQL