Después jugando un poco con muchas opciones, creo que este es el método más preciso para detectar si un objeto es una ventana a través del navegador:
(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;
}
}());
que tendrá que realizar algunas pruebas unitarias más riguroso, entonces por favor avíseme sobre cualquier incoherencia que surja.
¿Puede usted acaba de hacer una prueba de equivalencia con respecto 'window'? '(somevar === ventana)? 'sí': 'no'' –
Pero si se trata de una ventana iframe no funcionará. – mck89
Tengo curiosidad, ¿por qué necesitas hacer esto? –