Как оператор вычитания запускает преобразование массива в число?
Мне не понятно как в этом примере массив преобразуется в число.
console.log(10 - [4]); //6
Насколько я знаю, при попытке преобразования операнда к примитивному типу данных запускается либо toString(), либо valueOf(). По умолчанию valueOf() возвращает сложный тип данных, а toString() преобразовывает сложный тип данных к строке. Как, к примеру, это происходит здесь:
console.log([4] + 10); //"410"
Как в первом примере массив мог преобразоваться в число, если по умолчанию valueOf() возвращает массив?
Ответы (2 шт):
В первом случае, массив преобразовывается в строку "4". (Массив превращается в строку состоящую из значений массива, разделенных запятой).
Так как далее идет вычитание числа из строки, то данная операция преобразовывает операнды в числа, так как операции вычитания нет для строк. Собственно потому у тебя и получается 10 - 4.
Во втором случае, массив преобразовывается так же в строку "4" и при сложении, JS воспрнимает это не как математическое сложение, а как конкатенацию строк, потому второй операнд превращает так же в строку, в итоге получается "4" + "10", что приводит к такому результату.
Если уж лезть в дебри стандарта, то в обоих случаях применяется абстрактная операция ApplyStringOrNumericBinaryOperator.
В первом случае (вычитание) на 5 шаге к массиву применяется абстрактная операция ToNumeric, которая сначала приводит массив к примитиву (ToPrimitive) (в случае с массивом получится строка '4'), а потом полученную строку приведёт к числу операцией ToNumber.
Во втором случае (сложение) срабатывает шаг 2 и получается конкатенация строк как раз потому что примитив от массива это строка.