-1

при этом typeof (elem) будет number, а typeof ('2') будет string...

1 Answers1

3

Хорошо бы указать, какой результат бы Вас устроил.

Потому что JavaScript умеет складывать строки, а вычитать строки - не умеет. Поэтому приходится вычитать числа.

  • Если бы не умел - то была бы ошибка. А тут - умеет, но странным образом) – andreymal May 14 '21 at 15:36
  • @andreymal Сейчас ТС окончательно запутается. –  May 14 '21 at 15:38
  • 2
    @Igor а почему parseInt(0.0000001) === 1, не знаете случаем? :) – InDevX May 14 '21 at 16:00
  • @InDevX Знаю. 0.0000001 = 1е-7. –  May 14 '21 at 16:03
  • @Igor спасибо! Хотя тоже, где логика... По сути, это 1 умножается на 10^-7, т.е. на 0.00... Откуда 1 не понятно – InDevX May 14 '21 at 16:12
  • @InDevX Как раз откуда единица - понятно. Число "одна десятимилионная" не существует во время выполнения кода как единица с цепочкой нулей перед ней. Оно (число) существует в каком-то внутреннем представлении. Функция parseInt принимает на вход строку. При переводе одной десятимиллионной в строку используется некая внутренняя логика, которая для таких маленьких чисел применяет экспоненциальный формат. В parseInt, таким образом, попадает строка "1е-7", из которой в число преобразуется начальный кусок до первого символа, который не может быть преобразован. –  May 14 '21 at 16:19
  • 1
    Там не какая-то внутренняя логика, а указано в спецификации в пункте 8 и 9 здесь - https://262.ecma-international.org/6.0/#sec-tostring-applied-to-the-number-type –  May 14 '21 at 16:21
  • @PavelGrishaev Очень хорошо. –  May 14 '21 at 16:23
  • @InDevX, вы еще не видели parseInt(1 / 0, 19) === 18 – entithat May 14 '21 at 16:24
  • 1
    @Igor имел ввиду здравому смыслу не понятно. одна милионная это 0, но одна десяти-милионная вдруг стала единицей – InDevX May 14 '21 at 16:25
  • Это же типичный Garbage in, garbage out. Вы вызываете функцию которая ожидает на входе строку с числом. На входе мусор, на выходе что угодно. – Alexey Ten May 14 '21 at 16:28