判断对象是否Window的实现代码

作者: 计算机网络技术  发布:2019-09-16

直入正题吧.
先看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-第88中学的结果
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;
}

本文由今晚买四不像发布于计算机网络技术,转载请注明出处:判断对象是否Window的实现代码

关键词:

上一篇:分享几个超级震憾的图片特效
下一篇:没有了