Estou tentando enviar vários elementos como uma matriz, mas obtendo erro
> a = []
[]
> a.push.apply(null, [1,2])
TypeError: Array.prototype.push called on null or undefined
Eu estou tentando fazer coisas semelhantes às que eu faria em rubi, eu estava pensando que apply
é algo assim *
.
>> a = []
=> []
>> a.push(*[1,2])
=> [1, 2]
javascript
evfwcqcg
fonte
fonte
Agora no ECMAScript2015 (também conhecido como ES6), você pode usar o operador de spread para anexar vários itens de uma vez:
Consulte a tabela de compatibilidade ES6 da Kangax para ver quais navegadores são compatíveis
fonte
Você pode usar
Array.concat
:fonte
Array.prototype.push.apply(arr1, arr2)
é a resposta correta, porque usandoarr1.concat(arr2)
você está criando uma nova matriz.arr1 = arr1.concat(arr2)
não é grande coisa e parece muito mais limpo. Enviar para a matriz antiga ou substituir a matriz antiga pela nova depende das suas necessidades. Se você lida com mais de 10m de elementos pressionando a matriz antiga, funcionará mais rápido, se você gerenciar pequenos pedaços, dificilmente encontrará diferença na velocidade. Ambas as opções são completamente legítimas.prototype.push.apply
só ligapush
uma vez. E a distinção acima não é necessária sobre velocidade, mas uma operação no local versus a criação de uma nova matriz. E se eu tivesse um método que pegou uma matriz e deveria modificá-la no local? Oconcat
método não pode funcionar, mesmo com o código do VisionN, pois ele não modifica a variável para o responsável pela chamada da função.a = a.concat(b)
ainda é uma sintaxe mais curto do queArray.prototype.push.apply(arr1, arr2)
Se você deseja uma alternativa
Array.concat
no ECMAScript 2015 (também conhecido como ES6, ES2015) que, como ele, não modifica a matriz, mas retorna uma nova matriz, pode usar o operador de propagação da seguinte forma:Observe que isso é diferente do
push
método, pois opush
método muda / modifica a matriz.Se você quiser ver se certos recursos do ES2015 funcionam no seu navegador, verifique a tabela de compatibilidade do Kangax .
Você também pode usar Babel ou um transpilador semelhante se não desejar esperar pelo suporte do navegador e desejar usar o ES2015 na produção.
fonte
Há muitas respostas recomendar ao uso:
Array.prototype.push(a, b)
. É uma maneira legal, mas se você tiver um b muito grande, terá um erro de estouro de pilha (por causa de muitos argumentos). Tenha cuidado aqui.Consulte Qual é a maneira mais eficiente de concatenar N matrizes? para mais detalhes.
fonte
fonte