Recientemente tuve una conferencia en la que cubrimos BigInts y cómo declararlos usando el constructor o agregando una 'n' al final del número. Sentí que entendía bien la conferencia, hasta que me encontré con este extraño comportamiento.
¿Podría alguien explicarme por qué hay una diferencia aquí?
console.log(239723948723409274092834987230917298720394203874n); console.log(BigInt(239723948723409274092834987230917298720394203874)); //OUTPUT 239723948723409274092834987230917298720394203874n 239723948723409282517569648409973454535932248064nEs el mismo número en ambos casos de uso, pero el resultado es diferente. Sospecho que este es un comportamiento realmente apropiado porque el motor debe calcular el argumento pasado al constructor antes de que el constructor lo use.
Aunque no estoy seguro de si eso es correcto, por eso estoy aquí.
Las constantes numéricas (ya sean números simples o valores de gran tamaño con la n final) se analizan y evalúan según su tipo incluso antes de que se ejecute el programa. Si coloca una constante int grande en su programa, el analizador crea un código que se ejecuta con un valor int grande. Si coloca un número simple en su código, el analizador crea un número simple de coma flotante de 64 bits, como todos los valores numéricos de JavaScript de la vieja escuela.
Por lo tanto, cuando llama a BigInt() con una constante que no tiene la n final, lo que le indicaría al analizador que haga un int grande y no un número simple, está creando una expresión que se evalúa antes de la llamada a la función. Es un número simple, por lo que pierde mucha precisión antes de que se cree su nuevo gran valor int.