Hemos encontrado un problema que ocurre al azar y trato de entender qué está pasando aquí. No hay necesidad de entender lo que eventualmente hace el código. el código es exactamente el mismo, excepto que tratamos de "verificar" un valor específico"
Foo y Bar (el violín está aquí) son exactamente las mismas funciones.
Las diferencias están aquí:
(esencialmente, estamos tratando de "verificar" el lsbValue )
Lo hemos probado a través de este código (la misma función se ejecuta tanto en Foo como en Bar )
function testGalois(fn) { const x = new Uint32Array([2425393296, 2425393296, 2425393296, 2425393296]); const y = new Uint32Array([3692772234, 3144594163, 3014792419, 2386452453]); const expected = [2793996538, 14267392, 3369100906, 2506634262]; for (let i = 0; i < 100; i++) { const result = Array.from(fn(x, y)); if (JSON.stringify(result) != JSON.stringify(expected)) { console.error('Failed on iteration', i, 'expected', expected, 'result', result) return; } } console.log('Pass!'); } Foo está funcionando sin problemas cada vez .
Sin embargo, Bar falla en una iteración aleatoria:
Prueba Foo
¡Pasar!
barra de prueba
Error en la iteración 64 resultado esperado [ 2793996538, 14267392, 3369100906, 2506634262 ] [ 4021467969, 3143765947, 1936448977, 785616812 ]
Ejecutémoslo de nuevo, ahora el error en una iteración diferente:
Prueba Foo
¡Pasar!
barra de prueba
Error en la iteración 62 resultado esperado [ 2793996538, 14267392, 3369100906, 2506634262 ] [ 4021467969, 3143765947, 1936448977, 785616812 ]
Tenga en cuenta que solo buscamos el valor real de
let lsbValue = !!(Vi[3] & 1 ) ; //fails at some iteration. De mis pruebas en Bar :
const lsbValue = !!(Vi[3] & 1 ) ; //fails const lsbValue = Boolean(Vi[3] & 1 ) //fails const lsbValue = (Vi[3] & 1 )>0 //works ¡Pero luego pensé que tal vez hay algún tipo de recurso compartido que se usa aquí cuando se trata de Boolean o !! lo que me llevó a crear un new Boolean(X) en cada iteración en lugar de Boolean(X) :
const lsbValue = new Boolean((Vi[3] & 1 )).valueOf() ; //works !Pregunta
¡Huele a que se está usando una ubicación inicial compartida cuando se usa !! o Boolean . (aunque se que !! es un operador.)
Pero luego, la creación de una nueva instancia por iteración funcionó:
const lsbValue = new Boolean((Vi[3] & 1 )).valueOf() ;
¿Por qué arrojan resultados diferentes o incorrectos?
nótese bien
Esto no sucede en Chrome. sucede solo en el nodo.