【发布时间】:2020-04-22 08:16:58
【问题描述】:
我正在寻找是否有办法区分文件中的返回(下一行)和键入的换行符(文件中的\n)。当我在REPL 中玩耍时,我在比较中打错了字,令我惊讶的是,Node.js 并不在意。它甚至给出了我认为未定义的行为,除非我在多年的 Node.js 亲密关系中完全错过了一些东西。而且我在玩的过程中还发现了一些其他的东西,我会问下面的。
代码在帖子底部。
主要问题是:
为什么 Node.js 在最后两次比较(==+ 和 ==-)时没有抱怨语法?那是某种有效的语法吗?为什么在没有尾随 +/- 的情况下比较为真?它是假的? (帖子中的更新)
主要的问题是:
为什么当所有其他测试都为真时,“缓冲区单独自我比较”和“缓冲区比较”结果却为假?为什么缓冲区不能与相同数据的缓冲区进行比较?
还有:
如上所述,我如何可靠地区分文件中的返回和键入的换行符?
代码如下:
const nl = '\n'
const newline = `
`
const NL = Buffer.from('\n')
const NEWLINE = Buffer.from(`
`)
const NEWLINE2 = Buffer.from(`
`)
console.log("Buffer separate self comparison: "+(NEWLINE2 == NEWLINE))
console.log("Buffer comparison: "+(NL == NEWLINE))
console.log("Non buffer comparison: "+(nl == newline))
console.log("Buffer self comparison 1: "+(NL == NL))
console.log("Buffer self comparison 2: "+(NEWLINE == NEWLINE))
console.log("Buffer/String comparison 1: "+(nl == NL))
console.log("Buffer/String comparison 2: "+(newline == NEWLINE))
console.log("Buffer/String cross comparison 1: "+(nl == NEWLINE))
console.log("Buffer/String cross comparison 2: "+(newline == NL))
console.log("Buffer toString comparison: "+(NL.toString() == NEWLINE.toString()))
console.log("Strange operator comparison 1: "+(NL ==+ NEWLINE))
console.log("Strange operator comparison 2: "+(NL ==- NEWLINE))
【问题讨论】:
-
NL ==+ NEWLINE被评估为NL == (+NEWLINE) -
嗯,好的。所以我玩弄了它,并且 (+NEWLINE) (和所有其他字符串)评估为 NaN,它仍然不应该等于字符串
-
NEWLINE不是字符串而是缓冲区。+NEWLINE计算结果为0。 -
好的,我再试一次。 (+Buffer) 计算结果为 NaN,除非 Buffer 是转义序列,例如 tab|carriage|return。为什么是现在? (+Buffer) 应该是 NaN(什么是正缓冲区?),但为什么转义序列会导致其评估为 0?
-
您可能需要查看 Node.js 的源代码才能了解为什么将 Buffer 强制转换为数字可能会返回
0。据我所知,文档中没有关于该行为的任何内容。0 == '\n'的计算结果为true,因为这就是 Abstract Equality Comparison 指定它的方式。如果等号的任一侧是数字而另一侧是字符串,则字符串将被强制转换为数字。Number('\n')的计算结果为0。
标签: node.js undefined-behavior comparison-operators