为什么这种矛盾的行为来自&& amp;运营商在发生什么

时间:2018-01-12 07:46:51

标签: javascript node.js express

const {DEMO, PORT, LOCAL} = process.env;
const socketAddress = (DEMO & LOCAL)? `http://${hostname}:${PORT}`: `wss://${hostname}`;

DEMO为false,PORT未定义,LOCAL为true

主机名为http://9f9cbf19.ngrok.io

我通过console.log双重检查了所有值

由于(DEMO && LOCAL) === (false && true) === false,第二个表达式wss://${hostname}应分配给socketAddress

但这种情况令人难以置信。但

以下是我记录的一些内容以及我在控制台中收到的内容。

`console.log('DEMO '+DEMO+' LOCAL '+LOCAL)`

在我的控制台中:DEMO false LOCAL true

非常正常

console.log('DEMO && LOCAL returns '+(DEMO && LOCAL))

在我的控制台中:DEMO && LOCAL returns true

不正常。这怎么可能呢

`console.log('false && true returns '+(false&&true))`

在我的控制台中:false && true returns false

非常正常......那么,如果DEMO为false并且LOCAL为真,那么为什么不会DEMO && LOCAL返回相同的值,如我之前的日志所示?

我刚发现LOCAL && DEMO返回false。

LOCAL && DEMO === false和`DEMO& LOCAL === true

2 个答案:

答案 0 :(得分:4)

这是因为您从process.env中分配了一个字符串数据类型。

 <svg height="100" width="100">
  <circle cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" />
  Sorry, your browser does not support inline SVG.  
</svg> 

将值转换为布尔值

答案 1 :(得分:1)

听起来DEMO和LOCAL是字符串而不是布尔值。请注意,console.log(false)和console.log(&#39; false&#39;)会产生完全相同的输出。

你应该避免使用&amp;&amp;运算符,直到你将它们解析为适当的布尔变量,例如:

const DEMO = process.env.DEMO == 'true';
const LOCAL = process.env.LOCAL == 'true';
const PORT = process.env.PORT;

然后继续你的三元运营商。