Responda:
A condição 1/i > 0sempre será avaliada como verdadeira:
Inicialmente, é verdade porque 1/0avalia Infinitye Infinity > 0é verdadeiro
Permanece verdadeiro, pois 1/i > 0é verdadeiro para todos i < Infinitye i++nunca atinge Infinity.
Por que i++nunca chega Infinity? Devido à precisão limitada do Numbertipo de dados, há um valor para o qual i + 1 == i:
9007199254740992 + 1 == 9007199254740992 // true
Depois de iatingir esse valor (que corresponde a ), ele permanecerá o mesmo mesmo depois .Number.MAX_SAFE_INTEGER + 1i++
Portanto, temos um loop infinito.
Apêndice:
Porque é 9007199254740992 + 1 == 9007199254740992?
O Numbertipo de dados do JavaScript é, na verdade, um flutuante de precisão dupla IEEE 754 de 64 bits . Cada um Numberé desmontado e armazenado em três partes: sinal de 1 bit, expoente de 11 bits e mantissa de 52 bits. Seu valor é -1 sinal × mantissa × 2 expoente .
Como 9007199254740992 é representado? Como 1,0 × 2 53 ou em binário:

Incrementando o bit menos significativo da mantissa, obtemos o próximo número mais alto:

O valor desse número é 1.00000000000000022… × 2 53 = 9007199254740994
O que isso significa? Numberpode ser 900719925474099 2 ou 900719925474099 4 , mas nada no meio.
Agora, qual escolheremos para representar 900719925474099 2 + 1 ? As regras de arredondamento IEEE 754 fornecem a resposta: 900719925474099 2 .