Javascript!==当返回false时返回true

时间:2016-01-12 18:19:42

标签: 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, 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不相等时才应执行下一个块。任何想法将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:0)

toString()上使用_id方法。

if (offerItemOffer._id.toString() !== offer._id.toString()) {//...

console.log()调用toString()所以看起来输出是相同的,因为它被转换为字符串。

答案 1 :(得分:0)

看起来_id是对象,而不是字符串。在这种情况下,它们仍然是两个不同的对象。你应该这样做:

JSON.stringify(offerItemOffer._id) !== JSON.stringify(offer.-id) 

将它们作为字符串进行比较。

更多Object comparison in JavaScript

答案 2 :(得分:0)

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)

因此,您可以通过使用!=运算符忽略对象类型/类来解决您的问题。