2016-08-26 5 views
2

Согласно specification,Почему setInterval принимает только значения задержки 2^31-1?

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, он ведет себя более разумно.

+2

Фактически, согласно спецификации номера: «Максимальное безопасное целое число в JavaScript (2^53 - 1)». https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number, –

+0

@AndrewParamoshkin правильно, это в отрывке BTW –

+2

* «Обратите внимание, что побитовые операторы и операторы сдвига работают на 32 -бит int, поэтому в этом случае максимальное безопасное целое число равно 2^31-1 или 2147483647. "* из [здесь] (http://stackoverflow.com/questions/307179/what-is-javascripts-highest- integer-value-that-a-number-can-go-to-without-losin) – Li357

ответ

5

Тип long в Web IDL не должен сравниваться с его тегом C/C++.

Его определение можно найти here:

длиной типа представляет собой целое число со знаком типа, который имеет значение в диапазоне [-2147483648, 2147483647].

+0

Кстати, вам не кажется, что время измерения в ms с подписанным 32int немного странно? –

+0

Зачем скулить о голосах в ответ, который отвечает на ваш вопрос? – xaxxon

+1

@ MichałŠrajer 'setInterval' на самом деле не предназначен для долгосрочного планирования, поэтому, как правило, верхний предел почти 25 дней считается достаточным. – robertklep

 Смежные вопросы

  • Нет связанных вопросов^_^