2012-08-27 9 views
10

Según this MDN page, la palabra clave delete¿Cuál es el verdadero significado del valor devuelto de `delete`?

devuelve false sólo si existe la propiedad y no se puede eliminar. Es devuelve verdadero en todos los demás casos.

Sin embargo, veo los casos en que delete vuelve true, a pesar de que la propiedad no se eliminan:

delete Window 
delete alert 
delete dir 
delete console 
delete 2 
delete null 
delete {}.x 
... 

De hecho, casi todas las propiedades de window retorno verdaderos con delete, como puede verse por la ejecución la secuencia de comandos siguiente en about:blank:

for(a in window) { if(delete window[a]) { console.log(a); } } 

Sin embargo, la mayoría de las propiedades de window hacen en realidad no ser eliminado. ¿Cuál es el verdadero significado del valor devuelto de delete? ¿Por qué devuelve true para las propiedades que no elimina?

(Nota:. Yo estaría interesado en referencias al código de cromo que explican el comportamiento de delete)

+0

Esa línea me proporcionó bastantes nombres y luego deshabilité jQuery, por lo que no pude decirlo. Parece estar funcionando según lo previsto. –

+0

¿Has probado los ejemplos como 'eliminar ventana', etc.? – Randomblue

Respuesta

8

La ventana es host object, una cuya semántica está definida por el entorno host, p. Ej. el navegador. delete cuando se aplica a propiedades de objetos host es más complicado que cuando se aplica a objetos nativos.

Los objetos host pueden admitir estas propiedades internas con cualquier comportamiento dependiente de la implementación, siempre que sea coherente con las restricciones específicas del objeto host indicadas en este documento.

Section 11.4.1 - The delete operator dice

If IsUnresolvableReference(ref) then, 
    If IsStrictReference(ref) is true, throw a SyntaxError exception. 
    Else, return true. 

así que cuando un objeto host no soporta supresión o modificación de una propiedad, entonces se devuelve una referencia de irresoluble o una referencia que pretende ser eliminado. Cualquiera de las dos aproximaciones hace que se devuelva true en modo no estricto.

1

Teniendo en cuenta que usted está actuando en objetos de bajo nivel en su programa, los atributos pueden de hecho ser borrados y luego Inmediatamente se volvió a agregar, aunque no tengo idea de cómo se puede probar este comportamiento.

1

En esa página MDN, especifica la sintaxis, que no incluye delete object como su primer conjunto de ejemplos utiliza. Especifica la sintaxis delete object[property] como muestra su segundo ejemplo. Sin embargo, lo que sucede con los objetos DOM (host) no está especificado. Ver this article for more information.

0

Básicamente, los navegadores protegen el entorno de ejecución del navegador, en su prueba.

Había una vez, que no podría haber sido el caso, pero por lo que las pruebas van, esto es como preguntar por qué Windows no le permite abrir la consola de comandos y ejecuta:

> cd/
> deltree *.* 

más.

Porque realmente no hay una buena razón para poder hacer tal cosa, cuando espera que el entorno continúe funcionando, luego, y no quite todo su navegador, además de potencialmente la instancia de su sistema operativo usted se está ejecutando actualmente, o cualquier otro error divertido que pueda ocurrir cuando básicamente le pide a un programa que se borre en tiempo real, mientras que actualmente tiene acceso de bajo nivel a su GPU/tarjeta de sonido/dispositivos de entrada.

Eliminar devolverá un error en el caso de que intente eliminar una var. En términos de propiedades globales, el navegador necesita funcionar, la mayoría de ellos se definen como una propiedad (es decir, window.location), pero lo hacen a bajo nivel (es decir, no tiene acceso). Entonces, teóricamente, son objetos que pueden eliminarse. Pero están protegidos, por lo que no puede, pero eso no va a cambiar la declaración de devolución de delete, porque eso alteraría el comportamiento esperado de delete.

Así:

function() { 
    var obj = { prop : true }; 
    delete obj; /* fail */ 
    delete object.prop; /* succeed */ 
} 
2

La implementación de JavaScript utilizado por los navegadores siempre ha sido romper las reglas. Parte de la API DOM de javascript ni siquiera es posible en javascript puro, por ejemplo el dom innerHTML = "algo" que desencadena un evento. Esto se corrigió en EcmaScript5, pero no se puede confiar en que el Modelo de objetos del navegador sea javascript 100% legítimo. AFAIK, siempre y cuando no pongas un pie en el DOM y en la BOM, puedes confiar completamente en el estándar ecmascript.

Cuestiones relacionadas