O delete
operador remove uma propriedade de um objeto. Não pode remover uma variável. Portanto, a resposta para a pergunta depende de como a variável ou propriedade global é definida.
(1) Se for criado com var
, não poderá ser excluído.
Por exemplo:
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) Se for criado sem var
, poderá ser excluído.
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
Explicação técnica
1. Usando var
Nesse caso, a referência g_a
é criada no que a especificação ECMAScript chama de " VariableEnvironment " anexada ao escopo atual - este pode ser o contexto de execução de uma função no caso de usar var
dentro de uma função (embora possa ser um pouco mais complicado quando você considera let
) ou no caso de código "global", o VariableEnvironment é anexado ao objeto global (geralmente window
).
Referências no VariableEnvironment normalmente não são deletable - o processo detalhado no ECMAScript 10,5 explica isso em detalhes, mas basta dizer que a menos que o código é executado em um eval
contexto (que a maioria dos consoles de desenvolvimento baseados em navegador usar), então as variáveis declaradas com var
não pode ser excluído.
2. Sem usar var
Ao tentar atribuir um valor a um nome sem usar a var
palavra - chave, o Javascript tenta localizar a referência nomeada no que a especificação ECMAScript chama de " LexicalEnvironment " e a principal diferença é que LexicalEvironment está aninhado - ou seja, um LexicalEnvironment tem um pai ( o que a especificação ECMAScript chama de "referência do ambiente externo") e quando o Javscript falha ao localizar a referência em um LexicalEenvironment , ele procura no LexicalEnvironment pai (conforme detalhado em 10.3.1 e 10.2.2.1 ). O LexicalEnvironment de nível superior é o " ambiente global", e que está vinculado ao objeto global, em que suas referências são as propriedades do objeto global. Portanto, se você tentar acessar um nome que não foi declarado usando uma var
palavra - chave no escopo atual ou em qualquer escopo externo, o Javascript eventualmente buscará uma propriedade do window
objeto para servir como essa referência.Como aprendemos antes, as propriedades dos objetos podem ser excluídas.
Notas
É importante lembrar que as var
declarações são "içadas" - isto é, sempre são consideradas como ocorridas no início do escopo em que estão - embora não seja a inicialização de valor que pode ser feita em uma var
instrução - que é deixada onde está. . Portanto, no código a seguir, a
é uma referência do VariableEnvironment e não a window
propriedade e seu valor estará 10
no final do código:
function test() { a = 5; var a = 10; }
A discussão acima é quando o "modo estrito" não está ativado. As regras de pesquisa são um pouco diferentes ao usar o "modo estrito" e as referências lexicais que teriam resolvido as propriedades da janela sem o "modo estrito" gerarão erros "variáveis não declaradas" em "modo estrito". Eu realmente não entendi onde isso é especificado, mas é como os navegadores se comportam.
var
fora de uma função) são propriedades do "objeto global", que é o que ocorre nos navegadores da webwindow
. Então -var a = 1; delete window.a; console.log(a);
excluirá a variável com êxito e fará com que a última linha emita um erro de referência.var a = 1; delete window.a; console.log(a);
exibe 1. #1
corretamente em todos os navegadores. Executando em documentos reais, seus exemplos de código estão corretos. Selecionei sua resposta como correta, mas agradeceria se você pudesse editá-la para incluir explicaçõeswindow.a = 1; delete window.a;
e possivelmente o mecanismo. Eu também posso fazer isso se você não se importar.A resposta da @ scunlife funcionará, mas tecnicamente deve ser
delete é suposto não funcionar quando o destino não é uma propriedade de objeto. por exemplo,
Mas como as variáveis globais são na verdade membros do objeto window, ele funciona.
Quando cadeias de protótipos estão envolvidas, o uso de delete fica mais complexo, pois remove apenas a propriedade do objeto de destino, e não o protótipo. por exemplo,
Por isso tem cuidado.
EDIT: Minha resposta é um pouco imprecisa (consulte "Conceitos errados " no final). O link explica todos os detalhes sangrentos, mas o resumo é que pode haver grandes diferenças entre os navegadores e dependendo do objeto do qual você está excluindo.
delete object.someProp
geralmente deve ser seguro enquantoobject !== window
. Eu ainda não o usaria para excluir variáveis declaradas com,var
embora você possa, nas circunstâncias certas.fonte
var
é quando a variável foi declarada comeval
.Se você estiver declarando implicitamente a variável sem
var
, a maneira correta seria usardelete foo
.No entanto, após a exclusão, se você tentar usá-lo em uma operação como a adição a
ReferenceError
, será lançada porque você não pode adicionar uma string a um identificador não declarado e indefinido. Exemplo:Em algumas situações, pode ser mais seguro atribuí-lo a falso, nulo ou indefinido, para que seja declarado e não gerará esse tipo de erro.
Note que no ECMAScript
null
,false
,undefined
,0
,NaN
, ou''
que todos avaliar afalse
. Apenas certifique-se de não usar o!==
operador; em vez disso,!=
ao digitar booleanos e não desejar a verificação de identidade (onull
faria== false
efalse == undefined
).Observe também que
delete
não "exclui" referências, mas apenas propriedades diretamente no objeto, por exemplo:Se você declarou uma variável com,
var
não pode excluí-la:No Rhino:
Também não é possível excluir algumas propriedades predefinidas, como
Math.PI
:Existem algumas exceções estranhas a
delete
qualquer idioma, se você se importa o suficiente, você deve ler:fonte
fonte
delete
.delete
só funciona para uma propriedade. Definindonull
a variável ainda existe.TLDR: simples definido variáveis (sem
var
,let
,const
) poderia ser suprimida comdelete
. Se você usarvar
,let
,const
- não podiam ser apagados nem comdelete
nem comReflect.deleteProperty
.Chrome 55:
FF Nightly 53.0a1 mostra o mesmo comportamento.
fonte
var
caso. Quanto a mim foi interessante para testar e participaçãolet
econst
casos bem. No entanto, obrigado pela observação. Tentará ser mais específico da próxima vez.O ECMAScript 2015 oferece a API Reflect. É possível excluir a propriedade do objeto com Reflect.deleteProperty () :
Para excluir a propriedade do
window
objeto global :Em alguns casos, as propriedades não podem ser excluídas (quando a propriedade não é configurável) e, em seguida, essa função retorna
false
(assim como o operador delete ). Em outros casos, retornostrue
:Há uma diferença entre
deleteProperty
função edelete
operador quando executada no modo estrito:fonte
Variáveis, em contraste com propriedades simples, têm o atributo [[Configurable]] , significando impossibilidade de remover uma variável através do operador delete . No entanto, há um contexto de execução no qual esta regra não afeta. É o contexto eval : o atributo [[Configurable]] não está definido para variáveis.
fonte
O operador de exclusão remove uma propriedade de um objeto.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
De acordo com a pergunta, você precisa de um dos seguintes
fonte
Além do que todos haviam escrito, observe também que
delete
retorna booleano. Pode dizer se a exclusão foi bem-sucedida ou não.Testando no Chrome, tudo exceto
let
foi delicioso. quandodelete
retornadotrue
, na verdade os removeu:fonte
let
vars econst
vars, ele retorna true, o que deve significar que a variável foi excluída, mas não é. Você pode verificá-lo no Chrome e no FF. O FF parece retornar valores corretos, enquanto o Chrome não está. Portanto, não tenha certeza de que você realmente pode confiar nisso. Vamos ver: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
operador trabalha. Mas não está descrevendo por que literalmente opõe a situação às funções. Que pena. No entanto, em relação às variáveis, as coisas começam a parecer muito mais claras.Você não pode excluir uma variável se a declarar (com var x;) no momento do primeiro uso. No entanto, se sua variável x apareceu pela primeira vez no script sem uma declaração, você pode usar o operador delete (delete x;) e sua variável será excluída, muito semelhante a excluir um elemento de uma matriz ou excluir uma propriedade de um objeto .
fonte
Estou um pouco confuso. Se tudo o que você deseja é que um valor de variável não passe para outro script, não há necessidade de excluir a variável do escopo. Simplesmente anule a variável e verifique explicitamente se é ou não nula. Por que enfrentar o problema de excluir a variável do escopo? Que finalidade esse servidor que anula não pode?
fonte
null
valor que eu não quero acionar.<?php if(isset($_POST['somevariable']) unset($_POST['somevariable']); if(isset($_GET['somevariable']) unset($_GET['somevariable']); ?>