codecamp

@babel/plugin-proposal-optional-chaining

NOTE: This plugin is included in @babel/preset-env, in ES2020

Example

Accessing deeply nested properties

JavaScript

const obj = {
foo: {
bar: {
baz: 42,
},
},
};

const baz = obj?.foo?.bar?.baz; // 42

const safe = obj?.qux?.baz; // undefined

// Optional chaining and normal chaining can be intermixed
obj?.foo.bar?.baz; // Only access `foo` if `obj` exists, and `baz` if
// `bar` exists

// Example usage with bracket notation:
obj?.["foo"]?.bar?.baz; // 42

Calling deeply nested functions

JavaScript

const obj = {
foo: {
bar: {
baz() {
return 42;
},
},
},
};

const baz = obj?.foo?.bar?.baz(); // 42

const safe = obj?.qux?.baz(); // undefined
const safe2 = obj?.foo.bar.qux?.(); // undefined

const willThrow = obj?.foo.bar.qux(); // Error: not a function

// Top function can be called directly, too.
function test() {
return 42;
}
test?.(); // 42

exists?.(); // undefined

Constructing deeply nested classes

JavaScript

const obj = {
foo: {
bar: {
baz: class {
},
},
},
};

const baz = new obj?.foo?.bar?.baz(); // baz instance

const safe = new obj?.qux?.baz(); // undefined
const safe2 = new obj?.foo.bar.qux?.(); // undefined

const willThrow = new obj?.foo.bar.qux(); // Error: not a constructor

// Top classes can be called directly, too.
class Test {
}
new Test?.(); // test instance

new exists?.(); // undefined

Deleting deeply nested properties

Added in: v7.8.0

JavaScript

const obj = {
foo: {
bar: {},
},
};

const ret = delete obj?.foo?.bar?.baz; // true

Installation

  • npm
  • Yarn
  • pnpm
pnpm add --save-dev @babel/plugin-proposal-optional-chaining

Usage

With a configuration file (Recommended)

babel.config.json

{
"plugins": ["@babel/plugin-proposal-optional-chaining"]
}

Via CLI

Shell

babel --plugins @babel/plugin-proposal-optional-chaining script.js

Via Node API

JavaScript

require("@babel/core").transformSync("code", {
plugins: ["@babel/plugin-proposal-optional-chaining"],
});

Options

loose

boolean, defaults to false.

When true, this transform will pretend document.all does not exist, and perform loose equality checks with null instead of strict equality checks against both null and undefined.

⚠️ Consider migrating to the top level noDocumentAll assumption.

babel.config.json

{
"assumptions": {
"noDocumentAll": true
}
}

Example

In

JavaScript

foo?.bar;

Out (noDocumentAll === true)

JavaScript

foo == null ? void 0 : foo.bar;

Out (noDocumentAll === false)

JavaScript

foo === null || foo === void 0 ? void 0 : foo.bar;
You can read more about configuring plugin options here

References


@babel/plugin-proposal-nullish-coalescing-operator
@babel/plugin-syntax-bigint
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Babel 杂项

Babel 工具软件包

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }