Javascript!==返回true时应返回false
我使用Node.js服务器和async.js处理异步回调,并使用Mongoose连接到我的Mongo数据存储。我试图确定两个对象id是否相等,如果相等,则执行一些代码。但是,比较没有正确执行。代码如下:Javascript!==返回true时应返回false,javascript,node.js,mongodb,mongoose,async.js,Javascript,Node.js,Mongodb,Mongoose,Async.js,我使用Node.js服务器和async.js处理异步回调,并使用Mongoose连接到我的Mongo数据存储。我试图确定两个对象id是否相等,如果相等,则执行一些代码。但是,比较没有正确执行。代码如下: async.forEachSeries(offerItem.offers, function(currentOfferItemOffer, callback) { Offer.findById(currentOfferItemOffer, function(err, offerItemO
async.forEachSeries(offerItem.offers, function(currentOfferItemOffer, callback) {
Offer.findById(currentOfferItemOffer, function(err, offerItemOffer) {
if (err) throw err;
console.log(offerItemOffer._id) // 56953639ea526c8352081fdd
console.log(offer._id) // 56953639ea526c8352081fdd
if (offerItemOffer._id !== offer._id) {
console.log('offerItemOffer._id !== offer._id') // Is being logged even though it shouldn't
....
我很困惑,为什么这样一个简单的比较不能正确执行。当使用“==”-检查两个_-id是否相等时,代码按预期运行,但这在逻辑上是不正确的,因为只有当_-id不相等时才应执行下一个块。任何想法都将不胜感激。谢谢 在\u id
上使用toString()
方法
if (offerItemOffer._id.toString() !== offer._id.toString()) {//...
console.log()
调用toString()
,因此输出似乎是相同的,因为它被转换为字符串。看起来\u id
是对象,而不是字符串。在这种情况下,它们仍然是两个不同的对象。你应该做:
JSON.stringify(offerItemOffer._id) !== JSON.stringify(offer.-id)
将它们作为字符串进行比较
这里的更多内容JavaScript有两种类型的不等式运算符。即
=代码>和==代码>
=代码>在比较之前对运算符调用stringify。这意味着在比较时不考虑给定运算符的类型/类
==代码>不调用stringfy。这意味着要考虑运算符的类型/类别
这就是为什么下面的句子产生不同的输出
'1' != 1 // -> false (they are equal since what's being compared is '1' != '1'
'1' !== 1 // -> true (they are different since what's being compared is a string with an integer)
因此,您可以通过使用忽略对象类型/类来解决问题=代码>运算符。而且你确定你没有Mongo objectID,也没有十六进制字符串,你有没有用typeof检查那些ID,看起来像对象,而不是字符串。offerItemOffer.\u ID.toString()
应该能很好地解决它。谢谢是的,就是这样。谢谢