我们来看看这段代码:
var token = (req.body && req.body.access_token) ||
(req.query && req.query.access_token) ||
req.headers['x-access-token'];
这不应该返回一个布尔值吗?最令我困惑的是链式AND和OR语句。我正在读这个:
变量标记等于布尔值是否存在
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
?
答案 0 :(得分:2)
它并没有真正评估布尔表达式并将其分配给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.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
可能是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)
,如果if
为some_var
或undefined
,则无法在null
阻止中运行代码}。但是你必须要小心,因为合法的值如0
或空字符串是" falsy",你最终可能会忽略它们。