你知道如何在Javascript中检查一个变量是否为window对象吗?我已经尝试过:
var variable=window;
Object.prototype.toString.call(variable);
在 Firefox 中返回 "[object Window]"
,但在 IE 中返回 "[object Object]"
,所以这不是正确的方法。你知道一个准确的方式来检查吗?
你知道如何在Javascript中检查一个变量是否为window对象吗?我已经尝试过:
var variable=window;
Object.prototype.toString.call(variable);
在 Firefox 中返回 "[object Window]"
,但在 IE 中返回 "[object Object]"
,所以这不是正确的方法。你知道一个准确的方式来检查吗?
是的,但我需要一种检查每个窗口而不仅仅是当前窗口的方法
有几种方法可以做到这一点。 最简单的方法是检查窗口对象上的一个或两个已知属性。 还有self
属性 - 对于每个窗口,您可以检查self
属性是否等于该窗口对象:
myvar.self == myvar;
window.self == window;
frameElement.contentWindow.self == frameElement.contentWindow;
self
可以被覆盖,通常用作变量名以保留上下文。 - zzzzBovvar
。只要引用window.self
而不仅仅是self
,你就应该没问题了。如果对任何人来说这很重要,我想他们可以使用window.window
而不是window.self
,如果他们愿意的话。在大多数现代浏览器中,它受到防止被覆盖的保护。 - Andy EsetInterval
,因为它最不可能被另一个对象重复使用作为属性名称,并且所有已知的浏览器都支持它。现代的替代方法可能是使用Object.prototype.toString(obj)
,它将在大多数浏览器中返回[object global]
或[object Window]
,主要异常情况是IE 7及以下版本。尽管如此,它仍然不完全弹性。也许在5年内会有改变。 - Andy EObject.prototype.toString
这个东西了吧 :-) - Andy Ereturn variable && variable.document && variable.location && variable.alert && variable.setInterval;
&& true
可以解决此问题。 - Infigon在尝试了许多选项后,我相信这是跨浏览器检测对象是否为窗口的最准确方法:
(function () {
"use strict";
var wStr;
wStr = Object.prototype.toString.call(window);
function isWindow(arg) {
var e,
str,
self,
hasSelf;
//Safari returns DOMWindow
//Chrome returns global
//Firefox, Opera & IE9 return Window
str = Object.prototype.toString.call(arg);
switch (wStr) {
case '[object DOMWindow]':
case '[object Window]':
case '[object global]':
return str === wStr;
}
///window objects always have a `self` property;
///however, `arg.self == arg` could be fooled by:
///var o = {};
///o.self = o;
if ('self' in arg) {
//`'self' in arg` is true if
//the property exists on the object _or_ the prototype
//`arg.hasOwnProperty('self')` is true only if
//the property exists on the object
hasSelf = arg.hasOwnProperty('self');
try {
if (hasSelf) {
self = arg.self;
}
delete arg.self;
if (hasSelf) {
arg.self = self;
}
} catch (e) {
//IE 7&8 throw an error when window.self is deleted
return true;
}
}
return false;
}
}());
我需要进行更严格的单元测试,所以请告诉我任何出现的不一致之处。
'[object Window]'
,那将是非常好的,然而,ECMAScript5规范允许每个浏览器选择全局对象的[[Class]]
属性的自己的值。从这个意义上说,它是相对限制性的实现,但我认为它比检查arg.self == arg
更具弹性,后者很容易被欺骗。 - zzzzBovif (obj && typeof obj === "object" && "setInterval" in obj)
已经足够了。什么时候有人需要编写 o.self = o
,并且有多大可能有人需要检查它是否是一个 window
对象呢?至于弹性,你使用的 "use strict"
使函数比 arg.self === arg
更不具弹性,因为当你删除一个 self
属性并且该属性的 Configurable
属性设置为 false
时,将抛出 TypeError。 - Andy EObject.prototype.toString
的内容,并注意到在所有主要浏览器中,window.constructor.prototype.toString !== Object.prototype.toString
。接下来的两个小时里,我一直试图弄清楚为什么,但我仍然不知道答案。有些事情就是这样让你困扰。 - Andy EDOMWindow
/Window
通过原型链继承自Object
的属性和方法。这种继承包括toLocaleString()
,它与toString()
几乎相同。我之前困惑的是为什么toString()
没有被继承,即使结果相同(除了Chrome返回window.toString()
的“[object DOMWindow]”,而不是“[object global]”)。 - Andy E只需要这样怎么样:
isWindow = variable === window;
三个等号可以防止类型强制转换,否则这将使得这个过程变得更加困难。
variable == window
有人仍然可以定义一个名为window
的局部变量。我不确定是否有一种方法能够抵御所有这些恶作剧。有人可以创建一个对象,复制大多数窗口属性和函数,包括toString
。
if(variable == window)
if(variable.document && variable.location)
检查一下几个窗口字段或函数的存在,这样你就可以相当确定它是一个窗口了...
window
对象有一个指向自身的属性。因此,您可以使用 window.window == window
。this
始终保持当前上下文。您可以使用 this == window
。frame
,每个框架都包含自己的 window
对象。要检查全局的 window
对象,可以使用 window.parent == window
。console.log("1 : " + (window.window == window))
console.log("2 : " + (window.window == this))
console.log("3 : " + (window.parent == window))
这里是您可以对窗口(w)执行的“几乎”所有检查:
window
,则应执行此操作// the `false` branch is for `boolean` TypeScript consistency and tests
const isWindow = (object) => object && object.constructor.name === 'Window' || false;
isWindow() // => false
isWindow(window) // => true
isWindow(window.parent) // => true
isWindow(window.top) // => true
进行这种检查的原因是测试运行程序在各种iframes中调用本地方法遇到各种问题,特别是instanceof
。
const win = window;
// TOP
console.log(win === win.top)
// PARENT
console.log(win === win.parent)
// CONTEXT
console.log(win === win.self)
// ONE WINDOW
console.log(win === win.self && win === win.top)
由于window
是全局变量,而全局变量是全局对象的属性,因此window.window
将等于window
。所以你可以测试:
if (mysteryVariable.window == mysteryVariable)
...
var q = {};
q.window = q;
let isWindowObj = (anObject instanceof Window);
window
进行等价性测试?(somevar === window)?'yes':'no'
- Stephen Ierodiaconou