【问题标题】:Why setInterval accepts only 2^31-1 delay values?为什么 setInterval 只接受 2^31-1 延迟值?
【发布时间】:2016-08-26 20:39:43
【问题描述】:

根据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 时,它​​的表现更加合理。

【问题讨论】:

  • 其实根据Number的规范:“JavaScript中的最大安全整数(2^53 - 1)。” developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…,
  • @AndrewParamoshkin 正确,它在 sn-p BTW 中
  • "请注意,位运算符和移位运算符在 32 位整数上运行,因此在这种情况下,最大安全整数为 2^31-1 或 2147483647。" 来自here
  • @AndrewL。我知道,但是没有使用这样的运算符来调用 EcmaScript'a 定义的 ToInt32() 转换函数。

标签: javascript setinterval v8 spidermonkey chakra


【解决方案1】:

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

其定义见here:

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

【讨论】:

  • 顺便说一句,你不觉得用带符号的 32int 以毫秒为单位测量时间有点奇怪吗?
  • 为什么在回答您的问题的答案中抱怨投票?
  • @MichałŠrajer setInterval 并不是真正用于长期调度,因此将上限设置为近 25 天可能就足够了。
  • @robertklep html 和 javascript 并不真正适用于人们今天正在做的很多事情 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 2023-03-21
  • 2014-11-29
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多