控制台日志 ({value}) 与 console.log(value) 不同

Console log ({value}) isn't the same as console.log(value)

我没有卡住什么的,这只是我自己的好奇心,我注意到了一些关于 Console.log 的事情, 而且我无法在线找到答案,或者它是有限的,因为我认为使用“{}”进行 Google 搜索并没有真正解决问题

我正在编写一个与 Wi-Fi 交互的小型 node.Js 应用程序,我尝试了以下操作:

console.log(ssid +  " : " + pwd);

它returns这个

freebox_XXXXX : fake_password

到目前为止,一切正常,但后来,我又累又乱,尝试了这个:

console.log({ ssid: ssid, password: pwd });

它返回了这个

 {
  ssid: 'f\x00r\x00e\x00e\x00b\x00o\x00x\x00_\x005\x007\x00a\x002\x00a\x007\x00',
  password: '\x00T\x00e\x00s\x00t\x00'
 }

我想知道你为什么有任何答案?

更多详情:

这个函数通过蓝牙发送的数据作为 bufferArray 是用这个函数创建的

str2ab(str) {
    let buf = new ArrayBuffer(str.length * 2); // 2 bytes for each char
    let bufView = new Uint16Array(buf);
    for (let i = 0, strLen = str.length; i < strLen; i++) {
      bufView[i] = str.charCodeAt(i);
    }
    return buf;
  }
let payload = str2ab('freebox_XXXXX|' + alertData.password);

然后,其他设备收到它

WriteOnlyCharacteristic.prototype.onWriteRequest = function(data, offset, withoutResponse, callback) {
    let payload = data.toString()

    let wifiData = payload.split('|');

    let ssid = wifiData[0];
    let pwd = wifiData[1];
    console.log(ssid +  " : " + pwd);
    console.log({ ssid: ssid, password: pwd });

   });
{ ssid: ssid, password: pwd }

它是一个对象而不是字符串。

区别在于 Node.js 记录值的方式。

console.log() 的行为取决于记录值的类型:

  • 如果 string 被记录,它被写入 stdout 原样(好吧,不是原样,因为 %-args 被替换,但这是题外话),以允许在控制台中显示原始文本(可选地带有转义句)
  • 如果传了另一种数据类型,就会被检查(为了调试,和util.inspect()一样),也就是转换为与创建它的 JS 语法几乎相同的格式。 这使得复杂数据结构中的字符串显示为它们的表示形式:用引号括起来并转义特殊字符。

您的字符串在每个字母之间包含 NULL 字符(这可能是因为您的代码在某处将 UTF-16 字符串视为 UTF-8 或 ASCII),这些字符在登录到控制台时不会出现,但会转义显示 ( \x00) 当检查字符串时。

这就是两种日志记录方式不一致的原因。