我跟随Discover Meteor tutorial,在提交8-1后我们添加:
// Check that the userId specified owns the documents
ownsDocument = function(userId, doc) {
return doc && doc.userId === userId;
}
我不明白的是doc和userId并不完全相同(===),为什么这样做呢?
供参考:
DOC:
{ _id: '1a2b3c4d',
url: 'blahblah.com',
title: 'blah blah',
userId: '0w9x8y7z',
author: 'testuser',
submitted: '...'}
doc.userId:
userId: 0w9x8y7z
用户名:
userId: 0w9x8y7z
我得到doc.userId === userId
,但为什么会doc && doc.userId === userId
通过?
答案 0 :(得分:2)
这是JavaScript中常用的习惯用法,如果要在访问其中一个属性之前检查对象是否为undefined
(或其他falsey),您可以说:
obj && obj.prop
如果第一个参数为false,则&&
operator不会计算第二个参数,因此这可以保护您的代码不会尝试从值未定义的变量中检索属性值
因此,示例中的return语句相当于:
if (doc){
return doc.userId;
} else {
return doc;
}
答案 1 :(得分:2)
你混淆的根源似乎是你解释这个:
if(doc && doc.userId === userId)
as"如果doc和doc.userId都等于userId"。事实并非如此。
&&
的每一方都是一个单独的条件。它与:
if(doc == true && doc.userId === userId)
其次,左侧的== true
部分是多余的,因此在检查变量是否为truthy时通常不会包含此内容。
truthy检查的原因是,在尝试访问其中的属性之前,您要检查doc
是否不是falsey。使用逻辑AND
,如果左侧未评估为true,则不会执行右侧。如果没有检查,如果doc
为falsey,则会尝试访问无对象上的属性,从而产生错误。
答案 2 :(得分:1)
如果您查看Operator Precedence table,您会发现相等(==
/ ===
)的优先级高于AND(&&
),因此:
doc && doc.userId === userId
以这种方式解析:
doc && (doc.userId === userId)
而不是这一个:
(doc && doc.userId) === userId
然后,由于doc
是真实的,引擎会评估doc.userId === userId
并返回该结果。