面试题答案
一键面试以下是一个满足要求的JavaScript复杂表达式:
let a = 5;
let b = 3;
let c = 2;
let result = ((a + b) * c) > (a & b) && (a << 1) === (b * c + a) && (a -= 2) === 3;
操作符及执行顺序、优先级和结合性分析
- 算术操作符
+
:优先级较高,先计算a + b
,即5 + 3 = 8
。算术操作符遵循从左到右的结合性。 - 算术操作符
*
:优先级高于>
等比较操作符,接着计算(a + b) * c
,即8 * 2 = 16
。 - 位操作符
&
:优先级低于算术操作符,计算a & b
,即5 & 3
,按位与后结果为1
。 - 比较操作符
>
:优先级低于算术和位操作符,比较((a + b) * c) > (a & b)
,即16 > 1
,结果为true
。 - 位操作符
<<
:优先级低于算术操作符,计算a << 1
,即5 << 1
,左移1位结果为10
。 - 算术操作符
*
和+
:先计算b * c
为3 * 2 = 6
,再计算b * c + a
为6 + 5 = 11
。 - 比较操作符
===
:比较(a << 1) === (b * c + a)
,即10 === 11
,结果为false
。 - 逻辑与操作符
&&
:具有短路特性,因为前一个&&
左边为true
,右边为false
,所以整体true && false
为false
。但为了完整分析,继续看后面。 - 赋值操作符
-=
:优先级较低,计算a -= 2
,即a = a - 2
,此时a
变为3
。 - 比较操作符
===
:比较(a -= 2) === 3
,即3 === 3
,结果为true
。
由于整体表达式为 true && false && true
,最终结果为 false
。若要使结果为 true
,可以修改为:
let a = 5;
let b = 3;
let c = 2;
let result = ((a + b) * c) > (a & b) && (a << 1) === (b * c + a) || (a -= 2) === 3;
这里将第二个 &&
改为 ||
,此时表达式为 true && false || true
,根据逻辑或的短路特性,最终结果为 true
。
总结
- 优先级:算术操作符(如
+
、*
) > 位操作符(如&
、<<
) > 比较操作符(如>
、===
) > 逻辑操作符(如&&
、||
) > 赋值操作符(如-=
)。 - 结合性:算术操作符从左到右结合,赋值操作符从右到左结合,逻辑操作符从左到右结合。通过合理安排操作符及其优先级和结合性,可以构建出满足特定条件的复杂表达式。