控制台日志 ({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
) 当检查字符串时。
这就是两种日志记录方式不一致的原因。
我没有卡住什么的,这只是我自己的好奇心,我注意到了一些关于 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
) 当检查字符串时。
这就是两种日志记录方式不一致的原因。