它并不是真正评估布尔表达式并将其分配给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 或空字符串这样的合法值是“虚假的”,你最终可能会忽略它们。