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

问题描述

我没有被卡住或任何东西,这只是我自己的好奇心,我注意到了一些关于 Console.log 的东西, 而且我在网上找不到答案,或者说它很有限,因为我认为使用“{}”进行 Google 搜索并不真正有效

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

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

它返回这个

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 });

   });

解决方法

不同之处在于 Node.js 记录值的方式。

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

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

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

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

,
{ ssid: ssid,password: pwd }

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