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

Mic*_*jer 2 javascript v8 spidermonkey setinterval chakra

根据规范,

long setInterval(Function handler, optional long timeout, any... arguments);
Run Code Online (Sandbox Code Playgroud)

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

但是,在64位Linux上,它的行为与签名的32位int相似.我没有在其他平台上测试,请尝试发表评论.

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

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

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);
Run Code Online (Sandbox Code Playgroud)

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

rob*_*lep 5

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

它的定义可以在这里找到:

所述型的是,在[-2147483648 2147483647]的范围内具有值的带符号的整数类型.