Qual é a diferença real entre declarar uma matriz como esta:
var myArray = new Array();
e
var myArray = [];
javascript
arrays
declaration
Amr Elgarhy
fonte
fonte
[]
token:ARRAY_INIT
;new Array
fichas:NEW, IDENTIFIER
;new Array()
fichas:NEW, IDENTIFIER, CALL
Respostas:
Há uma diferença, mas não há diferença nesse exemplo.
Usando o método mais detalhado:
new Array()
tem uma opção extra nos parâmetros: se você passar um número para o construtor, obterá uma matriz desse comprimento:Para ilustrar as diferentes maneiras de criar uma matriz:
Outra diferença é que, ao usar,
new Array()
você pode definir o tamanho da matriz, o que afeta o tamanho da pilha. Isso pode ser útil se você estiver recebendo estouros de pilha ( Desempenho de Array.push vs Array.unshift ), que é o que acontece quando o tamanho da matriz excede o tamanho da pilha e precisa ser recriada. Portanto, dependendo do caso de uso, pode haver um aumento de desempenho ao usar,new Array()
pois você pode impedir que o estouro aconteça.Como apontado nesta resposta ,
new Array(5)
na verdade , não adicionamos cincoundefined
itens à matriz. Simplesmente adiciona espaço para cinco itens. Esteja ciente de que o usoArray
dessa maneira dificulta a utilizaçãoarray.length
de cálculos.fonte
A diferença entre criar uma matriz com a matriz implícita e o construtor da matriz é sutil, mas importante.
Quando você cria uma matriz usando
Você está dizendo ao intérprete para criar uma nova matriz de tempo de execução. Não é necessário processamento extra. Feito.
Se você usar:
Você está dizendo ao intérprete, eu quero chamar o construtor "
Array
" e gerar um objeto. Ele então pesquisa seu contexto de execução para encontrar o construtor a ser chamado, e o chama, criando sua matriz.Você pode pensar "Bem, isso não importa. Eles são iguais!". Infelizmente você não pode garantir isso.
Veja o seguinte exemplo:
No exemplo acima, a primeira chamada alertará 'SPARTA' conforme o esperado. O segundo não. Você acabará vendo indefinido. Você também observará que b contém todas as funções nativas do objeto Array, como
push
, onde o outro não.Embora você possa esperar que isso aconteça, apenas ilustra o fato de que
[]
não é o mesmonew Array()
.Provavelmente é melhor usar apenas
[]
se você sabe que deseja apenas uma matriz. Eu também não sugiro dar uma volta e redefinir Array ...fonte
Há uma diferença importante que nenhuma resposta mencionou ainda.
Disto:
Você pode pensar que
new Array(2)
é equivalente a[undefined, undefined]
, mas NÃO é!Vamos tentar com
map()
:Vejo? A semântica é totalmente diferente! Então porque é isso?
De acordo com a ES6 Spec 22.1.1.2, o trabalho de
Array(len)
apenas criar uma nova matriz cuja propriedadelength
está definida como argumentolen
e é isso, significa que não há nenhum elemento real dentro dessa nova matriz criada.A função
map()
, de acordo com a especificação 22.1.3.15, primeiro verifica eHasProperty
depois chama o retorno de chamada, mas acontece que:E é por isso que você não pode esperar nenhuma função de iteração funcionando normalmente em matrizes criadas a partir de
new Array(len)
.BTW, Safari e Firefox têm uma "impressão" muito melhor para esta situação:
Eu já enviei um problema ao Chromium e solicite a correção desta impressão confusa: https://bugs.chromium.org/p/chromium/issues/detail?id=732021
UPDATE: já está consertado. Chrome agora impresso como:
fonte
[...Array(2)]
qual não consigo encontrar referências documentadas: o que equivale ao[undefined, undefined]
ponto de vista dos resultados.undefined
como de costume.Curiosamente,
new Array(size)
é quase duas vezes mais rápido que[]
no Chrome e quase o mesmo no FF e no IE (medido pela criação e preenchimento de uma matriz). Só importa se você souber o tamanho aproximado da matriz. Se você adicionar mais itens do que o tamanho especificado, o aumento de desempenho será perdido.Mais precisamente:
Array(
é uma operação rápida de tempo constante que não aloca memória, enquanto que[]
é uma operação linear de tempo que define o tipo e o valor.fonte
new Array(length)
em 0 <= tamanho <= ~ 1000, em tamanho> ~ 1000 vitórias[]
Para obter mais informações, a página a seguir descreve por que você nunca precisa usar
new Array()
Verifique também os comentários - o
new Array(length)
formulário não serve a nenhum propósito útil (pelo menos nas implementações atuais de JavaScript).fonte
Para melhor entender
[]
enew Array()
:O resultado acima é do console do Google Chrome no Windows 7.
fonte
Array(3)
ounew Array(3)
não são as mesmas[3]
.O primeiro é a chamada do construtor de objeto padrão. Você pode usar os parâmetros, se quiser.
O segundo oferece a capacidade de criar uma matriz não vazia:
fonte
var array = [5]
usar colchetes, mas não o construtor, poisvar array = Array(5)
cria uma matriz vazia de 5 elementos.Eu posso explicar de uma maneira mais específica, começando com este exemplo, baseado no bom exemplo de Fredrik.
Acabei de adicionar outro valor às matrizes e fiz quatro alertas: O primeiro e o segundo devem nos fornecer o valor armazenado em cada matriz, para ter certeza dos valores. Eles retornarão o mesmo! Agora tente o terceiro, ele retorna falso, é porque
A primeira diferença é que quando chamamos test1, ele chama uma variável sem pensar, apenas retorna os valores que são armazenados nessa variável, independentemente do seu tipo de dados! Mas, quando chamamos test2, ele chama a função Array () e, em seguida, armazena nossos valores "Pushed" em sua propriedade "Value" , e o mesmo acontece quando alertamos test2, retornando o "Value" propriedade do objeto de matriz.
Portanto, quando verificamos se test1 é igual a test2, é claro que eles nunca retornarão true, uma é uma função e a outra é uma variável (com um tipo de array), mesmo que tenham o mesmo valor!
Para ter certeza, tente o quarto alerta, com o valor. Adicionado a ele; retornará verdadeiro. Nesse caso, dizemos ao JS "Independentemente do tipo do contêiner, seja ele função ou variável, compare os valores armazenados em cada contêiner e conte-nos o que viu!" é exatamente o que acontece.
Espero ter dito claramente a idéia por trás disso e desculpe-me pelo meu inglês ruim.
fonte
[]
enew Array()
é idêntico;.value
seráundefined
em ambos os casos, e compará-los sempre será falso.array.value
. e ambostypeof []
etypeof new Array()
retornarobject
. É uma das razões pelas quais existe uma função chamadaArray.isArray
Não há diferença quando você inicializa a matriz sem nenhum comprimento. Então
var a = []
&var b = new Array()
é o mesmo.Mas se você inicializar a matriz com comprimento igual
var b = new Array(1);
, ele definirá o comprimento do objeto da matriz como 1. Portanto, é equivalente avar b = []; b.length=1;
.Isso será problemático sempre que você fizer o array_object.push, ele adicionará item após o último elemento e aumentará o comprimento.
vs
fonte
O primeiro é o construtor de objeto padrão call.mostly usado para valores dinâmicos.
a segunda matriz é usada ao criar valores estáticos
fonte
Não há grande diferença, eles basicamente fazem a mesma coisa, mas de maneiras diferentes, mas continue lendo, veja esta declaração no W3C:
e
Mas, ao mesmo tempo, criar uma nova matriz usando a
new Array
sintaxe considerada uma má prática:Portanto, basicamente não é considerada a melhor prática, também há uma pequena diferença, é possível passar o tempo para
new Array(length)
isso, o que também não é uma maneira recomendada.fonte
new Array(40).fill(123)
A diferença de usar
Ou
Como já foi discutido o suficiente nesta questão.
Gostaria de acrescentar a questão da velocidade - a maneira mais rápida atual
google chrome
é a segunda.Mas preste atenção, essas coisas tendem a mudar muito com as atualizações. Além disso, o tempo de execução será diferente entre os diferentes navegadores.
Por exemplo - a segunda opção que mencionei, é executada em 2 milhões [ops / segundo]
chrome
, mas se você tentarmozilla dev.
obterá uma taxa surpreendentemente maior de 23 milhões.De qualquer forma, sugiro que você verifique, de vez em quando, em diferentes navegadores (e máquinas), usando o site como tal
fonte
Como eu sei a diferença, você pode encontrar a fatia (ou as outras funções do Array) como code1 .e code2 show u Array e suas instâncias :
code1:
code2:
conclusão:
como você pode ver
[]
enew Array()
criar uma nova instância de Array. E todas elas obtêm as funções de protótipo deArray.prototype
Eles são apenas instâncias diferentes de Array. Então, isso explica por que
[] != []
:)
fonte
Eu incorri em um comportamento estranho usando [].
Temos Model "classes" com campos inicializados com algum valor. Por exemplo:
Descobri que quando os campos são inicializados
[]
, eles seriam compartilhados por todos os objetos Model. Fazer alterações em um afeta todos os outros.Isso não acontece inicializando-os com
new Array()
. O mesmo para a inicialização de objetos ({}
vs novoObject()
)TBH Não tenho certeza se é um problema com a estrutura que estávamos usando ( Dojo )
fonte
Há mais do que aparenta. A maioria das outras respostas está correta, MAS TAMBÉM ..
new Array(n)
n
elementos[1, 2, 3] || []
delete
ou[1,,3]
sintaxe)for ..
,forEach
,map
, etc)fonte
Eu encontrei uma diferença entre as duas construções que me morderam bastante.
Digamos que eu tenho:
Na vida real, se eu fizer isso:
O que eu acabo com é o seguinte:
Eu não sei o que a especificação da linguagem diz que deve acontecer, mas se eu quiser que meus dois objetos tenham matrizes de propriedades exclusivas em meus objetos, eu tenho que usá-lo
new Array()
.fonte
[]
e onew Array()
construtor da matriz, resultando em um item por matriz por propriedade. Você deve ter algo mais acontecendo no seu código para terminar com o resultado mostrado acima.var property1static=[];
function MyClass(){ this.property1=property1static; this.property2=new Array(); };
O uso do construtor Array cria uma nova matriz com o comprimento desejado e preenche cada um dos índices com indefinido; a matriz atribuída a uma variável cria os índices para os quais você fornece informações.
fonte