不应该"返回doc&& doc.userId === userId;"归还假吗?

时间:2015-01-13 15:50:04

标签: javascript meteor

我跟随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通过?

3 个答案:

答案 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,则不会执行右侧。如果没有检查,如果docfalsey,则会尝试访问无对象上的属性,从而产生错误。

答案 2 :(得分:1)

如果您查看Operator Precedence table,您会发现相等(== / ===)的优先级高于AND(&&),因此:

doc && doc.userId === userId

以这种方式解析:

doc && (doc.userId === userId)

而不是这一个:

(doc && doc.userId) === userId

然后,由于doc是真实的,引擎会评估doc.userId === userId并返回该结果。