面试题答案
一键面试1. 性能差异分析
a && b
(逻辑与):- 底层原理:JavaScript 引擎在处理
a && b
时,采用短路求值策略。首先计算a
的值,若a
为假值(false
、null
、undefined
、0
、''
、NaN
),则不会再计算b
,直接返回a
。只有当a
为真值时,才会计算b
并返回b
的值。 - 性能影响:在很多情况下,尤其是当
a
有较大概率为假值时,短路求值能避免不必要的计算,从而提高性能。例如,在检查某个对象属性是否存在且该属性值是否满足一定条件时,如果对象本身为null
或undefined
,使用obj && obj.prop
就不会尝试访问不存在对象的属性,直接返回null
或undefined
,避免报错同时提高效率。
- 底层原理:JavaScript 引擎在处理
a & b
(按位与):- 底层原理:按位与操作会将
a
和b
先转换为 32 位二进制数,然后对每一位进行与操作。无论a
的值是什么,都会计算b
的值,然后按位进行逻辑与运算。 - 性能影响:由于不会短路,无论
a
为何值,都要计算b
并进行按位操作,所以当a
大概率为假值时,按位与可能会做一些不必要的计算,性能相对较低。
- 底层原理:按位与操作会将
2. 应用场景选择
- 选择
&&
(逻辑与)的场景:- 条件判断:当需要进行条件判断,并且希望在前面条件不满足时避免后续可能会导致错误或性能开销较大的计算时,使用
&&
。例如,if (user && user.isLoggedIn) { // 执行某些操作 }
,如果user
为null
或undefined
,不会去访问isLoggedIn
属性,避免错误。 - 逻辑控制流:在逻辑控制流中,通过短路求值来简化代码逻辑。如
let result = condition1 && functionThatReturnsValue();
,如果condition1
为假,不会调用functionThatReturnsValue()
函数。
- 条件判断:当需要进行条件判断,并且希望在前面条件不满足时避免后续可能会导致错误或性能开销较大的计算时,使用
- 选择
&
(按位与)的场景:- 位操作:当处理二进制数据或需要对数字的每一位进行操作时,使用按位与。例如,在掩码操作中,
let maskedValue = value & 0b11110000;
,用于提取value
二进制表示中特定位置的位,这种情况下按位与是必要的操作符。 - 处理整数标志:如果使用整数来表示一组布尔标志,按位与可用于检查某些标志是否同时设置。比如,
let flags = 0b1011; let isFlag1AndFlag3Set = flags & 0b1010;
,通过按位与判断特定标志位是否都为 1。
- 位操作:当处理二进制数据或需要对数字的每一位进行操作时,使用按位与。例如,在掩码操作中,
3. 引擎执行过程和优化策略
a && b
的执行和优化:- 执行过程:引擎首先获取
a
的值,判断其是否为假值。如果为假值,直接返回a
;如果为真值,获取b
的值并返回b
。 - 优化策略:短路求值本身就是一种优化策略,避免不必要的计算。现代 JavaScript 引擎还会对常见的逻辑表达式模式进行优化,例如在循环中频繁使用的
&&
表达式,引擎可能会进行内联缓存等优化,减少重复的判断开销。
- 执行过程:引擎首先获取
a & b
的执行和优化:- 执行过程:引擎将
a
和b
转换为 32 位有符号整数(如果它们不是数字,会先进行类型转换),然后对每一位进行与操作,最后返回结果。 - 优化策略:对于按位操作,JavaScript 引擎在处理简单的按位与操作时,会尽量优化类型转换和按位运算的过程。例如,对于已知类型为数字的操作数,会直接进行按位运算,减少不必要的类型检查开销。但由于按位与不能短路,在某些场景下,相比
&&
会有更多计算,优化空间相对有限。
- 执行过程:引擎将