Javascript 两个字符串在节点js中不相等,但在我看来是相等的

Javascript 两个字符串在节点js中不相等,但在我看来是相等的,javascript,node.js,Javascript,Node.js,我不明白发生了什么事。我在node js中工作,下面是我的代码片段: var body = Buffer.concat(responseBody).toString(); var expectBody = fs.readFileSync(expectfile); if(expectBody != body) { console.log("Response body != expected file"); console.log("Response body: " + body);

我不明白发生了什么事。我在node js中工作,下面是我的代码片段:

var body = Buffer.concat(responseBody).toString();
var expectBody = fs.readFileSync(expectfile);
if(expectBody != body) {
    console.log("Response body != expected file");
    console.log("Response body: " + body);
    console.log("Expected body: " + expectBody);
}
这是我看到的结果:

Response body != expected file
Response body: {"version":1,"jobs":[{"asset_id":"asset_1","status":"queued","status_info":null}]}
Expected body: {"version":1,"jobs":[{"asset_id":"asset_1","status":"queued","status_info":null}]}
就我所见,字符串是相同的,但node js不这么认为

我把打印出来的字符串保存到两个文件中,然后做了一个区分-什么都没有

这与读取文件的方式有关吗

据我所知,!=用于非严格比较,所以应该只检查变量中的实际文本,对吗

==更新:===

根据你的建议,我尝试了以下方法:

if(JSON.stringify(expectBody) != JSON.stringify(body)) {
       console.log(" stringify, not equal!");
}

我仍在打印“stringify,not equal”和“to string,not equal”:(

====已解决:======


这就是最终对我起作用的原因:

var filecheck = require('./file_checks.js');
var expectjson = JSON.parse(expectBody);
var receivedjson = JSON.parse(body);
if(filecheck.jsonCompareSync(expectjson, receivedjson)) {
    // not equal
}
var filecheck = require('./file_checks.js');
var expectjson = JSON.parse(expectBody);
var receivedjson = JSON.parse(body);
if(filecheck.jsonCompareSync(expectjson, receivedjson)) {
    // not equal
}
谢谢大家的帮助!

你能做的就是

let obj1 = JSON.stringify({"version":1,"jobs":[{"asset_id":"asset_1","status":"queued","status_info":null}]});
let obj2 = JSON.stringify({"version":1,"jobs":[{"asset_id":"asset_1","status":"queued","status_info":null}]});
然后比较它们,
obj1!=obj2

就这样

var body = Buffer.concat(responseBody).toString();
var expectBody = fs.readFileSync(expectfile);
if(JSON.stringify(expectBody) != JSON.stringify(body)) {
  console.log("Response body != expected file");
  console.log("Response body: " + body);
  console.log("Expected body: " + expectBody);
}
请注意,如果对象的顺序不同,则此操作将失败。

我希望此操作能起作用:)

var a={“版本”:1,“作业”:[{“资产id”:“资产1”,“状态”:“排队”,“状态信息”:null}]}
var b={“版本”:1,“作业”:[{“资产id”:“资产1”,“状态”:“排队”,“状态信息”:null}]}
//检查你的情况
if(JSON.stringify(a)!=JSON.stringify(b)){
log(“对象不同”)
}否则{
log(“对象相同”)

}
这种行为的原因是JavaScript内部有两种不同的方法来验证相等性

最新的ECMAScript标准定义了七种数据类型:

作为基本体的六种数据类型:

  • 布尔值
  • 空的
  • 未定义
  • 符号(ECMAScript 6中新增)
还有一种数据类型,如

  • 反对
基本体按其值进行比较,而对象按其引用进行比较。

例01

let a = { "one":"a"};
let b = { "one":"a"};
console.log(a!=b);//true
例02

let a = { "one":"a"};
let b = a;
console.log(a!=b);//false
如果您是在比较对象,则必须

  • 将对象转换为基本体(字符串),然后比较

  • 编写一个单独的深层对象比较函数(通过简单的谷歌搜索,你可以找到很多)
为您的案例更新测试脚本
这就是最终对我起作用的原因:

var filecheck = require('./file_checks.js');
var expectjson = JSON.parse(expectBody);
var receivedjson = JSON.parse(body);
if(filecheck.jsonCompareSync(expectjson, receivedjson)) {
    // not equal
}
var filecheck = require('./file_checks.js');
var expectjson = JSON.parse(expectBody);
var receivedjson = JSON.parse(body);
if(filecheck.jsonCompareSync(expectjson, receivedjson)) {
    // not equal
}

谢谢大家的帮助

比较字符串的长度。@Teemu我在检查前使用if(expectBody.size==body.size)执行此操作,返回true。然后检查“操作数”的类型。在比较之前对这两个值进行字符串化。这是true,但字符串的大小未定义。如果大小不是未定义的,则可能是处理对象而不是字符串。尝试在比较中对expectedBody执行.toString()。但我没有尝试执行==,我正在执行!=,这是==,不是吗?对不起,我已经更新了我的答案,object中对象比较的问题是比较浅,所以将它们转换为字符串并比较字符串。这有帮助吗?我补充道:让obj1=body;设obj2=expectBody;如果(obj1!=obj2){console.log(“Still not equal!”);}我会打印“Still not equal”:(使用
JSON.stringify
将这两个对象转换为字符串,就像我在上面共享的代码中那样,然后执行比较。这些值在我收到的文件中,我无法硬编码它们。谢谢,但我添加了:if(JSON.stringify(expectBody)!=JSON.stringify(body){console.log(“stringify,not equal!”);}并且仍然打印出“stringify,not equal!”:(您是否检查了expectBody和body,问题中有任何差异或相同之处?无法直接检查它们,因为它们是var,而不是文件。还是我误解了您的问题?我已在原始问题中添加了更多细节。我尝试转换为字符串,但似乎不起作用:(谢谢,我找到了解决方案。把它放在原始问题中。希望看到你的
文件的内容\u checks.js
。特别是函数
jsonCompareSync
@Nuwan oh抱歉,没有意识到这不是一个标准库。再看一眼,它基本上是逐个检查所有值。