唯品秀前端博客
当前位置: 前端开发 > JavaScript > js可选链操作.?双问号??(babel-plugin-proposal-optional-chaining、plugin-proposal-nullish-coalescing-operator)

js可选链操作.?双问号??(babel-plugin-proposal-optional-chaining、plugin-proposal-nullish-coalescing-operator)

2020-06-10 分类:JavaScript 作者:管理员 阅读(222)

可选链操作符 ?. 可以按照操作符之前的属性是否有效,链式读取对象的属性或者使整个对象链返回 undefined。?. 运算符的作用与 . 运算符类似,不同之处在于,如果对象链上的引用是 nullish (null 或者 undefined),. 操作符会抛出一个错误,而 ?. 操作符则会按照短路计算的方式进行处理,返回 undefined。可选链操作符也可用于函数调用,如果操作符前的函数不存在,也将会返回 undefined。

上面是官方解释,假设你是第一次看到类似下面这类语法,大概你是懵逼的

1
2
3
4
let arr = [100, 23, 45];
let arrayItem = arr?.[10] ?? 100;
console.log(arrayItem);
//结果: 100

示例

1
2
3
4
5
6
7
8
9
const person = {
    details: {
        name: {
            firstName: "小明",
            lastName: "小美",
        }
    }
}
const personFirstName = person.details.name.firstName;

上面的代码很容易产生错误,你大概会这么取值

1
2
3
4
5
if( person &&
    person.details &&
    person.details.name ) {
        const personFirstName = person.details.name.firstName || 'stranger';
}

loadsh库优化写法

1
_.get(person, 'details.name.firstName', 'stranger') ;

lodash 的写法可读性还是很不错的,但有没有一种原生方式是可以解决的,那么,我告诉你,可选链就是为了解决这个问题而诞生的

插件安装

1
2
npm install --save-dev @babel/plugin-proposal-optional-chaining // 可选链
npm install --save-dev @babel/plugin-proposal-nullish-coalescing-operator // 双问号

基本语法(可选链)

  • obj?.prop
  • obj?.[expr]
  • arr?.[index]
  • func?.(args)
1
2
3
4
5
6
7
8
9
let nestedProp = obj.first?.second; //可选链与对象取值

let result = someInterface.customMethod?.(); //可选链与函数调用

let nestedProp = obj?.['prop' + 'Name']; //可选链和表达式

let arrayItem = arr?.[42]; //可选链访问数组元素

let newData = object?.property = 1; // Uncaught SyntaxError: Invalid left-hand side in assignment //可选链不能用于赋值

短路:遇到 null/undefined 停止

可选链接运算符的有趣之处在于,只要在左侧person?.details 遇到无效值,右侧访问就会停止,通常会返回undefined ,这称为短路

默认值(双问号)

1
const personData= person?.details ?? '默认值'; // 基本语法
1
2
3
4
5
// 如例
let arr = [100, 23, 45];
let arrayItem = arr?.[10] ?? 100;
console.log(arrayItem);
//结果: 100

这个运算符就是 ??,如果它左侧表达式的结果是 undefined,personData,就会取右侧的"默认值"(stranger)。是不是跟运算符 || 很像,其实?? 就是为了取代 || ,来做设置默认值这件事的。

兼容性

尽管这个特性很完美,但想直接在项目中使用还是不太现实的,好在还有babel,插件babel-plugin-proposal-optional-chainingplugin-proposal-nullish-coalescing-operator

1
2
3
4
5
6
7
8
// cli3.x中,进入babel.config.js文件
module.exports = {
  presets: ['@vue/app'],
  plugins: [
    '@babel/plugin-proposal-nullish-coalescing-operator', // 双问号
    '@babel/plugin-proposal-optional-chaining' // 可选链
  ]
};

「三年博客,如果觉得我的文章对您有用,请帮助本站成长」

赞(0) 打赏

谢谢你请我吃鸡腿*^_^*

支付宝
微信
0

谢谢你请我吃鸡腿*^_^*

支付宝
微信
标签:

上一篇:

下一篇:

你可能感兴趣

0 条评论关于"js可选链操作.?双问号??(babel-plugin-proposal-optional-chaining、plugin-proposal-nullish-coalescing-operator)"

博客简介

唯品秀博客: weipxiu.com,一个关注Web前端开发技术、关注用户体验、坚持更多原创实战教程的个人网站,愿景:成为宇宙中最具有代表性的前端博客,期待您的参与,主题源码 

精彩评论

  • 江吟辞(1周前 (06-29))

    好难坚持啊,我还没毕业,不知道啥时候才能像您一样厉害

    评:碎言碎语
  • 和我、恋爱吧(1周前 (06-29))

    怎么没见你更新呢,比较忙吗

    评:碎言碎语
  • 游离(1周前 (06-29))

    站主,你好!请教一下,前台的pc 端和移动端,你是怎么实现响应式的呢?媒体查询的同时写两套样...

    评:碎言碎语
  • 권지용(1周前 (06-29))

    最近在学习前端,看了博主很多文章,收益匪浅,感谢大佬

    评:碎言碎语
  • 白君也(1周前 (06-28))

    哇 自己制作的吗 在哪学的技术啊 好厉害

    评:碎言碎语
  • 管理员(3周前 (06-16))

    时间区间问题,因为目前是2020年,你所选不可能超出这个时间吧,当然,代码是根据你的业务来,...

    评:js时间戳完美转换成阴历农历格式

友情链接

他们同样是一群网虫,却不是每天泡在网上游走在淘宝和网游之间、刷着本来就快要透支的信用卡。他们或许没有踏出国门一步,但同学却不局限在一国一校,而是遍及全球!申请交换友链

站点统计

  • 文章总数: 258 篇
  • 草稿数目: 0 篇
  • 分类数目: 16 个
  • 独立页面: 6 个
  • 评论总数: 902 条
  • 链接总数: 17 个
  • 标签总数: 459 个
  • 注册用户: 8220 人
  • 访问总量: 9213040 次
  • 最近更新: 2020年7月3日
服务热线:
 173xxxx7240

 QQ在线交流

 旺旺在线