Я хотел добавить элементы массива в другой, поэтому я попробовал это:
[1,2] + [3,4]
Он ответил:
"1,23,4"
Что здесь происходит?
Я хотел добавить элементы массива в другой, поэтому я попробовал это:
[1,2] + [3,4]
Он ответил:
"1,23,4"
Что здесь происходит?
[5,6,7][1,2]
,7
потому что он использует последний элемент во втором массиве. OoОтветы:
+
Оператор не определен для массивов .В результате Javascript преобразует массивы в строки и объединяет их.
Обновить
Поскольку этот вопрос и, следовательно, мой ответ привлекают к себе много внимания, я подумал, что было бы полезно и уместно иметь представление о том, как
+
оператор ведет себя в целом.Итак, вот и все.
За исключением E4X и специфичных для реализации вещей, Javascript (начиная с ES5) имеет 6 встроенных типов данных :
Обратите внимание на то, что хотя это
typeof
несколько сбивает с толку возвратовobject
для Null иfunction
для вызываемых объектов, Null на самом деле не является объектом, и, строго говоря, в реализациях Javascript, соответствующих спецификации, все функции считаются объектами.Это верно - у Javascript нет примитивных массивов как таковых; только экземпляры объекта, вызванные
Array
с каким-то синтаксическим сахаром, чтобы облегчить боль.Добавляя больше к путанице, объекты обертки, такие как
new Number(5)
,new Boolean(true)
иnew String("abc")
все имеютobject
тип, а не числа, логические значения или строки, как можно было бы ожидать. Тем не менее для арифметических операторовNumber
иBoolean
ведут себя как числа.Полегче, а? После всего этого мы можем перейти к самому обзору.
Различные типы результатов по типам
+
операндов* относится к Chrome13, FF6, Opera11 и IE9. Проверка других браузеров и версий оставлена в качестве упражнения для читателя.
Примечание: Как указал CMS , для некоторых случаев таких объектов, как
Number
,Boolean
и пользовательских из них в+
операторе не обязательно производить результирующую строку. Это может варьироваться в зависимости от реализации преобразования объекта в примитив. Например,var o = { valueOf:function () { return 4; } };
оценкаo + 2;
производит6
, аnumber
, оцениваетo + '2'
производит'42'
, аstring
.Чтобы увидеть, как была создана таблица обзора, посетите http://jsfiddle.net/1obxuc7m/
источник
+
Оператор JavaScript имеет две цели: добавление двух чисел или объединение двух строк. Он не имеет определенного поведения для массивов, поэтому он конвертирует их в строки и затем соединяет их.Если вы хотите , чтобы объединить два массива , чтобы произвести новый, использовать в
.concat
метод вместо этого:Если вы хотите эффективно добавить все элементы из одного массива в другой, вам нужно использовать метод .push :
Поведение
+
оператора определено в ECMA-262 5e Раздел 11.6.1 :Вы можете видеть, что каждый операнд конвертируется
ToPrimitive
. Читая дальше, мы можем найти, чтоToPrimitive
всегда будут преобразовывать массивы в строки, что приведет к такому результату.источник
Array.prototype.push.apply(data, [3, 4])
вместоdata.concat([3,4])
?concat
создает новый массив, более длительный вызов эффективно расширяет существующий массив.[].push.apply(data, [3,4])
для немного меньше многословия. Кроме того, это гарантированно устойчиво к другим людям, меняющим значениеArray
.Он добавляет два массива, как если бы они были строками .
Строковое представление для первого массива будет «1,2», а для второго - «3,4» . Поэтому, когда
+
знак найден, он не может суммировать массивы, а затем объединять их как строки.источник
В
+
concats строки, таким образом он преобразует массивы строк.Чтобы объединить массивы, используйте
concat
.источник
В JavaScript оператор двоичного сложения (
+
) выполняет как числовое сложение, так и конкатенацию строк. Однако, когда его первый аргумент не является ни числом, ни строкой, он преобразует его в строку (следовательно, "1,2
"), затем он делает то же самое со вторым "3,4
" и объединяет их в "1,23,4
".Попробуйте вместо этого использовать метод concat для массивов:
источник
Это преобразование отдельных массивов в строки, а затем объединение строк.
источник
Похоже, JavaScript превращает ваши массивы в строки и соединяет их вместе. Если вы хотите добавить кортежи вместе, вам придется использовать цикл или функцию карты.
источник
[1,2]+[3,4]
в JavaScript это то же самое, что и оценка:и поэтому, чтобы решить вашу проблему, лучше всего было бы добавить два массива на месте или без создания нового массива:
источник
Он делает именно то, что вы просили.
То, что вы добавляете вместе, это ссылки на массивы (которые JS преобразует в строки), а не числа, как кажется. Это немного похоже на сложение строк:
"hello " + "world"
="hello world"
источник
было бы неплохо, если бы вы могли перегрузить операторы в JavaScript, но не можете: Могу ли я определить пользовательские перегрузки операторов в Javascript? вы можете взломать только оператор "==", который преобразует в строки перед сравнением: http://blogger.xs4all.nl/peterned/archive/2009/04/01/462517.aspx
источник
Это потому, что оператор + предполагает, что операнды являются строковыми, если они не являются числами. Таким образом, он сначала преобразует их в строку и конкататы, чтобы получить конечный результат, если это не число. Кроме того, он не поддерживает массивы.
источник
Некоторые ответы здесь объясняют, как происходит непредвиденный нежелательный выход (
'1,23,4'
), а некоторые объясняют, как получить то, что они предполагают как ожидаемый желаемый выход ([1,2,3,4]
), то есть конкатенацию массива. Однако природа ожидаемого желаемого результата на самом деле несколько двусмысленна, потому что первоначальный вопрос просто гласит: «Я хотел добавить элементы массива в другой ...». Это может означать конкатенацию массивов, но это также может означать добавление кортежей (например, здесь и здесь ), то есть добавление скалярных значений элементов в одном массиве к скалярным значениям соответствующих элементов во втором, например, объединение[1,2]
и[3,4]
получение[4,6]
.Предполагая, что оба массива имеют одинаковую арность / длину, вот одно простое решение:
источник
Еще один результат использования простого знака «+»:
Так что примерно так должно работать (но!)
... но он преобразует переменную из массива в строку! Имейте это в виду.
источник