tipo print data cast array javascript internet-explorer typeof

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