所以如果我在做:
setInterval(function(){
console.log("1");
},Infinity);
它会一直记录1
,就像它是for loop
一样。为什么会这样?
答案 0 :(得分:7)
当需要在JavaScript中将float / number 0
转换为32位整数值时,与setTimeout一样,它将转换为零:
Infinity
ECMA-262 6e Section 7.1.5
ToInt32 ( argument )
抽象操作
console.log(typeof Infinity); // number console.log(Infinity | 0); // 0
将ToInt32
转换为2 32 整数之一 值范围为-2 31 至2 31 -1,包括端值。这个摘要 操作功能如下:
- 设为
argument
。ToNumber(argument)
。- 如果数字是NaN,+ 0,-0,+∞或-∞,则返回+0。
- [...]
醇>
答案 1 :(得分:3)
Infinity
仅用于算术,因此其行为仅在算术中定义。在任何其他情况下,它只是an object with some properties:
无穷大的值是+∞(见6.1.6)。这家酒店有 attributes {[[Writable]]:false,[[Enumerable]]:false, [[Configurable]]:false}。
由于此对象没有用作delay
的{{1}}参数,该函数执行就像没有提供对象一样,所以setTimeout
。
答案 2 :(得分:1)
我最接近的猜测是,与{1}}中指定的区间参数在与时间计数器进行比较时会进行除法,以确定是否应该进行下一次迭代。必须在没有间隔的情况下调用该函数,因为当任何数字除以无穷大时它都为零。
setInterval
在上面的代码中,if (counter / Infinity === 0)
callback();
将针对任何计数器执行。