Проверка Javascript, если переменная является окном

Знаете ли вы, что хороший способ проверить, является ли переменная объектом окна в javascript? Я пробовал:

var variable=window;
Object.prototype.toString.call(variable);

В Firefox он возвращает "[object Window]", но в IE "[object Object]", так что это не правильный путь. Вы знаете точный способ проверить это?

Ответ 1

Да, но мне нужен способ проверить каждое окно не только на текущий

Есть несколько способов сделать это. Самый простой способ - проверить наличие одного или двух известных свойств объекта окна. Также свойство self - для каждого окна можно проверить, что свойство self равно объекту окна:

myvar.self == myvar;
window.self == window;
frameElement.contentWindow.self == frameElement.contentWindow;

Ответ 2

Обнаружено это в исходном коде AngularJS. Один лайнер и удар по цели.

return variable && variable.document && variable.location && variable.alert && variable.setInterval;

Ответ 3

Как насчет просто:

isWindow = variable === window;

Тройной эквивалент предотвращает принуждение типа, которое в противном случае сделало бы это намного сложнее.

Ответ 4

После многопользовательской работы, я считаю, что это самый точный метод определения того, является ли объект кросс-браузером:

(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;
    }
}());

Мне нужно будет выполнить более строгий unit тест, поэтому пожалуйста сообщите мне о любых несоответствиях, которые возникают.

Ответ 5

variable == window

Кто-то все еще может определить локальную переменную с именем window. Я не уверен, что есть способ, который был бы устойчив ко всем таким махинациям. Кто-то может сделать объект, который скопировал большую часть свойств и функций окна, включая toString.

Ответ 6

if(variable == window)

Это, конечно, проверяет, является ли объект переменной этим окном (т.е. окно документа, выполняющего javascript).

В качестве альтернативы вы можете попробовать что-то вроде этого:

if(variable.document && variable.location)

И проверьте наличие нескольких оконных полей и/или функций, чтобы вы были уверены, что это окно...

Ответ 7

Так как window - глобальная переменная, а глобальные переменные - свойства глобального объекта, window.window будет равно window. Итак, вы можете проверить:

if (mysteryVariable.window == mysteryVariable)
    ...

Проблема в том, что это можно обмануть, если у нас есть такой объект:

var q = {};
q.window = q;

Если это не так, вы можете использовать этот код.

Ответ 8

var x = new Window();
x instanceof Window
var y = []
y instanceof Window

Ответ 9

let isWindowObj = (anObject instanceof Window);