Почему использование Number(num) != num вместо ~~num != num выбрасывает «кучу JavaScript из памяти»?

#javascript #heap-memory

#javascript #куча-память

Вопрос:

Я пытаюсь проверить входные данные: если num — это что-то иное, чем целое число или строка в целочисленном формате, затем введите TypeError . Когда я пытаюсь проверить ввод таким образом, все работает:

 function prefill(n, v) {
  let testArr = [];
  let num  = n;
//input validation
    if(~~num != num || typeof num == 'boolean' ||  num < 0) throw new 
TypeError(num   ' is invalid')

    else {
      for (let i = 0; i <  n; i  ) {
        testArr.push(v);
      } 
      return testArr;    
 }
}
  

Но когда я пытаюсь так,

 if(Number(num) != num ||  num < 0)
  

У меня такая ошибка «ФАТАЛЬНАЯ ОШИБКА: сбой выделения CALL_AND_RETRY_LAST — JavaScript heap из памяти»

Комментарии:

1. какой браузер или движок JS?

2. И каковы были параметры n and v , когда вы получили эту ошибку?

3. Я делаю это в www.codewars.com . Я получил ошибку с параметрами ( бесконечный, — бесконечный)

Ответ №1:

Обновленный ответ

Сколько элементов будет помещено в массив? Побитовое сравнение ‘~~’ анализирует его до 32-битного результата. Максимум 2 ^ 31 элемента.

Number() даст вам значение с плавающей запятой, которое потенциально может запустить цикл for и нажать ‘v’ 1.7976931348623157e 308 (Number.MAX_VALUE) раз. Это рано или поздно приведет к нехватке памяти.