El delete
operador elimina una propiedad de un objeto. No puede eliminar una variable. Entonces, la respuesta a la pregunta depende de cómo se defina la variable o propiedad global.
(1) Si se crea con var
, no se puede eliminar.
Por ejemplo:
var g_a = 1; //create with var, g_a is a variable
delete g_a; //return false
console.log(g_a); //g_a is still 1
(2) Si se crea sin var
, se puede eliminar.
g_b = 1; //create without var, g_b is a property
delete g_b; //return true
console.log(g_b); //error, g_b is not defined
Explicación técnica
1. Usando var
En este caso, la referencia g_a
se crea en lo que la especificación ECMAScript llama " VariableEnvironment " que se adjunta al alcance actual; este puede ser el contexto de ejecución de una función en el caso de usar var
dentro de una función (aunque puede ser un poco más complicado cuando lo considere let
) o en el caso del código "global", el entorno variable se adjunta al objeto global (a menudo window
).
Las referencias en el entorno Variable normalmente no se pueden eliminar: el proceso detallado en ECMAScript 10.5 explica esto en detalle, pero es suficiente decir que a menos que su código se ejecute en un eval
contexto (que la mayoría de las consolas de desarrollo basadas en navegador usan), entonces las variables declaradas con var
no pueden ser eliminado
2. Sin usar var
Al intentar asignar un valor a un nombre sin usar la var
palabra clave, Javascript intenta ubicar la referencia nombrada en lo que la especificación ECMAScript llama " LexicalEnvironment ", y la principal diferencia es que LexicalEvironment s está anidado, es decir, un entorno Lexical tiene un padre ( lo que la especificación ECMAScript llama "referencia de entorno externo") y cuando Javscript no puede localizar la referencia en un entorno Lexical , se ve en el padre entorno Lexical (como se detalla en 10.3.1 y 10.2.2.1 ). El nivel superior de LexicalEnvironment es el " entorno global", y eso está vinculado al objeto global en el sentido de que sus referencias son las propiedades del objeto global. Por lo tanto, si intenta acceder a un nombre que no se declaró utilizando una var
palabra clave en el ámbito actual o cualquier ámbito externo, Javascript finalmente obtendrá una propiedad del window
objeto para que sirva como referencia. Como hemos aprendido antes, las propiedades de los objetos se pueden eliminar.
Notas
Es importante recordar que las var
declaraciones son "izadas", es decir, siempre se considera que ocurrieron al comienzo del alcance en el que se encuentran, aunque no la inicialización del valor que se puede hacer en una var
declaración, que se deja donde está. . Entonces, en el siguiente código, a
es una referencia del entorno Variable y no elwindow
propiedad y su valor estará 10
al final del código:
function test() { a = 5; var a = 10; }
La discusión anterior es cuando el "modo estricto" no está habilitado. Las reglas de búsqueda son un poco diferentes cuando se utiliza el "modo estricto" y las referencias léxicas que se habrían resuelto a las propiedades de la ventana sin el "modo estricto" generarán errores de "variable no declarada" en el "modo estricto". Realmente no entendí dónde se especifica esto, pero es cómo se comportan los navegadores.
var
fuera de una función) son propiedades del "objeto global", que es en los navegadores webwindow
. Entonces,var a = 1; delete window.a; console.log(a);
eliminará con éxito la variable y hará que la última línea emita un error de referencia.var a = 1; delete window.a; console.log(a);
muestra 1.1
correctamente en todos los navegadores. Ejecutando en documentos reales, sus ejemplos de código son correctos. Seleccioné su respuesta como correcta, pero agradecería si puede editarla para incluir explicacioneswindow.a = 1; delete window.a;
y posiblemente el mecanismo. También puedo hacerlo si no te importa.La respuesta de @ scunlife funcionará, pero técnicamente debería ser
Se supone que eliminar es un no-op cuando el objetivo no es una propiedad de objeto. p.ej,
Pero dado que las variables globales son en realidad miembros del objeto de ventana, funciona.
Cuando las cadenas de prototipos están involucradas, el uso de eliminar se vuelve más complejo porque solo elimina la propiedad del objeto de destino, y no el prototipo. p.ej,
Así que ten cuidado.
EDITAR: Mi respuesta es algo inexacta (ver "Conceptos erróneos" al final). El enlace explica todos los detalles sangrientos, pero el resumen es que puede haber grandes diferencias entre los navegadores y dependiendo del objeto desde el que está borrando.
delete object.someProp
generalmente debe ser seguro mientrasobject !== window
. Todavía no lo usaría para eliminar variables declaradas con,var
aunque puede hacerlo en las circunstancias correctas.fuente
var
es cuando la variable se declaró coneval
.Si está declarando implícitamente la variable sin
var
, la forma correcta sería utilizarladelete foo
.Sin embargo, después de eliminarlo, si intenta usar esto en una operación como la adición
ReferenceError
, se generará un a porque no puede agregar una cadena a un identificador no declarado ni definido. Ejemplo:Puede ser más seguro en algunas situaciones asignarlo a falso, nulo o indefinido para que se declare y no arroje este tipo de error.
Nótese que en ECMAScript
null
,false
,undefined
,0
,NaN
, o''
sería toda evaluar afalse
. Solo asegúrese de no usar el!==
operador, sino que!=
cuando escriba la comprobación de booleanos y no desee la comprobación de identidad (también lonull
haría== false
yfalse == undefined
).También tenga en cuenta que
delete
no "elimina" las referencias sino solo las propiedades directamente en el objeto, por ejemplo:Si ha declarado una variable con
var
no puede eliminarla:En rinoceronte:
Tampoco puede eliminar algunas propiedades predefinidas como
Math.PI
:Hay algunas excepciones extrañas al
delete
igual que con cualquier idioma, si le importa lo suficiente debe leer:fuente
fuente
delete
.delete
solo funciona para una propiedad. Al configurarlo,null
la variable todavía existe.TLDR: sencilla define las variables (sin
var
,let
,const
) podría suprimirse condelete
. Si utilizavar
,let
,const
- no podían ser borrados ni condelete
ni conReflect.deleteProperty
.Chrome 55:
FF Nightly 53.0a1 muestra el mismo comportamiento.
fuente
var
caso. En cuanto a mí, fue interesante probar y compartirlet
yconst
casos también. Sin embargo, gracias por la nota. Intentaremos ser más específicos la próxima vez.ECMAScript 2015 ofrece Reflect API. Es posible eliminar la propiedad del objeto con Reflect.deleteProperty () :
Para eliminar la propiedad del
window
objeto global :En algunos casos, las propiedades no se pueden eliminar (cuando la propiedad no es configurable) y luego se devuelve esta función
false
(así como eliminar el operador ). En otros casos devuelvetrue
:Hay una diferencia entre
deleteProperty
función ydelete
operador cuando se ejecuta en modo estricto:fuente
Las variables, en contraste con las propiedades simples, tienen el atributo [[Configurable]] , lo que significa que es imposible eliminar una variable a través del operador de eliminación . Sin embargo, hay un contexto de ejecución en el que esta regla no afecta. Es el contexto de evaluación : el atributo [[Configurable]] no está configurado para variables.
fuente
El operador de eliminación elimina una propiedad de un objeto.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
Según la pregunta, necesita uno de los siguientes
fuente
Además de lo que todos habían escrito, también tenga en cuenta que
delete
devuelve boolean. Puede decirle si la eliminación fue exitosa o no.Pruebas en Chrome, todo excepto
let
deleltable. cuandodelete
regresó,true
en realidad los eliminó:fuente
let
vars yconst
vars, devuelve true lo que debería significar que la variable se eliminó, pero no lo es. Puede verificarlo tanto en Chrome como en FF. FF parece devolver los valores correctos mientras que Chrome no lo está. Así que no estoy seguro de que realmente pueda confiar en ello. Veamos:let letVar = "1"; undefined delete letVar; true letVar "1" typeof letVar; "string" const constVar="1"; undefined delete constVar; true constVar; "1" typeof constVar; "string"
delete
funciona el operador. Pero no está describiendo por qué literalmente oponen la situación con las funciones. Como una pena Sin embargo, con respecto a las variables, las cosas comienzan a parecer mucho más claras.No puede eliminar una variable si la declaró (con var x;) en el momento del primer uso. Sin embargo, si su variable x apareció por primera vez en el script sin una declaración, puede usar el operador delete (delete x;) y su variable se eliminará, muy similar a eliminar un elemento de una matriz o eliminar una propiedad de un objeto .
fuente
Estoy un poco confundido Si todo lo que desea es que un valor de variable no pase a otro script, entonces no hay necesidad de eliminar la variable del ámbito. Simplemente anule la variable y luego compruebe explícitamente si es nula o no. ¿Por qué pasar por la molestia de eliminar la variable del alcance? ¿Para qué sirve este servidor que no puede anular?
fuente
null
valor que no quiero activar.<?php if(isset($_POST['somevariable']) unset($_POST['somevariable']); if(isset($_GET['somevariable']) unset($_GET['somevariable']); ?>