javascript - print - typeof devuelve "desconocido" en IE
typeof class javascript (3)
Tengo una ventana donde, antes de cerrarla, actualizo la página subyacente.
if(opener && typeof(opener.Refresh) != ''undefined'')
{
opener.Refresh();
}
Si me alejé de la página de inicio original, este código generará un error de "Permiso denegado" .
La depuración del código reveló que typeof(opener.Refresh)
era igual a "desconocido" en lugar de lo esperado "indefinido" .
Hasta donde sé, "desconocido" no es uno de los valores de retorno para typeof
, entonces , ¿cómo y por qué se devolvería este valor?
Más información
Evité el error cambiando el cheque a:
if(opener && typeof(opener.Refresh) == ''function'')
Sin embargo, ejemplos como este ( detecting-an-undefined-object-property-in-javascript ) no parecen tener un factor "desconocido" en la ecuación.
De acuerdo con una pregunta duplicada en Bytes , el tipo de valor unknown
se agrega a la versión 8 de JScript, junto con la date
.
Un comment en un blog de Robert Nyman también puede ser explicativo:
Internet Explorer muestra "desconocido" cuando el objeto en cuestión está del otro lado de un puente COM +. Puede no saber esto o darse cuenta de esto, pero el objeto XMLHTTP de MS es parte de un objeto COM + diferente que implementa IUnknown; cuando llamas a los métodos, lo haces a través de un puente COM y no llamas a JavaScript nativo.
Básicamente esa es la respuesta de MS si intentas probar o acceder a algo que no es una parte verdadera del motor de JScript.
La especificación ECMAScript establece que para los objetos host el valor de retorno del operador typeof
es:
Implementado-definido excepto que no puede ser "
undefined
", "boolean
", "number
" o "string
".
Creo que el valor unknown
solo se devuelve en Internet Explorer. Curiosamente, MSDN no lo menciona:
Hay seis valores posibles que devuelve typeof: "number", "string", "boolean", "object", "function" y "undefined".
Prueba in
operador. Tuve el mismo problema (con el applet) y lo resolví usando in
:
if("Refresh" in opener) {
opener.Refresh();
}