Ecmascript 6 ES6。如何正确比较===运算符?

Ecmascript 6 ES6。如何正确比较===运算符?,ecmascript-6,Ecmascript 6,在下面的函数中,我比较两个相等的值(如控制台中显示的,但返回值为false) 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:

在下面的函数中,我比较两个相等的值(如控制台中显示的,但返回值为false)

    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' });
      }
    }
这是console.log结果

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

JavaScript中的一个良好实践是始终使用
===
而不是
=
来避免强制(隐式类型转换)。对于记录,您还可以在ES6中使用
对象.is()

那么,为什么您的代码不起作用呢?很难断言,因为您在问题中没有提供足够的详细信息,但从我在评论中看到的情况来看,我认为您将在下面找到一个明确的解释:

obj.\u id
req.params.groupId
值和类型方面必须严格相等。这对于基本值(字符串、数字、布尔值等)非常有用,但问题是,在JavaScript中,您不能像这样比较对象。在这种语言中,对象是通过引用进行比较的。这意味着,如果一个对象不是同一个实例,即使它具有完全相同的属性,它也永远不会与另一个对象相等

let ref={};
//假的
log({}=={});
log({}=={});
log(Object.is({},{}));
//真的
console.log(ref==ref);
console.log(ref==ref);

console.log(Object.is(ref,ref));
显然它们不相等。检查它们的类型(使用
typeof
)。正如@Bergi所说,
=
=
之间的区别在于它们必须是相同的类型。如果
=
返回false,则会发生其他情况。可能的重复?遗憾的是,您没有提供关于这些对象的任何信息。抱歉..实际上是用户。组。一些((obj,idx)=>{..}是指mongoose模型。所以我应该使用toString()方法