Existe alguma diferença substancial em fazer um desses?
delete a.x;
vs
a.x = undefined;
Onde
a = {
x: 'boo'
};
poderia-se dizer que eles são equivalentes?
(Não estou levando em consideração coisas como "V8 gosta de não usar delete
melhor" )
javascript
bevacqua
fonte
fonte
undefined
como o valor, que ainda é ..Respostas:
Eles não são equivalentes. A principal diferença é que a configuração
significa que
a.hasOwnProperty("x")
ainda retornará verdadeiro e, portanto, ainda aparecerá em umfor in
loop e emObject.keys()
significa que
a.hasOwnProperty("x")
retornará falsoA maneira como eles são iguais é que você não pode dizer se existe uma propriedade testando
O que você não deve fazer se estiver tentando determinar se existe uma propriedade, sempre use
Após a cadeia de protótipos (mencionada por zzzzBov ) A chamada
delete
permitirá que ela suba a cadeia de protótipos, enquanto definir o valor como indefinido não procurará a propriedade nos protótipos encadeados http://jsfiddle.net/NEEw4/1/Exclusão de propriedades herdadas Se a propriedade que você está tentando excluir for herdada,
delete
não a afetará. Ou seja,delete
somente exclui propriedades do próprio objeto, não propriedades herdadas.Portanto, se você precisar garantir que o valor de um objeto seja indefinido,
delete
não funcionará quando a propriedade for herdada, será necessário configurá-la (substituí-la)undefined
nesse caso. A menos que o local que está verificando ele usehasOwnProperty
, mas provavelmente não seria seguro supor que em todos os lugares que o verifiquemhasOwnProperty
fonte
"x" in a
também retornarátrue
com o primeiro efalse
com o segundo. A saída deObject.keys
também será diferente.undefined
, assim como você pode apenas verificarif (a.x)
, a menos que seja para números e 0 é válidoParafraseando a pergunta:
Não.
O primeiro remove a chave da variável, o posterior define a chave com um valor de
undefined
. Isso faz a diferença ao iterar sobre as propriedades dos objetos e quandohasOwnProperty
é usado.Além disso, isso fará uma diferença significativa quando a cadeia de protótipos estiver envolvida.
fonte
delete
permitindo-lhe subir a cadeia de protótiposSe
a.x
for uma função setter,a.x = undefined
chamará a função enquantodelete a.x
não chamará a função.fonte
Sim, há uma diferença. Se você usar
delete a.x
x não é mais uma propriedade de a, mas se você usara.x=undefined
, é uma propriedade, mas seu valor é indefinido.fonte
Os nomes são um pouco confusos.
a.x = undefined
apenas define a propriedade comoundefined
, mas a propriedade ainda está lá:delete
realmente o exclui:fonte
Este REPL do nó deve ilustrar a diferença.
fonte
Tenho certeza que você pode ver a diferença entre
var o1 = {p:undefined};
evar o2 = {};
.Nos dois casos,
o.p
será ,undefined
mas no primeiro caso, é porque esse é o valor e, no segundo caso, porque não há valor .delete
é o operador que permite obtero1
(ou outro objeto que tenha um valor atribuído à suap
propriedade)o2
dessa maneira:delete o1.p;
.A operação reversa é feita simplesmente atribuindo um valor (
undefined
neste exemplo, mas poderia ser outra coisa) à propriedadeo1.p = undefined;
.Então não , eles não são equivalentes.
delete o.p;
vairemova a propriedade
p
do objeto se ele tiver umnão faça nada de outra maneira
o.p = undefined;
vaiadicione uma propriedade
p
ao objeto se ele ainda não tiver uma e defina seu valor comoundefined
basta alterar o valor da propriedade se o objeto já a possuir
Do ponto de vista do desempenho,
delete
é ruim porque modifica a estrutura do objeto (como adicionar uma nova propriedade se você não a inicializou no construtor).Considerando que definir o valor para
undefined
liberar o conteúdo também, mas sem forçar a modificar a estrutura.fonte
Objeto é simplesmente uma representação em árvore, ou seja, na memória a raiz aponta para vários locais de memória onde as chaves desse objeto são armazenadas. e esse local aponta para outro local onde o valor real dessa chave está armazenado, ou locais onde as chaves filho são armazenadas ou locais onde os valores da matriz são armazenados.
Quando você exclui qualquer chave de um objeto usando delete, na verdade, ele exclui o link entre essa chave e seu objeto pai e os locais de memória da chave e seu valor são liberados para armazenar outras informações.
Quando você tenta excluir qualquer chave definindo indefinido como seu valor, está apenas definindo seu valor, não excluindo essa chave. Isso significa que o local da memória das chaves ainda está vinculado ao seu objeto pai e ao valor se a chave estiver indefinida.
Usar indefinido em vez de excluir a palavra-chave delete é uma prática ruim, pois não libera o local da memória dessa chave.
Mesmo que a chave não esteja presente e você a defina como indefinida, ela será criada com valor
undefined
.por exemplo
A exclusão não pode ser trabalhada com propriedades herdadas porque essa propriedade não faz parte do objeto filho.
fonte
as a general rule of thumb, using 'delete' makes thing slower.
e developers.google.com/v8/design eTo reduce the time required to access JavaScript properties, V8 does not use dynamic lookup to access properties. Instead, V8 dynamically creates hidden classes behind the scenes. In V8, an object changes its hidden class when a new property is added.
, finalmente, smashingmagazine.com/2012/11/…Usando uma matriz, em vez de um objeto, posso mostrar que a exclusão usa menos memória heap do que o indefinido.
Por exemplo, este código não será concluído:
Produz este erro:
Então, como você pode ver,
undefined
na verdade, ocupa memória de pilha.No entanto, se você também
delete
o item ário (em vez de apenas configurá-lo comoundefined
), o código será concluído lentamente:Estes são exemplos extremos, mas eles enfatizam
delete
que nunca vi ninguém mencionar em lugar algum.fonte