Hay dos objetos de búfer diferentes (valores diferentes) en un JavaScript, pero en el objeto de JavaScript, se tratan como iguales. ¿Alguna idea de por qué? ¿Cómo obligarlos a que sean claves diferentes para un JavaScript? Gracias
mi versión de node.js es 10.15.1 en Ubuntu 18.04.
var buf1 = Buffer.from([ 10, 33, 45, 77, 10, 33, 46, 166, 140, 190, 5, 241 ]); var buf2 = new Buffer.from([ 10, 33, 45, 77, 10, 33, 46, 168, 215, 216, 5, 241 ]); let a = {}; a[buf2] = "jon"; console.log(a[buf1]); //output jona[buf2] es equivalente a a[buf2.toString()] , que es equivalente a a[buf2.toString('utf-8')] , que es la causa de su problema: sus búferes no contienen UTF válido -8 datos, por lo que al convertir a una cadena UTF-8, los puntos de código no válidos se reemplazan por el carácter de reemplazo Unicode, U+FFFD (codificado como 0xEF 0xBF 0xBD en UTF-8).
Para mostrar esto, puede ejecutar el siguiente código:
console.log('buf1', Buffer.from(buf1.toString()).toString('hex')); console.log('buf2', Buffer.from(buf2.toString()).toString('hex'));El resultado es la representación hexadecimal de cada búfer tal como se usa como "nombre" de propiedad (caracter de reemplazo resaltado):
buf1 0a212d4d0a212eefbfbdefbfbdefbfbd05efbfbd ^^^^^^^^^^^^^^^^^^ ^^^^^^ buf2 0a212d4d0a212eefbfbdefbfbdefbfbd05efbfbdComo puedes ver, son equivalentes.
a[buf2] = "jon"; es exactamente lo mismo que a['[object: Object]'] = "jon"; , debido a que la clave del objeto debe ser una string , si no es una string , se convertirá en una cadena usando el método toString .
Lo que querías hacer es:
var buf1 = Buffer.from([ 10, 33, 45, 77, 10, 33, 46, 166, 140, 190, 5, 241 ]); var buf2 = new Buffer.from([ 10, 33, 45, 77, 10, 33, 46, 168, 215, 216, 5, 241 ]); let a = {}; a['buf2'] = "jon"; console.log(a[buf1]); //outputs undefined console.log(a['buf2']); // outputs "jon"