繁体   English   中英

这个 JavaScript if 语句有什么问题吗?

[英]is there something wrong with this JavaScript if statement?

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

if(currentUser && currentUser._id === shinyItem.author.id || currentUser && currentUser.isAdmin) {
 <p>Hello banana</p>
}

问题似乎是这部分:

currentUser._id === shinyItem.author.id

如果我 console.log 两个值相同,那么它应该可以工作。 但是,如果我删除它并运行此代码,它就可以正常工作:

if(currentUser || currentUser && currentUser.isAdmin) {
  <p>Hello banana</p>
}

这可能是非常明显的事情,任何帮助表示赞赏。

如果currentUser.isAdmin是假的,但currentUser._id看起来记录的内容与shinyItem.author.id相同,那么它们必须实际上不是相同的值。 要么一个的类型与另一个不同(例如,如果一个是string类型,另一个是number类型),或者在视觉上不容易看出差异,例如一个尾随空格或很少,或者有一个相似的字符(例如1数字和l字母),或者一个可能有另一个缺少的零宽度字符,或者类似的东西。

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

 const str1 = 'foo\​bar'; const str2 = 'foobar'; console.log(str1); console.log(str2); // They look the same when logged, but... for (let i = 0; i < str1.length; i++) { if (str1[i] !== str2[i]) { console.log(`Found difference at index ${i}: code ${str1[i].charCodeAt()} !== code ${str2[i].charCodeAt()}`); break; } }

仅仅因为它们记录相同的值并不意味着它们是相同的类型。

您正在使用严格相等运算符( === ),并且不同类型的值将被视为不相等。

您可以尝试使用松散相等运算符( == ) 来查看是否得到预期结果。 或者,您可以执行显式类型转换以确保您正在处理匹配类型。

为了显示:

 numberValue = 12345; stringValue = '12345'; console.log('numberValue: ' + numberValue); console.log('stringValue: ' + stringValue); console.log('typeof numberValue: ' + (typeof numberValue)); console.log('typeof stringValue: ' + (typeof stringValue)); console.log('numberValue === stringValue: ' + (numberValue === stringValue)); console.log('numberValue == stringValue: ' + (numberValue == stringValue)); console.log('numberValue === parseInt(stringValue, 10): ' + (numberValue === parseInt(stringValue, 10)));


此外,表达条件语句的一种更简单的方法是:

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

添加括号。

if ((currentUser && (currentUser._id === shinyItem.author.id)) || (currentUser && currentUser.isAdmin)) {
  return <p>Hello banana</p>;
}

我找到了答案。 我虽然如果我只使用 == 它会对其进行排序,但这也会导致错误,因此它仍然无法正常工作。

然后我做了更多的挖掘,发现了这篇文章 stackoverflow.com/questions/11637353/... 这似乎解决了我的问题。 我不明白的是 currentUser._id 的内容是自定义的 mongoDB 对象 ID 类型。 为了解决这个问题,我需要像这样使用 mongodb 函数 .equals():

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

严格比较===意味着类型和值必须相同才能返回true作为结果。 原因,这些currentUser._idshinyItem.author.id看起来相同,是它们可能用于上下文中,其中 javascript 引擎尝试实现类型强制 如果currentUser._id是 mongoose ObjectID ,它里面有toString方法,javascript引擎会在实现类型强制时使用它并返回一个string

// log id is 5e59d4dfe93451416fc551db, instead of 
// log id is ObjectID {_bsontype: "ObjectID", id: Buffer(12)}
console.log(`id is ${currentUser._id}`); 

因此,使用ObjectIDstring之间的严格比较会解析为false

// value is the     value is the 
// same, but type   same, but type 
// is ObjectID      is string
currentUser._id === shinyItem.author.id // false

但是松散的相等比较==解析为true ,因为在幕后,javascript 引擎尝试使用ObjectID toString方法将两个值强制转换为相同的类型( string )并将其转换为string

currentUser._id == shinyItem.author.id // true

Mongoose 也有id virtual getter ,它将文档 _id 字段转换为字符串,因此您可以像这样使用它(如果您没有在架构中禁用它):

// id is a string
currentUser.id === shinyItem.author.id // true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM