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