Так что, если я делаю:

setInterval(function(){

   console.log("1");

},Infinity);

Он продолжает регистрировать 1, как будто это for loop. Почему это поведение?

5
void 18 Дек 2015 в 11:00

3 ответа

Лучший ответ

Когда число с плавающей запятой / число Infinity необходимо преобразовать в 32-разрядное целочисленное значение в JavaScript, как это делается для setTimeout, оно преобразуется в ноль:

console.log(typeof Infinity); // number
console.log(Infinity | 0);    // 0

ECMA-262 6e, раздел 7.1.5 ToInt32 ( argument )

Абстрактная операция ToInt32 преобразует argument в одно из 2 32 целых чисел значения в диапазоне от -2 31 до 2 31 -1, включительно. Это аннотация функционирует следующим образом:

  1. Пусть число будет ToNumber(argument).
  2. < Литий> ReturnIfAbrupt(number) .
  3. Если число равно NaN, +0, −0, + ∞ или −∞, вернуть +0.
  4. < Li> [ ... ]
7
Jeremy Banks says STAY HOME 18 Дек 2015 в 08:14

Мое ближайшее предположение состоит в том, что аргумент интервала, указанный вами в setInterval, подвергается делению по сравнению со счетчиками времени, чтобы определить, должна ли быть сделана следующая итерация. Функция должна вызываться без интервала, поскольку она равна нулю, когда любое число делится на бесконечность.

if (counter / Infinity === 0)
   callback();

В приведенном выше коде callback() будет выполняться для любого счетчика.

1
Charlie 18 Дек 2015 в 08:16

Infinity используется только в арифметике, поэтому его поведение определяется только в арифметике. В любом другом контексте это просто объект с некоторыми свойствами:

Значение Бесконечности равно + ∞ (см. 6.1.6). Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.

Поскольку этот объект не используется в качестве delay параметра setTimeout, эта функция выполняется так, как если бы объект не был предоставлен, поэтому 0.

3
Niels Keurentjes 18 Дек 2015 в 08:09