为什么 setInterval 只接受 2^31-1 延迟值?
Why setInterval accepts only 2^31-1 delay values?
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 时,它的行为更加合理。
不应将 Web IDL 中的 long
类型与其同名的 C/C++ 进行比较。
其定义可见here:
The long type is a signed integer type that has values in the range [−2147483648, 2147483647].
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 时,它的行为更加合理。
不应将 Web IDL 中的 long
类型与其同名的 C/C++ 进行比较。
其定义可见here:
The long type is a signed integer type that has values in the range [−2147483648, 2147483647].