如何使用逻辑运算符填充var?

时间:2015-07-16 23:25:01

标签: javascript

我们来看看这段代码:

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

Taken from here.

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

  

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

此外,如果我们分析这篇文章:

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

是什么让token无法设置为req.body

1 个答案:

答案 0 :(得分:2)

它并没有真正评估布尔表达式并将其分配给token。你有什么简写if-else。让我们分解一下:

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

如果req.body"truthy"(在这种特殊情况下确保它不是nullundefined),那么它将分配req.body.access_tokentoken。表达式将在这里短路,不会继续。

否则,它会查看下一个案例:

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

这与上述相同;除非在这种情况下,如果req.query.access_token是" truthy"则将token分配给req.query。它也会在这里短路,除非" falsy"。

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可能是nullundefined。所以它在这里做的是说"如果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),如果ifsome_varundefined,则无法在null阻止中运行代码}。但是你必须要小心,因为合法的值如0或空字符串是" falsy",你最终可能会忽略它们。