非常奇怪的行为比较节点js(vs代码)中的string属性

这是从debugging控制台:

a[0] "15711" a[0] == "15711" "false" parseInt(a[0]) == 15711 "true" 

有人可以解释这个吗?

“a”属性是我从csv文件中用fast-csv读取的行之一。 这是代码:

  var fs = require('fs') var path = require('path') var csv = require('fast-csv'); var all = []; var stream = fs.createReadStream(path.join("./items.txt")); var csvStream = csv({ delimiter: '\t' }) .on("data", function (data) { console.log(data[0] == '1') }) .on("end", function () { }) stream.pipe(csvStream); 

回购

确定您的例子在回购有一个CSV只有1的值。你可以看到这个“1”字符的长度实际上是2(预期会是1)。 第一个string的第一个字符是一个不可见的字符。 我做了一个:

 data[0].charCodeAt(0) 

检查哪个字符是。 它给了我值65279这是一个零宽度没有rest空间 。 这个字符是来自UTF8编码stream的BOM 。 关于这个( 这里 ),您正在使用的项目有一个公开的问题。

由于这是一个空格字符,我们可以使用trim()将其移除,并且比较行为正常。

或者使用解决scheme,像使用strip-bom-stream软件包的问题那样从pipe道上去除BOM。