2

根据规范

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

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);

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

4

1 回答 1

5

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

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

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

于 2016-08-26T21:03:46.777 回答