在JavaScript中,||
操作符与可选链(Optional Chaining)操作符 ?.
在处理可能为 null
或 undefined
的值时各有优劣,具体使用哪种写法取决于上下文和期望的行为。
tagLen() {return this.tagList.length || 0;
},
// 可选链
let data = user?.address?.street
||
操作符
优点:
- 简洁:
||
操作符非常简洁,只需要一行代码就可以实现默认值的提供。 - 广泛支持:
||
操作符在JavaScript的所有版本中都被支持,因此无需担心兼容性问题。
缺点:
- 不够精确:
||
操作符会在左侧表达式为“falsy”值时返回右侧的值,这意味着它不仅会在值为null
或undefined
时返回默认值,还会在值为0
、""
(空字符串)、NaN
、false
时返回默认值。这可能导致在某些情况下,即使左侧表达式有一个有效的“falsy”值(如0
),你也得不到期望的结果。 - 可能隐藏错误:如果
this.tagList
不是一个数组而是一个对象,或者由于某种原因length
属性不存在,直接访问this.tagList.length
可能会抛出错误。虽然||
操作符可以防止这种情况导致整个表达式失败,但它不会给出任何关于问题的警告或错误提示。
可选链(Optional Chaining)操作符 ?.
优点:
- 精确:可选链操作符只会在左侧表达式为
null
或undefined
时停止评估,并返回undefined
。如果左侧表达式存在且不是null
/undefined
,它将继续评估右侧的属性或方法。这意味着你可以更精确地控制何时提供默认值。 - 安全:可选链操作符可以防止因尝试访问不存在的属性或方法而导致的运行时错误。
缺点:
- 兼容性:可选链操作符是在ECMAScript 2020(ES11)中引入的,因此在一些较旧的JavaScript环境中可能不受支持。不过,现代浏览器和Node.js版本通常都支持这个特性。
- 稍微冗长:与
||
操作符相比,可选链操作符需要更多的字符来编写相同的逻辑。
何时使用哪种写法?
- 如果你需要处理的值可能是“falsy”但又有效(如
0
或空字符串),并且你希望在这些情况下保留这些值,而不是提供默认值,那么||
操作符可能不是最佳选择。在这种情况下,你可能需要更明确的条件检查,或者使用其他技术(如逻辑与&&
操作符结合三元运算符)。 - 如果你想要确保在访问深层嵌套的对象属性时不会因某个中间属性不存在而抛出错误,并且你希望在这种情况下得到一个明确的
undefined
值,那么可选链操作符?.
是一个很好的选择。
在实际开发中,选择哪种写法取决于你的具体需求和上下文。有时候,你可能需要结合使用这两种技术来满足不同的需求。