Создает новый массив.
Копирует в него текущий объект array
и значения value1, value2, ...
При этом, если значение является массивом, то в результат попадут его элементы (в отличие от push), а не сам аргумент.
Метод concat
ничего не меняет. Вместо этого он просто возвращает комбинацию "в один уровень глубиной" текущего объекта и аргументов.
Элементы аргументов-массивов добавляются в результат следующим образом:
- Объекты
- Копируется ссылка на объект. Таким образом, старый и новый массив ссылаются на один и тот же объект. Если объект меняется - эти изменения видны и в новом и в старом массивах.
- Элементарные значения
- Копируются "как есть"
Пример: объединение двух массивов
var alpha = ["a", "b", "c"];
var numeric = [1, 2, 3];
// создает массив ["a", "b", "c", 1, 2, 3];
var alphaNumeric = alpha.concat(numeric);
Пример: объединение трех массивов
var num1 = [1, 2, 3];
var num2 = [4, 5, 6];
var num3 = [7, 8, 9];
// создает массив [1, 2, 3, 4, 5, 6, 7, 8, 9];
var nums = num1.concat(num2, num3);
Пример: добавление значений в массив
var alpha = ['a', 'b', 'c'];
// создает массив ["a", "b", "c", 1, 2, 3]
var alphaNumeric = alpha.concat(1, [2, 3]);
"Объекты
Копируется ссылка на объект. Таким образом, старый и новый массив ссылаются на один и тот же объект. Если объект меняется - эти изменения видны и в новом и в старом массивах."
почему же значение не меняется?
Потому что здесь:
присваивается не ссылка на MyArr, а создается новый массив, ссылка на который записывается в Result.
если не понял, замени MyArr[0]=0 на Result[0]=0
Потому что в массиве у тебя не объекты, а элементарные значения. Чтобы значение менялось, нужно создавать объект, например, Number(6), и менять уже его.
если объединение двух массивов - массив, то с ним можно работать, как с массивом. Тогда почему не работает код:
array1= new Array ("Первый", "Второй", "Третий");
аrray2 = new Array ("Один", "Два", "Три") ;
document.write (array1.concat(array2).join ())
вопрос снят. Найдена ошибка в коде (у переменной array2 при объявлении первая буква русская). Спасибо Firebug)
В реализации concat под Google Chrome есть замечательный bug который google упорно не хочет исправлять.
var a1 = []; a1.length=2;
alert( [].concat(0, 1, a1, 0.3, 5, 6) );
alert( [].concat(0, 1, a1, 3, 5, 6) );
если один из аргументов, в данном случае 0.3, меньше 1, то конец списка обрезается. Во втором alert всегда показываются все элементы.
Все остальные проверенные браузеры ведут себя корректно.
исправили
а как написать функцию которая объединяла бы массивы и потом вызвать ее?
Спасибо
Кому нужно, чтобы новый массив не возвращался, а записывался в исходный, то вот аналог:
По поводу [].push.apply для больших массивов - https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Ob...
"Но будьте осторожны: при использовании метода apply() таким образом вы рискуете выйти за пределы ограничения на количество аргументов в движке JavaScript. Последствия применения функции с очень большим количеством аргументов (думается, больше десяти тысяч аргументов) различаются от движка к движку (JavaScriptCore имеет жёстко зашитое ограничение на количество аргументов в 65536), поскольку этот предел (на самом деле, это природа поведения любого чрезвычайно огромного стека) не определён. Некоторые движки будут выкидывать исключение. Хуже того, другие просто отбрасывают реально переданные функции аргументы сверх лимита."