这个JavaScript if语句是否有问题?

这个JavaScript if语句是否有问题?,javascript,Javascript,我有一小段JS代码,我确信它正在工作,但似乎已经停止了: if(currentUser && currentUser._id === shinyItem.author.id || currentUser && currentUser.isAdmin) { <p>Hello banana</p> } 如果I console.log这两个值相同,那么它应该可以工作。但是,如果我删除它并运行此代码,它就可以正常工作: if(currentUs

我有一小段JS代码,我确信它正在工作,但似乎已经停止了:

if(currentUser && currentUser._id === shinyItem.author.id || currentUser && currentUser.isAdmin) {
 <p>Hello banana</p>
}
如果I console.log这两个值相同,那么它应该可以工作。但是,如果我删除它并运行此代码,它就可以正常工作:

if(currentUser || currentUser && currentUser.isAdmin) {
  <p>Hello banana</p>
}
if(currentUser | | currentUser&¤tUser.isAdmin){
你好,香蕉

}

这可能是非常明显的,任何帮助都值得感谢。

如果
currentUser.isAdmin
是错误的,但是
currentUser.\u id
看起来与
shinyItem.author.id
记录了相同的内容,那么它们的实际值肯定不一样。一种类型与另一种类型不同(例如一种类型为
string
,另一种类型为
number
),或者这种差异不容易从视觉上看到,例如一种类型有尾随空格或很少尾随空格,或者具有相似的字符(例如
1
数字和
l
字母),或者一个可能有另一个缺少的零宽度字符,或者类似的东西

仔细检查两个变量中的值。很明显,他们之间有些不同。如果两者都是字符串,但您仍然看不到差异,则可以检查字符串的每个索引的字符代码以查找差异,例如:

const str1='foo\u200bbar';
常量str2='foobar';
控制台日志(str1);
控制台日志(str2);
//它们在登录时看起来是一样的,但是。。。
for(设i=0;i}
如果
currentUser.isAdmin
是错误的,但是
currentUser.\u id
看起来与
shinyItem.author.id
记录了相同的内容,那么它们实际上一定不是相同的值。一种类型与另一种类型不同(例如一种类型为
string
,另一种类型为
number
),或者这种差异不容易从视觉上看到,例如一种类型有尾随空格或很少尾随空格,或者具有相似的字符(例如
1
数字和
l
字母),或者一个可能有另一个缺少的零宽度字符,或者类似的东西

仔细检查两个变量中的值。很明显,他们之间有些不同。如果两者都是字符串,但您仍然看不到差异,则可以检查字符串的每个索引的字符代码以查找差异,例如:

const str1='foo\u200bbar';
常量str2='foobar';
控制台日志(str1);
控制台日志(str2);
//它们在登录时看起来是一样的,但是。。。
for(设i=0;i
添加括号

if((currentUser&(currentUser.id==shinyItem.author.id))| |(currentUser&¤tUser.isAdmin)){
returnHello banana

; }
添加括号

if((currentUser&(currentUser.id==shinyItem.author.id))| |(currentUser&¤tUser.isAdmin)){
returnHello banana

; }
仅仅因为它们记录相同的值并不意味着它们属于相同的类型

您正在使用(
==
),不同类型的值将被视为不相等

您可以尝试使用(
==
)查看是否获得预期结果。或者,您可以执行显式类型转换,以确保处理的是匹配的类型

举例说明:

numberValue=12345;
stringValue='12345';
log('numberValue:'+numberValue);
log('stringValue:'+stringValue);
log('typeof numberValue:'+(typeof numberValue));
log('typeof stringValue:'+(typeof stringValue));
log('numberValue==stringValue:'+(numberValue==stringValue));
log('numberValue==stringValue:'+(numberValue==stringValue));

log('numberValue==parseInt(stringValue,10):'+(numberValue==parseInt(stringValue,10))仅仅因为它们记录相同的值并不意味着它们属于相同的类型

您正在使用(
==
),不同类型的值将被视为不相等

您可以尝试使用(
==
)查看是否获得预期结果。或者,您可以执行显式类型转换,以确保处理的是匹配的类型

举例说明:

numberValue=12345;
stringValue='12345';
log('numberValue:'+numberValue);
log('stringValue:'+stringValue);
log('typeof numberValue:'+(typeof numberValue));
log('typeof stringValue:'+(typeof stringValue));
log('numberValue==stringValue:'+(numberValue==stringValue));
log('numberValue==stringValue:'+(numberValue==stringValue));

log('numberValue==parseInt(stringValue,10):'+(numberValue==parseInt(stringValue,10))我找到了答案。我想如果我只使用==它会对它进行排序,但这也会导致错误,所以它仍然不起作用

然后我做了一些进一步的挖掘,找到了这个帖子stackoverflow.com/questions/11637353/…这似乎解决了我的问题。我不明白的是currentUser.\u id的内容是一个自定义mongoDB对象id类型。要解决此问题,我需要使用mongodb函数.equals(),如下所示:

if(currentUser && currentUser._id.equals(shinyItem.author.id) || currentUser && currentUser.isAdmin) {

我找到了答案。我想如果我只使用==它会对它进行排序,但这也会导致错误,所以它仍然不起作用

然后我做了一些进一步的挖掘,找到了这个帖子stackoverflow.com/questions/11637353/…这似乎解决了我的问题。我不明白的是currentUser.\u id的内容是一个自定义mongoDB对象id类型。要解决此问题,我需要使用mongodb函数.equals(),如下所示:

if(currentUser && currentUser._id.equals(shinyItem.author.id) || currentUser && currentUser.isAdmin) {
严格比较<代码
// log id is 5e59d4dfe93451416fc551db, instead of 
// log id is ObjectID {_bsontype: "ObjectID", id: Buffer(12)}
console.log(`id is ${currentUser._id}`); 
// value is the     value is the 
// same, but type   same, but type 
// is ObjectID      is string
currentUser._id === shinyItem.author.id // false
currentUser._id == shinyItem.author.id // true
// id is a string
currentUser.id === shinyItem.author.id // true