Я пытаюсь выдвинуть несколько элементов в один массив, но получаю ошибку
> a = []
[]
> a.push.apply(null, [1,2])
TypeError: Array.prototype.push called on null or undefined
Я пытаюсь сделать что-то подобное, что я бы сделал в ruby, я думал, что apply
это что-то вроде *
.
>> a = []
=> []
>> a.push(*[1,2])
=> [1, 2]
javascript
evfwcqcg
источник
источник
Теперь в ECMAScript2015 (он же ES6) вы можете использовать оператор распространения для добавления нескольких элементов одновременно:
Посмотрите таблицу совместимости ES6 Kangax, чтобы увидеть, какие браузеры совместимы
источник
Вы можете использовать
Array.concat
:источник
Array.prototype.push.apply(arr1, arr2)
что это правильный ответ, потому что с помощьюarr1.concat(arr2)
вы создаете новый массив.arr1 = arr1.concat(arr2)
не имеет большого значения и выглядит намного чище. Переход к старому массиву или замена старого массива новым зависит от ваших потребностей. Если вы работаете с 10m + элементами, перемещение в старый массив будет работать быстрее, если вы управляете небольшими порциями, вы вряд ли найдете разницу в скорости. Оба варианта вполне законны.prototype.push.apply
звонит толькоpush
один раз. И вышеупомянутое различие не является обязательным в отношении скорости, но операция на месте против создания нового массива. Что если бы у меня был метод, который взял массив и должен был изменить его на месте?concat
Метод не может работать, даже с кодом VisionN, поскольку она не будет изменять переменную для вызывающей функции.a = a.concat(b)
синтаксис по-прежнему короче, чемArray.prototype.push.apply(arr1, arr2)
Если вам нужна альтернатива
Array.concat
в ECMAScript 2015 (также известная как ES6, ES2015), которая не изменяет массив, но возвращает новый массив, вы можете использовать оператор распространения следующим образом:Обратите внимание, что этот
push
метод отличается от метода, посколькуpush
метод изменяет / модифицирует массив.Если вы хотите узнать, работают ли определенные функции ES2015 в вашем браузере, проверьте таблицу совместимости Kangax .
Вы также можете использовать Babel или аналогичный транспортер, если вы не хотите ждать поддержки браузера и хотите использовать ES2015 в производстве.
источник
Есть много ответов рекомендуют использовать:
Array.prototype.push(a, b)
. Это хороший способ, НО, если у вас будет действительно большой b, у вас будет ошибка переполнения стека (из-за слишком большого количества аргументов). Будьте осторожны здесь.См. Каков наиболее эффективный способ объединения N массивов? Больше подробностей.
источник
источник