这怎么解释
这两个符合预期
"x" || "y"
=> "x"
"x" || "y" == "y"
=> "x"
但是这个吗?
"x" || "y" == "y" ? "a" : "b"
=> "a"
编辑:我期望最后一个表达式为“ x”。现在得到了答案。我不清楚?的运算符优先级。和||
答案 0 :(得分:3)
看看运算符优先级:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
"x" || "y" == "y"
是"x"
,它是真实的(Understanding JavaScript Truthy and Falsy),因此... ? ... : ...
返回第一个表达式
答案 1 :(得分:1)
让我们分解一下。
//Your original question
"x" || "y" == "y" ? "a" : "b"
//Changing ternary to standard "if"
if ("x" || "y" == "y") then "a" else "b"
//Grouping the conditionals
if ( ("x") || ("y" == "y") ) then "a" else "b"
//Evaluating the conditionals
if ( true || true ) then "a" else "b"
//End result
if (true) then "a" else "b"
"x"
的值为true
,因为非空字符串是truthy。
表达式之所以这样分组,是因为逻辑或运算符(||
)的运算符优先级为 5 ,而条件运算符(... ? ... : ...
)的运算符优先级为 4 。 (More on operator precedence)
很难确切知道您的期望,但是我想可能是这样的:
var result = "x" || ("y" == "y" ? "a" : "b");
console.log(result);
答案 2 :(得分:0)
"x" || "y" == "y" ? "a" : "b"
根据operator precedence rules,在此表达式中,评估按以下顺序进行:
==
-相等性检查:"y" == "y"
的计算结果为true
,因此您需要使用以下表达式来求解"x" || true ? "a" : "b"
console.log("y" == "y")
||
-布尔值OR:"x" || true
this evaluates to "x"
-第一个表达式为真,因此OR短路,并返回表达式的值。
console.log("x" || true)
?
-ternary conditional:"x" ? "a" : "b"
-由于"x"
是真实的,正如我们已经看到的那样,因此它通过三元测试并返回左值{{1} }。
"a"
因此,为清楚起见,可以将原始语句重写为
console.log("x" ? "a" : "b")
答案 3 :(得分:0)
||
运算符从左到右进行评估,并且为short-circuited。因此,它第一次遇到真实条件时,将返回而不评估其他条件。由于“ x”不是空字符串,因此它返回true,并且永远不会评估所有后面的内容。
后一种语法为the conditionnal ternary operaor
condition ? exprT : exprF
如果条件为true则返回exprT,如果条件为false则返回exprF
答案 4 :(得分:0)
OR条件(||):每当第一个条件为True时。它将执行该代码块。在||之后将不检查其他条件运算符。
AND条件(&&):每当第一个条件为False时。它将执行该代码块。不会检查&&运算符之后的其他条件。