what is nullish value?

所谓的 nullish value 空值就两个:nullundefined

when to use optional chaining?

WechatIMG704.png
当我们访问对象的属性时,但是这个对象可能会为null或者undefined,此时会报上面的错误,针对这种情况,我们通常需要做一些防御性的措施:

  1. const isShowReviews = clazz && clazz.top_reviews && clazz.top_reviews.length > 0;

这种写法虽然能够保证页面不会报错,但是写法非常的麻烦,目前只有两层,如果访问对象的属性有很多层,且不是要写长长的一串。
可选链操作符 ?. 就是可以简化上面的写法:

  1. const isShowReviews = clazz?.top_reviews?.length > 0;

可选链操作符 ?. 允许轻松访问嵌套对象的属性,而不必明确验证链中的每个引用是否有效,在引用为 nullish value 的情况下不会引起错误,而是返回 undefined

Default with nullish coalescing operator

空值合并运算符 ?? 处理 undefinednull,并将它们置为特定值。

  1. const undefinedValue = undefined;
  2. const nullValue = null;
  3. const value = 'Hello';
  4. undefinedValue ?? 'Nothing'; // => 'Nothing'
  5. nullValue ?? 'Nothing'; // => 'Nothing'
  6. value ?? 'Nothing'; // => 'Hello'

因为 可选链操作符?. 在发生短路时会返回 undefined,因此可以借助 空值合并运算符 ?? 为其默认值:

  1. const starRating = teacher?.star_rating ?? 4;

polyfill

可选链操作符和空值合并运算符是比较新的语法,使用的时候一定要做polyfill,尤其在手机浏览器上,否则会报错导致页面空白。

  1. // npm
  2. npm install @babel/plugin-proposal-optional-chaining --save-dev
  3. npm install @babel/plugin-proposal-nullish-coalescing-operator --save-dev
  4. // babel.config.js
  5. plugins: [
  6. "@babel/plugin-proposal-nullish-coalescing-operator",
  7. "@babel/plugin-proposal-optional-chaining",
  8. ],

注:vue template模板里面不能使用可选链操作符和空值合并运算符号,即使做了polyfill

参考文献
tc39/proposal-optional-chaining
可选链操作符- JavaScript | MDN
How to Use JavaScript Optional Chaining