è§£æ§
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2016å¹´8æ.
è§£æ§ï¼destructuringï¼èªæ³æ¯ä¸ç¨® JavaScript éç®å¼ï¼å¯ä»¥æé£åæç©ä»¶ä¸çè³æè§£éæ·åæçºç¨ç«è®æ¸ã
å試ä¸ä¸
let a, b, rest;
[a, b] = [10, 20];
console.log(a);
// Expected output: 10
console.log(b);
// Expected output: 20
[a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(rest);
// Expected output: Array [30, 40, 50]
èªæ³
let a, b, rest;
[a, b] = [10, 20];
console.log(a); // 10
console.log(b); // 20
[a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(a); // 10
console.log(b); // 20
console.log(rest); // [30, 40, 50]
({ a, b } = { a: 10, b: 20 });
console.log(a); // 10
console.log(b); // 20
// Stage 4(finished) proposal
({ a, b, ...rest } = { a: 10, b: 20, c: 30, d: 40 });
console.log(a); // 10
console.log(b); // 20
console.log(rest); // {c: 30, d: 40}
æè¿°
ç©ä»¶èé£åéç®å¼æä¾äºç°¡å®çæ¹å¼ï¼å»ºç«ç¹å®çè³æçµã
const x = [1, 2, 3, 4, 5];
è§£æ§ä½¿ç¨é¡ä¼¼èªæ³ï¼ä¸éå¨æå®æè¿°å¼çå·¦å´ï¼è¦å®£åå¾ä¾æºè®æ¸æ¥æ¶è§£éå¼ä¹è®æ¸ã
const x = [1, 2, 3, 4, 5];
const [y, z] = x;
console.log(y); // 1
console.log(z); // 2
Perl å Python 乿é¡ä¼¼çèªæ³ååè½ã
é£åè§£æ§
>åºæ¬è®æ¸æå®æè¿°
const foo = ["one", "two", "three"];
const [red, yellow, green] = foo;
console.log(red); // "one"
console.log(yellow); // "two"
console.log(green); // "three"
宣忿´¾åéæè¿°
è®æ¸å¯ä»¥å¨å®£åå¼å¾ï¼åééè§£æ§ã
let a, b;
[a, b] = [1, 2];
console.log(a); // 1
console.log(b); // 2
é è¨å¼
ç¶è§£æ§ä¾æºé£åå°æçå ç´ æ¯ undefined æï¼è®æ¸å¯ä»¥è¢«è¨å®é è¨å¼ã
let a, b;
[a = 5, b = 7] = [1];
console.log(a); // 1
console.log(b); // 7
è®æ¸äº¤æ
å ©åè®æ¸å¯ä»¥ééä¸åè§£æ§ææ´¾å¼äº¤æã
æ²æè§£æ§ææ´¾å¼æï¼ééè¦ä¸åæ«åè®æ¸ä¾éæï¼æè åæäºä½éèªè¨ç XOR-swap trickï¼ã
let a = 1;
let b = 3;
[a, b] = [b, a];
console.log(a); // 3
console.log(b); // 1
const arr = [1, 2, 3];
[arr[2], arr[1]] = [arr[1], arr[2]];
console.log(arr); // [1,3,2]
è§£æèªå½å¼åå³çé£å
ä¸ç´ä»¥ä¾å½å¼é½å¯ä»¥åå³é£åï¼èè§£æ§ææ´¾å¼å¯ä»¥è®åå³ç弿´å ç°¡æ½ã
å¨éåä¾åï¼ f() åå³ [1, 2] ï¼æ¥èééä¸åè§£æ§ææ´¾å¼è§£æã
function f() {
return [1, 2];
}
let a, b;
[a, b] = f();
console.log(a); // 1
console.log(b); // 2
å¿½ç¥æäºåå³å¼
ä½ å¯ä»¥å¿½ç¥æäºåå³å¼ï¼
function f() {
return [1, 2, 3];
}
const [a, , b] = f();
console.log(a); // 1
console.log(b); // 3
ç¶ç¶ä½ ä¹å¯ä»¥å¿½ç¥å ¨é¨åå³å¼ï¼
[, ,] = f();
æç©é£å©é¤é¨åè§£æ§å°ä¸åè®æ¸
è§£æ§ä¸åé£åæï¼ä½ å¯ä»¥ééå ¶é¤å ç´ ï¼rest patternï¼å°ä¾æºå©ä¸ä¹å ç´ ææ´¾å°ä¸åè®æ¸ï¼
const [a, ...b] = [1, 2, 3];
console.log(a); // 1
console.log(b); // [2, 3]
è¦æ³¨æçæ¯ï¼ç¶å·¦éå½å¼è£¡ä½¿ç¨å
¶é¤è§£æ§ï¼åæä½¿ç¨çµå°¾éèï¼é樣ææåºä¾å¤ SyntaxError :
const [a, ...b,] = [1, 2, 3];
// SyntaxError èªæ³é¯èª¤: å
¶é¤å
ç´ ä¸å¯ä»¥è·é¨çµå°¾éè
// éè¦æå
¶é¤éç®åæ¾å¨æå¾çå
ç´
徿£åéç®å¼çæ¯å°çµæåå¼
ç¶æ£åéç®å¼çæ¹æ³ exec() æ¯å°å°ä¸åå¼ï¼å
¶åå³é£åä¸ç第ä¸å弿¯ç¸ç¬¦ç宿´å串ï¼å¾ç¸¾ç忝æ¯å°å°æ£åéç®å¼æ¯çµæ¬èå
§çé¨åãç¶ä½ æ²éè¦å©ç¨ç¬¬ä¸å宿´æ¯å°çµææï¼è§£æ§ææ´¾å¼è®ä½ æ´ç°¡å®çååºå¾ç¸¾å
ç´ ã
function parseProtocol(url) {
const parsedURL = /^(\w+)\:\/\/([^\/]+)\/(.*)$/.exec(url);
if (!parsedURL) {
return false;
}
console.log(parsedURL); // ["https://developer.mozilla.org/en-US/Web/JavaScript", "https", "developer.mozilla.org", "en-US/Web/JavaScript"]
const [, protocol, fullhost, fullpath] = parsedURL;
return protocol;
}
console.log(
parseProtocol("https://developer.mozilla.org/en-US/Web/JavaScript"),
); // "https"
ç©ä»¶è§£æ§
>åºæ¬ææ´¾å¼
const o = { p: 42, q: true };
const { p, q } = o;
console.log(p); // 42
console.log(q); // true
ç¡å®£åææ´¾
è®æ¸å¯ä»¥å¨å®£åå¼å¾ï¼åééè§£æ§é²è¡ææ´¾ã
let a, b;
({ a, b } = { a: 1, b: 2 });
å註ï¼ç¶éå°ç©ä»¶é²è¡è§£æ§ï¼è該å¥å¼æ²æé²è¡å®£åæï¼ææ´¾å¼å¤å¿
é å 䏿¬è ( ... ) ã
{a, b} = {a: 1, b: 2} 䏿¯ææçç¨ç«èªæ³ï¼å çºå·¦éç {a, b} 被è¦çºç¨å¼ç¢¼åå¡èéç©ä»¶ã
ç¶èï¼({a, b} = {a: 1, b: 2}) æ¯ææçï¼å¦å const {a, b} = {a: 1, b: 2}
( ... ) 表éå¼åå¥éè¦ä»¥åèçµæï¼å¦åå¯è½æä¸ä¸å¥è¦çºå½å¼é¨å³å·è¡ã
ææ´¾å°æ°çè®æ¸å稱
ç©ä»¶ä¸ç屬æ§å¯ä»¥è§£æ§ä¸¦æ·åå°å稱è·è©²å±¬æ§ä¸ä¸æ¨£çè®æ¸ã
const o = { p: 42, q: true };
const { p: foo, q: bar } = o;
console.log(foo); // 42
console.log(bar); // true
èä¾ä¾èªªï¼ const {p: foo} = o æç©ä»¶ o 裡åçº p ç屬æ§è§£åºä¸¦ææ´¾å°ä¸ååçº foo çæ¬å°è®æ¸ã
é è¨å¼
ç¶è§£æ§ç©ä»¶ä¸å°æç弿¯ undefined æï¼è®æ¸å¯ä»¥è¨å®é è¨å¼ã
const { a = 10, b = 5 } = { a: 3 };
console.log(a); // 3
console.log(b); // 5
æå®æ°çè®æ¸å稱åé è¨å¼
å±¬æ§ 1) å¯ä»¥å¾ç©ä»¶ä¸è¢«è§£éï¼ä¸è¢«æå®ä¸åä¸åå稱çè®æ¸å 2) åææå®ä¸åé è¨å¼ï¼å¨è§£éçå¼çº undefined æä½¿ç¨ã
const { a: aa = 10, b: bb = 5 } = { a: 3 };
console.log(aa); // 3
console.log(bb); // 5
å¾ä½çºå½å¼åæ¸çç©ä»¶ä¸æåºæå±¬æ§çå¼
const user = {
id: 42,
displayName: "jdoe",
fullName: {
firstName: "John",
lastName: "Doe",
},
};
function userId({ id }) {
return id;
}
function whois({ displayName, fullName: { firstName: name } }) {
return `${displayName} is ${name}`;
}
console.log(userId(user)); // 42
console.log(whois(user)); // "jdoe is John"
鿍£å¾ user ç©ä»¶ä¸æåºäº id, displayName å firstName 並ä¸å°åºã
è¨å®å½å¼åæ¸çé è¨å¼
function drawChart({
size = "big",
coords = { x: 0, y: 0 },
radius = 25,
} = {}) {
console.log(size, coords, radius);
// do some chart drawing
}
drawChart({
coords: { x: 18, y: 30 },
radius: 30,
});
å註ï¼å¨ä¸è¿°å½å¼ drawChart ä¸ï¼å·¦æ¹ä¹è§£æ§å¼è¢«ææ´¾å°ä¸å空ç©ä»¶: {size = 'big', coords = {x: 0, y: 0}, radius = 25} = {} ãä½ ä¹å¯ä»¥ç¥é填坫峿¹çææ´¾å¼ãä¸éï¼ç¶ä½ æ²æä½¿ç¨å³æ¹ææ´¾å¼æï¼å½å¼å¨å¼å«æææ¾åºæå°ä¸å忏ãééä¸è¿°å½¢å¼ï¼ä½ å¯ä»¥ç´æ¥ä¸ä½¿ç¨åæ¸çå¼å« drawChart() ãç¶ä½ 叿å¨å¼å«éåå½å¼æä¸å³é忏ï¼éåè¨è¨æå¸¶ä¾æ¹ä¾¿ãèå¦ä¸åè¨è¨åè½è®ä½ 確ä¿å½å¼å¿
é å³ä¸ä¸åç©ä»¶ä½çºåæ¸ã
å·¢çç©ä»¶æé£åçè§£æ§
const metadata = {
title: "Scratchpad",
translations: [
{
locale: "de",
localization_tags: [],
last_edit: "2014-04-14T08:43:37",
url: "/de/docs/Tools/Scratchpad",
title: "JavaScript-Umgebung",
},
],
url: "/zh-TW/docs/Tools/Scratchpad",
};
let {
title: englishTitle, // rename
translations: [
{
title: localeTitle, // rename
},
],
} = metadata;
console.log(englishTitle); // "Scratchpad"
console.log(localeTitle); // "JavaScript-Umgebung"
循ç°ååºçè§£æ§
const people = [
{
name: "Mike Smith",
family: {
mother: "Jane Smith",
father: "Harry Smith",
sister: "Samantha Smith",
},
age: 35,
},
{
name: "Tom Jones",
family: {
mother: "Norah Jones",
father: "Richard Jones",
brother: "Howard Jones",
},
age: 25,
},
];
for (const {
name: n,
family: { father: f },
} of people) {
console.log("Name: " + n + ", Father: " + f);
}
// "Name: Mike Smith, Father: Harry Smith"
// "Name: Tom Jones, Father: Richard Jones"
以ç©ä»¶æ¼ç®å±¬æ§å稱解æ§
ç©ä»¶æ¼ç®å±¬æ§å稱ï¼åæ¯å¨ object literalsï¼å¯ä»¥å¨è§£æ§ææ´¾å¼ä½¿ç¨ã
let key = "z";
let { [key]: foo } = { z: "bar" };
console.log(foo); // "bar"
å¨ç©ä»¶è§£æ§æä½¿ç¨å ¶é¤è®æ¸
ECMAScript ä¸çå ¶é¤/å±é屬æ§å¨ proposal (stage 4) æ°å¢äºå¨è§£æ§å¼å §ä½¿ç¨å ¶é¤ (rest) èªæ³çå®ç¾©ãå ¶é¤å±¬æ§å¯ä»¥æ¶éè§£æ§å¼ä¸æ²ææå®ç屬æ§å¼ã
let { a, b, ...rest } = { a: 10, b: 20, c: 30, d: 40 };
a; // 10
b; // 20
rest; // { c: 30, d: 40 }
ä¸ç¬¦å JavaScript èå¥åç屬æ§å稱
è§£æ§å¯ä»¥ééå¦ä¸å符å JavaScript èå¥åçè®æ¸å稱ä¾è§£åºä¸ç¬¦åèå¥åç屬æ§ã
const foo = { "fizz-buzz": true };
const { "fizz-buzz": fizzBuzz } = foo;
console.log(fizzBuzz); // "true"
æ··å使ç¨ç©é£åç©ä»¶è§£æ§
ç©é£åç©ä»¶è§£æ§å¯ä»¥æ··åé²è¡ãèä¾ä¾èªªï¼ä½ åªéè¦ä½¿ç¨ä¸å props ç©é£ä¸ç¬¬ä¸åå
ç´ ä¹ç©ä»¶ä¸ç name 屬æ§ï¼ä½ å¯ä»¥å¦ä¸é¢çä¾åé²è¡è§£æ§ï¼
const props = [
{ id: 1, name: "Fizz" },
{ id: 2, name: "Buzz" },
{ id: 3, name: "FizzBuzz" },
];
const [, , { name }] = props;
console.log(name); // "FizzBuzz"
ç©ä»¶è§£æ§æçååé追溯
å¨é²è¡ç©ä»¶è§£æ§æï¼å¦æä¸å屬æ§ä¸å¨å ¶ç¶ä¸ååï¼å°æééååé (prototype chain) ä¾é²è¡è¿½æº¯ã
let obj = {self: '123'};
obj.__proto__.prot = '456';
const {self, prot} = obj;
// self "123"
// prot "456"ï¼Access to the prototype chainï¼
è¦ç¯
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-destructuring-assignment> |
| ECMAScript® 2027 Language Specification> # sec-destructuring-binding-patterns> |