[英]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._id
和shinyItem.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}`);
因此,使用ObjectID
和string
之间的严格比较会解析为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.