JS中的可选链操作符(?.)、空值合并运算符(??)

本文介绍了JavaScript的两个新特性——可选链操作符?.和空值合并运算符??。?.用于安全地访问深度属性或调用方法,当对象路径可能为null或undefined时,它会返回undefined而不是抛出错误。??则在变量值为null或undefined时提供默认值,区别于||运算符。这两个操作符在处理潜在的未定义值时提供了便利,但需要注意它们不处理其他类型的错误和兼容性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、可选链操作符  ?.

        js中的可选链接操作符 ?. 是ECMAScript2020 引入的一种语法,用于简化对可能为 null 或 undefined 的对象属性或方法的访问。它的使用可以减少繁琐的空值检查和避免在访问嵌套对象时引发的 TypeError 。使用方法大致如下:

1.语法:

object?.property // 访问对象的属性,如果对象为null或undefined,则返回undefined
object?.method() // 调用对象的方法,如果对象为null或undefined,则返回undefined

2. 访问对象属性的用法:

const obj = {
  prop1: {
    prop2: {
      prop3: 'value'
    }
  }
};

console.log(obj.prop1.prop2.prop3); // 'value'
console.log(obj.prop1.prop2.prop3.prop4); // TypeError: Cannot read property 'prop4' of undefined

// 使用可选链操作符
console.log(obj?.prop1?.prop2?.prop3); // 'value'
console.log(obj?.prop1?.prop2?.prop3?.prop4); // undefined

3. 调用对象的方法的用法:

const obj = {
  method1: () => {
    console.log('Method 1 called');
  }
};

obj.method1(); // 'Method 1 called'
obj.method2(); // TypeError: obj.method2 is not a function

// 使用可选链操作符
obj.method1?.(); // 'Method 1 called'
obj.method2?.(); // undefined

        注意:可选链操作符只能在运行时检查对象是否为 null 或 undefined ,并在对象为 null 或 undefined 时返回 undefined,而不会报错。它不会处理其他类型的错误,例如属性名拼写错误等。因此,在使用可选链操作符时仍然需要注意对象的属性和方法是否存在的问题。同时,可选链操作符目前尚未得到所有JavaScript引擎的完全支持,因此在使用时需要谨慎考虑兼容性问题。

二、 空值合并运算符 ??

         空值运算符用于在变量的值为 null 或 undefined 时,提供一个默认值。它主要用于简化处理可能为 null 或 undefined 场景。它与或运算符(||)有所不同,或运算符在变量值为 false 时也会返回默认值,而 ?? 只在变量的值为 null 或 undefined 时返回默认值。

1.语法

variable ?? defaultValue // 如果variable的值为null或undefined,则返回defaultValue,否则返回variable的值

2.使用默认值示例

const value1 = null;
const value2 = undefined;
const value3 = '';
const value4 = 0;
const value5 = false;
const value6 = 'Hello';

console.log(value1 ?? 'Default Value'); // 'Default Value'
console.log(value2 ?? 'Default Value'); // 'Default Value'
console.log(value3 ?? 'Default Value'); // ''
console.log(value4 ?? 'Default Value'); // 0
console.log(value5 ?? 'Default Value'); // false
console.log(value6 ?? 'Default Value'); // 'Hello'

 2.避免引发错误

const obj = {
  prop1: {
    prop2: {
      prop3: 'value'
    }
  }
};

console.log(obj.prop1.prop2.prop3); // 'value'
console.log(obj.prop1.prop2.prop3.prop4); // TypeError: Cannot read property 'prop4' of undefined

// 使用空值合并运算符
console.log(obj.prop1.prop2.prop3 ?? 'Default Value'); // 'value'
console.log(obj.prop1.prop2.prop3.prop4 ?? 'Default Value'); // 'Default Value'

         注意:?? 只有在变量的值为 null 或 undefined 时才返回默认值,对于其他为 false 的值,?? 不会返回默认值。在使用 ?? 时,需要明确区分 null 、undefined 和 其他 false 值之间的差异。

        可选链操作符 ?. 和空值合并运算符 ?? 尚未得到所有js引擎的完全支持,在使用时需要考虑兼容性问题。 

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、付费专栏及课程。

余额充值