Что происходит при сложении двух пустых массивов в JavaScript
Что проверяют
Понимаете ли вы, как оператор + приводит типы, или просто помните готовый ответ. Результат, пустую строку, знают многие. Следом обычно спрашивают [] + {}, {} + [] и [1, 2] + [3], и там выручает только понимание алгоритма.
Как отвечать
Оператор + сначала приводит оба операнда к примитивам через абстрактную операцию ToPrimitive с подсказкой default. Для обычного объекта она пробует valueOf, потом toString:
valueOf: у массива возвращает сам массив, то есть объект, поэтому результат отбрасывается;toString: у массива вызываетjoin(','), для пустого массива это пустая строка;- сложение: если хотя бы один примитив строка, выполняется конкатенация, иначе числовое сложение.
Итого [] + [] даёт "" с типом "string". Если у объекта есть Symbol.toPrimitive, он вызывается первым и перекрывает оба метода. Так устроен Date: при подсказке default он превращается в строку, а не в число.
Соседние случаи:
[] + {}: пустая строка плюс"[object Object]", получается"[object Object]";[1, 2] + [3]:"1,2"плюс"3", получается"1,23";{} + []: в начале инструкции фигурные скобки разбираются как пустой блок, остаётся унарный плюс+[], то есть0. Консоли браузеров и Node REPL иногда оборачивают ввод в скобки, поэтому там можно увидеть и"[object Object]";[] - []: у минуса нет строковой ветки, оба операнда становятся числами, результат0.
Практический вывод один: не полагаться на неявное приведение. Массивы склеивают через concat или spread [...a, ...b], строки собирают шаблонными литералами.
Где спотыкаются
Отвечают, что получится пустой массив, по аналогии с Python, где [] + [] действительно склеивает списки.
Говорят, что + сразу вызывает toString. Результат совпадает, но на вопросе про valueOf или Symbol.toPrimitive такой ответ разваливается.
Путаются в {} + []: результат зависит от того, где стоит выражение, а не от самих значений. Без упоминания пустого блока объяснение не складывается.