我正在研究nodejs(尽管我的问题通常对javascript有效),但我偶然发现了一些我不明白的东西。
它与三元运算符有关,据我了解,它的工作方式如下:
var numero = 5;
var positivo = numero >= 0 ? true : false;
如果条件 ( numero >=0
) 为真,则最终结果将是出现在该条件之后的第一个值,在本例中为true
。否则,最终结果将是第二个值,在本例中为false
。
所以打印时:
console.log(positivo); //imprime true
如果我更改变量numero
,我可以得到一个错误值:
var numero = -1;
var positivo = numero >= 0 ? true : false;
console.log(positivo); //imprime false
到目前为止一切顺利,但试图找出我的问题,我制作了这个小代码片段:
var isValid = false;
var message;
if(isValid){
message = 'es válida';
}else {
message = 'no es válida';
}
console.log("Ésta condición " + message);
console.log("Ésta condición " + isValid ? 'es válida' : 'no es válida');
根据我的逻辑,由于在我的代码中变量isValid
为假,因此两条消息都应打印:
Ésta condición no es válida
但是,当我运行我的程序时,结果是这样的:
Ésta condición no es válida
es válida
正如您所看到的,当使用三元运算符时,由于某种原因它忽略了我的变量isValid
在false
,有没有人知道为什么会这样?如果这是一种预期的行为(我怀疑),我想知道为什么。
您必须使用括号:
运算符
+
优先。编译器理解的内容如下:所以打印:
因为
"Ésta condición " + isValid
它评估为true
.顺便说一句,这个优先顺序适用于大多数语言(老实说我不知道有没有倒退的),包括 JavaScript。
这是完整的 JavaScript 运算符优先级表(参见MDN)。
结果和你说的不完全一样。实际结果是:
这是因为 + 运算符优先于 ?。您所做的是首先连接
"Ésta condición " + isValid
,然后检查该连接的结果是否有三元运算符条件。由于在 javascript 中非空字符串为真,因此它表示“有效”。发生两件事:
首先,正如他们在前面的评论中所说,运算符
+
在该表达式中具有更高的优先级,因此它首先要做的是添加,然后应用三元运算符。JavaScript 将非空字符串的总和解释
false
为字符串本身。在我看来,Javascript 的优先级及其解析器本身存在问题......因为它试图让所有东西都编译,如果有什么不合适,它就会丢弃它。
您的代码翻译为:
要以优雅的方式解决此问题,您可以使用
string templates
以下方法:我希望有人觉得它有帮助。