【vue】可选链运算符(?.)和空值合并运算符(??):


【1】空值合并运算符(??)
【2】可选链运算符(?.)

三、使用:
【1】空值合并运算符(??)
一个逻辑运算符,当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。
注:与逻辑或运算符(||)不同,逻辑或运算符会在左侧操作数为假值时返回右侧操作数。也就是说,如果使用 || 来为某些变量设置默认值,可能会遇到意料之外的行为。比如为假值(例如,‘’ 或 0)时。

const foo = null ?? 'default string';
console.log(foo); // "default string"

const baz = 0 ?? 42;
console.log(baz); // 0

const baz = 0 || 42;
console.log(baz); // 42



【2】可选链运算符(?.)
允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 运算符的功能类似于 . 链式运算符,不同之处在于,在引用为空 (nullish ) (null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。

const adventurer = {
  name: 'Alice',
  cat: {
    name: 'Dinah'
  }
};

const dogName = adventurer.dog?.name;
console.log(dogName); //undefined
console.log(adventurer.someNonExistentMethod?.()); // undefined

console.log(adventurer.someNonExistentMethod.()); 
// Error: Unexpected token  .'(

### Vue.js 中不同运算符的区别 #### 空值合并运算符 `??` 空值合并运算符用于处理可能为 `null` 或 `undefined` 的表达式。只有当左侧操作数严格等于 `null` 或 `undefined` 时,才会返回右侧操作数;否则返回左侧操作数。 ```javascript const foo = null ?? 'default string'; console.log(foo); // 输出: "default string" const bar = '' ?? 'default string'; console.log(bar); // 输出: "" const baz = 0 ?? 42; console.log(baz); // 输出: 0 ``` 上述例子展示了空值合并运算符如何只在左侧为空或未定义的情况下才采用右边的值[^1]。 #### 逻辑或运算符 `||` 逻辑或运算符会评估两个操作数,并返回第一个真值(truthy),如果两者都是假值,则返回最后一个假值(falsy)。这意味着对于非布尔类型的值来说,只要不是 `false`, `0`, `-0`, `NaN`, `""`, `null`, 或 `undefined`,都会被认为是真值。 ```javascript const foo = null || 'default string'; console.log(foo); // 输出: "default string" const bar = '' || 'default string'; console.log(bar); // 输出: "default string" const baz = 0 || 42; console.log(baz); // 输出: 42 ``` 这里可以看到即使字符串为空串(`''`)或是数值零(`0`), 使用逻辑或也会被视作假值并替换掉[^4]。 #### 可选链操作符 `?.` 可选链允许安全地访问对象深层属性而不用担心中间某个环节不存在而导致报错。它会在任何一步发现 `null` 或 `undefined` 后立即停止执行后续链条上的方法调用或属性读取。 ```javascript let user = { address: { city: "Beijing" } }; // 安全获取嵌套属性 console.log(user.address?.city); // 输出:"Beijing" console.log(user.profile?.name); // 输出:undefined 而不会抛出错误 function getCity(person){ return person?.address?.city; } getCity(null); // 返回 undefined 不会崩溃 ``` 此特性使得开发者可以更优雅地编写代码而不必担心潜在的对象结构缺失问题[^3]。 ### 结合使用案例 有时这些运算符会被一起用来构建更加健壮的数据访问逻辑: ```javascript // 假设我们有一个用户对象,其中包含地址信息 let user = {}; // 获取用户的国家名,默认为中国 let countryName = user?.profile?.location?.country ?? "China"; console.log(countryName); // 输出:"China",因为路径上任一节点都可能是 undefined if (!user?.preferences?.theme) { applyDefaultTheme(); } else { applyCustomTheme(user.preferences.theme); } ``` 通过这种方式可以在不确定数据存在与否的前提下提供合理的默认行为[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值