JS的可选链操作符(?.)与双问号(??),你用到了吗?

本文介绍了JavaScript中的可选链操作符(?.)和双问号操作符(??),它们简化了对可能为null或undefined的对象属性和方法的访问。文章还指导了如何在Babel7及以上版本中启用这两个提案作为插件,以在工程中使用这些新特性。

可选链操作符(?.)

以前一般这样使用:

let nestedProp = obj.first && obj.first.second;

或者这样:

let temp = obj.first;
let nestedProp = ((temp === null || temp === undefined) ? undefined : temp.second);

现在我们这样使用:

let nestedProp = obj.first?.second; // 访问属性
let result = someInterface.customMethod?.(); // 调用方法
let nestedProp = obj?.['prop' + 'Name']; // 表达式
let arrayItem = arr?.[42]; // 访问数组

详细使用可参考:Optional chaining (?.)

双问号(??)

语法:

leftExpr ?? rightExpr

??在leftExpr和rightExpr之间,只有当leftExprnull或者 undefined时取rightExpr,否则取leftExpr0,false,""被认为是有意义的,所以还是取leftExpr

以前这样使用:

let foo;
let someDummyText = foo || 'Hello!';

基础示例:

const nullValue = null;
const emptyText = ""; // falsy
const someNumber = 42;

const valA = nullValue ?? "default for A";
const valB = emptyText ?? "default for B";
const valC = someNumber ?? 0;

console.log(valA); // "default for A"
console.log(valB); // "" (as the empty string is not null or undefined)
console.log(valC); // 42

特殊示例:

null || undefined ?? "foo"; // raises a SyntaxError
true || undefined ?? "foo"; // raises a SyntaxError

(null || undefined) ?? "foo"; // returns "foo"

详细使用可参考:Nullish coalescing operator (??)

工程中怎样使用

babel7以上版本支持,可以添加以下2个devDependencies依赖:

@babel/plugin-proposal-optional-chaining // 可选链
@babel/plugin-proposal-nullish-coalescing-operator // 双问号

.babelrc或者babel.config.js中这加入2个插件(plugins属性放在JSON顶层):

{
 "plugins": [
    "@babel/plugin-proposal-nullish-coalescing-operator",
    "@babel/plugin-proposal-optional-chaining"
  ]
}
JavaScript 中,可选链操作符(`?.`)是一种语法糖,用于安全地访问对象的深层属性或调用方法,而无需显式检查每一层是否为 `null` 或 `undefined`。如果某个引用为空,则表达式会短路并返回 `undefined`,而不是抛出错误。 ### 可选链操作符的基本使用 可选链支持以下几种形式: - `object?.property`:访问对象的属性。 - `object?.[expression]`:通过表达式动态访问对象的属性。 - `object?.method()`:调用对象的方法(如果存在)。 例如,访问嵌套对象中的属性: ```javascript const user = { profile: { name: 'John Doe' } }; // 使用可选链 const userName = user?.profile?.name; // 'John Doe' ``` 上述代码等价于传统的写法: ```javascript const userName = user && user.profile && user.profile.name; // 'John Doe' ``` 使用可选链可以显著减少冗余的条件判断,使代码更简洁和易读[^4]。 --- ### 可选链函数调用 可选链也适用于函数调用场景,尤其适合处理可选的回调函数或事件处理器。如果指定的方法不存在,表达式将返回 `undefined` 而不会引发错误。 ```javascript function invoke(fn) { fn?.call(this); // 如果 fn 不存在,不会报错 } ``` 这种写法比传统的条件判断更加简洁,并且避免了不必要的错误处理逻辑[^5]。 --- ### 可选链数组元素访问 除了对象属性之外,可选链也可以用于访问数组中的元素。如果数组本身为 `null` 或 `undefined`,或者索引超出范围,表达式会返回 `undefined`。 ```javascript const arr = [1, 2, 3]; console.log(arr?.[0]); // 1 console.log(arr?.[5]); // undefined ``` 这种方式可以有效防止访问未定义数组时的运行时错误[^5]。 --- ### 可选链空值合并运算符结合使用 为了进一步简化默认值的设置,可选链可以空值合并运算符 `??` 结合使用。当左侧表达式的结果为 `null` 或 `undefined` 时,返回右侧的默认值。 ```javascript const obj = {}; const value = obj?.prop ?? 'default'; console.log(value); // 'default' ``` 这种组合在处理配置项、API 响应等不确定结构的数据时非常有用[^4]。 --- ### 注意事项 虽然可选链提供了便捷的访问方式,但在使用时需要注意以下几点: - **不可用于赋值**:不能将可选链用于属性赋值操作,否则会导致语法错误。 ```javascript const obj = { propName: 'name' }; obj?.['propName'] = 'new name'; // SyntaxError ``` - **类型不匹配仍会报错**:如果链中某个属性不是函数但尝试以函数方式调用,依然会抛出错误。 ```javascript const obj = { method: 'not a function' }; obj?.method?.(); // TypeError: obj.method is not a function ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值