为什么setInterval只接受2 ^ 31-1个延迟值?

时间:2016-08-26 20:39:43

标签: javascript setinterval v8 spidermonkey chakra

根据specification

long setInterval(Function handler, optional long timeout, any... arguments);

setInterval()应该接受long超时延迟。

但是,在64位Linux上,它的行为就像签名的32位int一样。 我没有在其他平台上进行测试,please try并发表评论。

显而易见的问题是 - 为什么

有人可以解释为什么我会立即输出

let maxSigned32 = 2147483647;
let safeInt = maxSigned32 + 1;

console.log(safeInt);
console.log(Number.MAX_SAFE_INTEGER);
console.log(safeInt < Number.MAX_SAFE_INTEGER); // true

let days = Math.round(safeInt / (1000.0 * 60 * 60 * 24));

console.log(safeInt + ' ms is ~' + days + ' days');

setTimeout(() => {
  console.log('I should not see this today')
}, safeInt);

我在Chrome 52和Firefox 48上得到了这个(不正确的?)结果。 有趣的是,当我使用最新的ChakraCore构建并尝试时,它表现得更合理。

1 个答案:

答案 0 :(得分:5)

不应将Web IDL中的long类型与其C / C ++同名进行比较。

可以找到here的定义:

  

long 类型是有符号整数类型,其值在[-2147483648,2147483647]范围内。