Estou um pouco confuso com o delete
operador do JavaScript . Pegue o seguinte pedaço de código:
var obj = {
helloText: "Hello World!"
};
var foo = obj;
delete obj;
Após a execução desse trecho de código, obj
é null
, mas foo
ainda se refere a um objeto exatamente como obj
. Eu estou supondo que este objeto é o mesmo objeto que foo
apontou.
Isso me confunde, porque eu esperava que a escrita delete obj
excluísse o objeto que obj
estava apontando na memória - não apenas a variável obj
.
Isso ocorre porque o Garbage Collector do JavaScript está trabalhando com retenção / liberação, para que, se eu não tivesse outras variáveis apontando para o objeto, ele seria removido da memória?
(A propósito, meus testes foram feitos no Safari 4.)
javascript
pointers
object
memory-management
garbage-collection
Steve Harrison
fonte
fonte
var obj = { helloText: "Hello World!" }; var foo = obj; delete obj;
objeto não é excluído de verificaçãoobj
de uso de exclusão:delete obj.helloText
em seguida, verificarfoo now foo is an empty object
delete
não é para excluir objetos em javascript.delete
É usado para remover uma chave de objeto. No seu casovar obj = { helloText: "Hello World!" }; var foo = obj; delete obj;
, o objeto não é excluído. Verifiqueobj
. Em seguida, executedelete obj.helloText
e você pode ver quefoo
agora aponta para um vazio objeto. "" "Respostas:
O operador delete exclui apenas uma referência, nunca um objeto em si. Se ele excluísse o próprio objeto, outras referências restantes estariam pendentes, como uma exclusão do C ++. (E acessar um deles causaria uma falha. Torná-los todos nulos significaria ter um trabalho extra ao excluir ou memória extra para cada objeto.)
Como o Javascript é coletado como lixo, você não precisa excluir os próprios objetos - eles serão removidos quando não houver mais como fazer referência a eles.
Pode ser útil excluir referências a um objeto se você terminar com elas, pois isso fornece ao coletor de lixo mais informações sobre o que pode ser recuperado. Se as referências permanecerem em um objeto grande, isso poderá não ser recuperado - mesmo que o restante do seu programa não use esse objeto.
fonte
delete
palavra-chave funciona apenas para propriedades de um objeto, não para variáveis. perfectionkills.com/understanding-deletevar obj = {a: {}}; delete obj.a;
window
?var
)O
delete
comando não tem efeito sobre variáveis regulares, apenas propriedades. Após odelete
comando, a propriedade não possui o valornull
, não existe mais.Se a propriedade for uma referência a objeto, o
delete
comando excluirá a propriedade, mas não o objeto. O coletor de lixo cuidará do objeto se ele não tiver outras referências a ele.Exemplo:
(Testado no Firefox.)
fonte
x
variável se tornará apenas uma propriedade nowindow
objeto global edelete x;
removerá ax
variável completamente.x
, não será uma variável adequada em alguns navegadores, mas uma propriedade nowindow
objeto. Obviamente, isso é um problema com o console e não reflete como o código é normalmente executado."variáveis declaradas implicitamente" são propriedades do objeto global, portanto, delete funciona nelas, assim como em qualquer propriedade. Variáveis declaradas com var são indestrutíveis.
fonte
let
.Vindo da documentação do Mozilla, "Você pode usar o operador delete para excluir variáveis declaradas implicitamente, mas não aquelas declaradas com a instrução var".
Aqui está o link: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Operators:Special_Operators:delete_Operator
fonte
delete
não é usado para excluir um objeto no java Script.delete
usado para remover umobject key
no seu casoO objeto não é excluído. Verifique se o objeto ainda aceita os mesmos valores. Excluir uso:
e verifique
obj, foo
, ambos são objetos vazios.fonte
Acabei de encontrar um jsperf que você pode considerar interessante à luz deste assunto. (pode ser útil mantê-lo por perto para completar a imagem)
Ele compara excluir , definindo nulo e definindo indefinido .
Mas lembre-se de que ele testa o caso quando você exclui / define propriedades muitas vezes.
fonte
Além das perguntas do GC, para o desempenho, é preciso considerar as otimizações que o navegador pode estar fazendo em segundo plano ->
http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/
Parece que é melhor anular a referência do que excluí-la, pois isso pode alterar a "classe" dos bastidores que o Chrome usa.
fonte
O IE 5 a 8 possui um erro no qual o uso de delete nas propriedades de um objeto host (Window, Global, DOM etc) lança TypeError "o objeto não suporta esta ação".
Posteriormente, se você precisar verificar onde a propriedade tem um significado, use valor total,
el.foo !== undefined
porque"foo" in el
sempre retornará verdadeiro no IE.Se você realmente precisa que a propriedade realmente desapareça ...
se você precisar usar o objeto host com a API do host ...
fonte
Eu me deparei com este artigo na minha busca por essa mesma resposta. O que acabei fazendo é apenas exibir
obj.pop()
todos os valores / objetos armazenados no meu objeto para que eu pudesse reutilizá-lo. Não tenho certeza se isso é uma má prática ou não. Essa técnica foi útil para eu testar meu código nas ferramentas de desenvolvimento do Chrome ou no FireFox Web Console.fonte
Este trabalho para mim, embora não seja uma boa prática. Ele simplesmente exclui todos os elementos associados aos quais o objeto pertence.
fonte
Definir uma variável para
null
garantir que todas as referências a objetos sejam quebradas em todos os navegadores, incluindo referências circulares sendo feitas entre os elementos DOM e os escopos Javascript. Usando odelete
comando, estamos marcando objetos a serem limpos na próxima execução da coleta de lixo, mas se houver várias variáveis referenciando o mesmo objeto, excluir uma única variável NÃO libertará o objeto, apenas removerá a ligação entre essa variável e o objeto. E na próxima execução da coleta de lixo, apenas a variável será limpa.fonte