【问题标题】:How does using logic operators populate a var? [duplicate]使用逻辑运算符如何填充 var? [复制]
【发布时间】:2015-07-16 23:25:01
【问题描述】:

让我们看看这段代码:

var token = (req.body && req.body.access_token) ||
            (req.query && req.query.access_token) ||
            req.headers['x-access-token'];

Taken from here.

这不应该返回一个布尔值吗?最让我困惑的是链接的 AND 和 OR 语句。我正在阅读:

变量token等于req.body和req.body.access_token是否存在的布尔值。或者,如果它们不存在,那么它等于 req.query 和 req.query.access_token 是否存在的布尔值。或者,如果它们不存在,则等于 req.headers['x-access-token'] 的值。

此外,如果我们只分析这一段:

var token = req.body && req.body.access_token;

是什么阻止了token 被设置为req.body?

【问题讨论】:

  • 不,布尔运算符在 Javascript 中不返回布尔值。
  • 您能否也解决我的编辑问题?

标签: javascript


【解决方案1】:

它并不是真正评估布尔表达式并将其分配给token。你所拥有的是一种速记if-else。让我们分解一下:

(req.body && req.body.access_token)

如果req.body 是"truthy"(在这种特殊情况下,它确保它不是null 或undefined,可能)然后它将分配req.body.access_token 到token。表达式将在此处短路并且不会继续。

否则就看下一个案例:

(req.query && req.query.access_token)

这和上面的一样;除非在这种情况下,如果req.query 是“真实的”,它会将req.query.access_token 分配给token。除非“虚假”,否则它也会在这里短路。

req.headers['x-access-token'];

这是最后一个子句。如果上述情况都不成立,则将req.headers['x-access-token'] 的值赋给token。

在传统形式中,它看起来像这样:

var token;
if(req.body && req.body.access_token) {
    token = req.body.access_token;
} else if(req.query && req.query.access_token) {
    token = req.query.access_token;
} else {
    token = req.headers['x-access-token'];
}

是什么阻止了令牌被设置为 req.body?

表达式为:

var token = req.body && req.body.access_token;

它不会将token 设置为req.body。在这里,req.body 有点像一个标志。我们不想直接做req.body.access_token,因为req.body 可能是null 或undefined。所以它在这里所做的是说“如果req.body 是非空/已定义,则将req.body.access_token 分配给token”。意识到如果&& 的第一项为真,则仍必须评估第二项,因为AND 为真的唯一时间是两个操作数都为真时。然而,这里的优点是“评估”第二个术语也会返回该术语的值,最终设置为 token。

更明确地说,上面的表达式可以表示为:

if(req.body !== null || typeof req.body !== "undefined") {
    token = req.body.access_token;
}

但在 JavaScript 中,您可以简单地检查 if(some_var),如果 some_var 是 undefined 或 null,则不会运行 if 块中的代码。但是你必须小心,因为像 0 或空字符串这样的合法值是“虚假的”,你最终可能会忽略它们。

【讨论】:

  • 有关Short-circuit evaluation 的更多信息。完美答案,+1。
  • 我假设您只能通过逻辑 OR (||) 语句获得此行为? IE。不能用 AND 语句短路表达式?
  • @KennyWorden 我制作了这个demo 来演示&& 会发生什么。
  • 花点时间阅读我在第一条评论中发布的链接。他们举例说明它是如何工作的。
  • @KennyWorden 你可以和&&一起使用;如果所有前面的术语评估为true,则将返回最后一个术语的值。否则结果将是false。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 2022-10-16
  • 2020-01-23
  • 1970-01-01
  • 2021-12-17
相关资源
最近更新 更多