你不可忽略的JS技巧——短路运算符
"短路"是一种程序优化技术。在逻辑运算中,"短路"指的是在可以确定整个表达式最终的布尔值时,就停止后续的计算。
先来看概念吧
逻辑 &&(与运算)
console.log(true && 'hello'); // 'hello'
console.log(false && 'hello'); // false
console.log('hello' && true); // true
console.log('hello' && false); // false
如果左操作数为真值,那么返回右操作数的值;
如果左操作数为假值,那么返回左操作数的值。
一旦遇到第一个假值,就会立即返回这个假值,并且不会继续计算后续的操作数
逻辑 ||(或运算)
console.log(true || 'hello'); // true
console.log(false || 'hello'); // 'hello'
console.log('hello' || true); // 'hello'
console.log('hello' || false); // 'hello'
如果左操作数为真值,那么返回左操作数的值;
如果左操作数为假值,那么返回右操作数的值。
一旦遇到第一个真值,就会立即返回这个真值,并且不会继续计算后续的操作数
可能看了这些,你的理解还不是很深刻,它到底可以帮我们怎么优化代码呢?
有以下几点是我们常用的:
1、条件判断 &&
这个算是我们相当常见的使用了,可以用短路运算代替 if
if (condition) {
executeFunction();
}
//简化为
condition && executeFunction();
在这个例子中,如果 condition 为 true,那么 executeFunction() 就会被执行;
如果 condition 为 false,那么由于 && 的短路性质,executeFunction() 就不会被执行。
2、默认值设置 ||
let value = possiblyUndefinedVariable || 'default value';
在这个例子中,如果 possiblyUndefinedVariable 为 undefined 或 null(或任何其他假值),那么 value 就会被设置为 'default value'。
这里可能有同学已经忘了,哪些值是假值?我们来复习一下:
在 JavaScript 中,"假值"(falsy value)是指在布尔上下文中被视为 false 的值。以下是 JavaScript 中的所有假值:
false:布尔类型的假值0和-0:数字类型的假值""(空字符串)nullundefinedNaN(Not a Number,不是一个数字)
这些假值在条件判断语句(如 if、while、for 等)或逻辑运算(&&、|| 等)中,会被自动转换为 false。其他所有的值都被认为是真值(truthy value),在布尔上下文中会被视为 true。
在 || 运算符中,如果左侧的值是假值,那么就会返回右侧的值。这常被用来为变量提供默认值:
3、安全的对象属性访问:
在 JavaScript 中,如果你试图访问一个 undefined 或 null 的值的属性,会抛出 TypeError。
例如,如果 obj 是 undefined,则 obj.prop 会导致 TypeError。
在实际编程中,我们经常需要访问对象的嵌套属性,如 obj.prop.subProp,但在访问这些属性之前,我们可能并不确定 obj 或 obj.prop 是否存在。如果我们直接访问 obj.prop.subProp,而 obj 或 obj.prop 事实上是 undefined,那么就会抛出 TypeError。
为了避免这种错误,我们通常需要在访问嵌套属性之前检查每一级的对象是否存在。一种常见的做法是使用 && 运算符,如下所示:
let value = obj && obj.prop && obj.prop.subProp;
在这个例子中,首先检查 obj 是否存在(即 obj 不是 undefined 或 null)。如果 obj 存在,那么就继续检查 obj.prop;如果 obj 不存在,那么 obj && obj.prop && obj.prop.subProp 的结果就是 undefined,并且由于 && 的短路特性,不会尝试访问 obj.prop。
同样,obj.prop && obj.prop.subProp 首先检查 obj.prop 是否存在。如果 obj.prop 存在,那么就返回 obj.prop.subProp;如果 obj.prop 不存在,那么就返回 undefined,并且不会尝试访问 obj.prop.subProp。
因此,使用 && 运算符可以避免在访问嵌套属性时由于中间的对象不存在而抛出的 TypeError。这就是所谓的"安全的对象属性访问"。
4、Optional Chaining (可选链)
在 JavaScript 中,我们经常需要检查一个对象是否有某个属性,然后再去获取那个属性的值。如果对象没有那个属性,我们通常需要提供一个默认值。
ES2020 引入了可选链(Optional Chaining)运算符 ?.,它提供了一种更简洁的方式来安全地访问深层次的对象属性。
例如,你可以写 let value = obj?.prop?.subProp; 来安全地访问 obj.prop.subProp,即使 obj 或 obj.prop 不存在,这也不会引发 TypeError 错误。如果 obj 或 obj.prop 不存在,那么表达式的结果就是 undefined。
let value = obj?.prop?.subProp || 'default value';
在这个例子中,如果 obj 或 obj.prop 为 undefined 或 null,那么整个表达式的值就会是 'default value'。
5、Nullish Coalescing Operator (空值合并运算符)
JavaScript 在 2020 年引入了一个新的运算符 ??,它类似于 ||运算符,但只在左边的操作数为 null 或 undefined 时,才会返回右边的操作数。这对于处理可能为 0 或空字符串(它们在 JavaScript 中是假值)的值非常有用:
let value = possiblyZeroOrEmptyString ?? 'default value';
只有当 possiblyZeroOrEmptyString 为 null 或 undefined 时,value 才会被设置为 'default value'。
如果 possiblyZeroOrEmptyString 为 0 或空字符串,value 的值就会是 0 或空字符串。
转载自:https://juejin.cn/post/7242140832379732023