2017-05-08 93 views
0

我下面的函数,我比较两个相等的值(如显示在控制台,但回报是假的......ES6。如何正确比较===运算符?

function removeGroup(req, res, next) { 
     const user = req.user; 
     const found = user.groups.some((obj, idx) => { 
     console.log('obj._id: ', obj._id); 
     console.log('req.params.groupId: ', req.params.groupId); 
     if (obj._id === req.params.groupId) { 
      console.log('equal'); 
      user.groups.splice(idx, 1); 
      return true; 
     } 
     console.log('not equal'); 
     return false; 
     }); 
     if (found) { 
     user.save() 
      .then(savedTable => res.json(savedTable)) 
      .catch(e => next(e)); 
     } else { 
     res.status(404); 
     res.json({ message: 'Group Not Found' }); 
     } 
    } 

这里是.LOG导致控制台

obj._id: 59109bc44ea63331151b9327 
    req.params.groupId: 59109bc44ea63331151b9327 
    not equal 
+3

显然,他们是不相等的。检查他们的类型(使用'typeof')。 – Bergi

+1

@Bergi说了什么,'=='和'==='之间的区别在于它们必须是相同的类型。如果'=='返回false,那么还有其他事情正在进行。 –

+1

[比较mongoose _id和字符串](http://stackoverflow.com/q/11637353/1048572)可能的重复?不幸的是,你没有提供任何有关这些对象的信息。 – Bergi

回答

1

好在JavaScript中的做法是始终使用===而不是==避免强制(隐式类型转换)。为了记录在案,你也可以使用ES6 Object.is() ...

那么,为什么你的代码是不是工作?因为你没有提供足够的细节问题,但是从我在评论中看到的内容,我想你会在下面找到一个明确的解释:

obj._idreq.params.groupId必须严格等于类型。这对原始值(字符串,数字,布尔值,...)来说很好,但问题是,在JavaScript中,你不能像这样比较对象。在这种语言中,对象通过参考进行比较。这意味着如果一个对象不是同一个实例,即使它具有完全相同的属性,它也永远不会与另一个对象相等。

let ref = {}; 
 

 
// false 
 
console.log({} == {}); 
 
console.log({} === {}); 
 
console.log(Object.is({}, {})); 
 

 
// true 
 
console.log(ref == ref); 
 
console.log(ref === ref); 
 
console.log(Object.is(ref, ref));

+0

非常感谢您的反馈...并提示ES6对象 – erwin