Почему в JavaScript +[1.5] считается числовым?

Я занимаюсь JavaScript долго, но только что заметил кое-что, чего никогда раньше не видел. Рассмотреть возможность:

> +[1.5]
1.5

Почему это происходит? Является ли это особым правилом для интерпретации массивов как числовых значений или это случайность специальной алхимии?

Обратите также внимание на то, что:

> +[1,0]
NaN

Для меня это, конечно, имеет смысл, но я ожидал, что +[1] тоже будет NaN, потому что это не число. Или это как-то классифицируется как число?

Затем есть эти случаи, которые заставляют меня поверить, что мы путешествуем через червоточину приведения типов (массив ==> строка, строка ==> число):

> [2] + [4]
"24"
> + [2] + [4]
"24"
> (+[2]) + (+[4])
6
> +[2] + [4,5]
"24,5"
> // which, incidentally, looks like a european-formatted number, but I see
> // that that's just an accident (still another possibility for confusion)

Что-то из этого сделано намеренно?


person Sir Robert    schedule 01.03.2018    source источник
comment
намеренно, как по спецификации? Да.   -  person str    schedule 01.03.2018
comment
Найдите приведение к строке, приведение к числу.   -  person trincot    schedule 01.03.2018
comment
Внезапно я подумал, что массив преобразуется в строковое представление, и это строковое представление интерпретируется как число. [1.5]'1.5'1.5. Строковое представление [1,0] — это '1,0', которое не является числовым.   -  person deceze♦    schedule 01.03.2018


Ответы (2)


Унарный оператор + внутренне использует абстрактную операцию ToNumber.

Таким образом, унарный оператор при применении к объекту сначала применяет toString() (абстрактная операция ToPrimitive), а затем применяет абстрактную операцию ToNumber. Таким образом, в основном + при применении к массиву из одного числа он преобразует его в само число.

Если он применяется к [4,5], то toString вернет 4,5, который, в свою очередь, при применении абстрактной операции ToNumber возвращает NaN.

// Trying to concatenate two string as [] coerce to strings = 24
[2] + [4]
// Converting 2 and 4 to number and then adding = 6   
(+[2]) + (+[4])
// Converting 2 to number and 4,5 will be coerced to string = 24,5
+[2] + [4,5]
person void    schedule 01.03.2018
comment
Почему особый случай для массива одного числа? Где это указано? - person deceze♦; 01.03.2018
comment
@deceze смотрите обновленный ответ. - person void; 01.03.2018

Перед применением унарного + к массиву он преобразуется в строку с использованием toString, а затем пытается преобразовать его в число.

so

+[1.5]

выступают в качестве

+([1.5].toString())

следовательно

+[1,0]

преобразует [1,0] (массив, состоящий из двух элементов) в строку 1,5, а затем пытается преобразовать ее в число

+[1,0] => +"1,0" => NaN

в этом примере:

+[2] + [4,5] => +"2" + "4,5" => 2 + "4,5" => "24,5"
person RidgeA    schedule 01.03.2018