Javascript ||操作员行为

时间:2018-11-04 15:59:03

标签: javascript

这怎么解释

这两个符合预期

"x" || "y"
=> "x"

"x" || "y" == "y"
=> "x"

但是这个吗?

"x" || "y" == "y" ? "a" : "b"
=> "a"

编辑:我期望最后一个表达式为“ x”。现在得到了答案。我不清楚?的运算符优先级。和||

5 个答案:

答案 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,在此表达式中,评估按以下顺序进行:

  1. ==-相等性检查:"y" == "y"的计算结果为true,因此您需要使用以下表达式来求解"x" || true ? "a" : "b"

console.log("y" == "y")

  1. ||-布尔值OR:"x" || true this evaluates to "x"-第一个表达式为真,因此OR短路,并返回表达式的值。

console.log("x" || true)

  1. ?-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时。它将执行该代码块。不会检查&&运算符之后的其他条件。