逻辑与 (&&) 和逻辑或 (||) 的运算符优先级
Operator precedence for logical AND (&& )and logical OR (||)
根据 JavaScript 的 operator precedence table,我可以看到 &&
的优先级高于 ||
。
因此,对于以下代码片段:
let x, y;
let z = 5 || (x = false) && (y = true);
console.log(z); // 5
console.log(x); // undefined
console.log(y); // undefined
我认为应该先对&&
求值,&&
部分短路后,x
会被赋值为false
。然后只有 ||
会被尝试评估。
但是,从 console.log
的输出中,我可以清楚地看出这里不是这种情况。
有人可以帮我看看我在这里遗漏了什么吗?
提前致谢。
||
的&&
运算符优先级的意思是:
let z = 5 || (x = false) && (y = true);
被评估为:
let z = 5 || ((x = false) && (y = true));
而不是
let z = (5 || (x = false)) && (y = true);
这并不表示何时 计算运算符每一侧的值。这是由每个操作员的机械师完成的。例如,对于 ||
,它是 specified here:
1. Let lref be the result of evaluating LogicalANDExpression.
2. Let lval be ? GetValue(lref).
3. Let lbool be ToBoolean(lval).
4. If lbool is false, return lval.
5. Let rref be the result of evaluating BitwiseORExpression.
6. Return ? GetValue(rref).
它在 GetValue(rref)
运行之前评估 GetValue(lref)
。
换句话说,运算符优先级指示哪些标记应用于哪个运算符,以及以什么顺序应用,而不是 how/when 给定运算符计算其左侧和右侧的值。
根据 JavaScript 的 operator precedence table,我可以看到 &&
的优先级高于 ||
。
因此,对于以下代码片段:
let x, y;
let z = 5 || (x = false) && (y = true);
console.log(z); // 5
console.log(x); // undefined
console.log(y); // undefined
我认为应该先对&&
求值,&&
部分短路后,x
会被赋值为false
。然后只有 ||
会被尝试评估。
但是,从 console.log
的输出中,我可以清楚地看出这里不是这种情况。
有人可以帮我看看我在这里遗漏了什么吗?
提前致谢。
||
的&&
运算符优先级的意思是:
let z = 5 || (x = false) && (y = true);
被评估为:
let z = 5 || ((x = false) && (y = true));
而不是
let z = (5 || (x = false)) && (y = true);
这并不表示何时 计算运算符每一侧的值。这是由每个操作员的机械师完成的。例如,对于 ||
,它是 specified here:
1. Let lref be the result of evaluating LogicalANDExpression.
2. Let lval be ? GetValue(lref).
3. Let lbool be ToBoolean(lval).
4. If lbool is false, return lval.
5. Let rref be the result of evaluating BitwiseORExpression.
6. Return ? GetValue(rref).
它在 GetValue(rref)
运行之前评估 GetValue(lref)
。
换句话说,运算符优先级指示哪些标记应用于哪个运算符,以及以什么顺序应用,而不是 how/when 给定运算符计算其左侧和右侧的值。