Dấu ngoặc nhọn trong câu lệnh `var {…} =…` làm gì?


117

Không chắc liệu đây có phải là cú pháp JS cụ thể của Mozilla hay không, nhưng tôi thường thấy các biến được khai báo theo cách này, chẳng hạn như trong tài liệu SDK bổ trợ :

var { Hotkey } = require("sdk/hotkeys");

và trong chrome Javascript khác nhau ( letcâu lệnh đang được sử dụng thay cho var),

let { classes: Cc, interfaces: Ci, results: Cr, utils: Cu }  = Components;

Tôi thấy nó rất khó hiểu nhưng tôi không thể tìm thấy bất kỳ tài liệu nào về cả hai cú pháp, ngay cả trên MDN .


@Blender Bạn sẽ tìm kiếm cấu trúc này như thế nào trên Symbolhound.com?
trusktr

1
@trusktr: Hơi muộn: Symbolhound.com/…
Máy xay sinh tố

Câu trả lời ngắn gọn là ở đây: stackoverflow.com/a/45909752/203704
Cliff trường

Tôi ổn với giải cấu trúc cơ bản. Tuy nhiên, trong ví dụ này, chúng tôi cũng đang gán giá trị cho một tên thuộc tính khác và cú pháp đó rất khó hiểu. Nó đối lập với cú pháp tạo đối tượng và điều đó càng thêm nhầm lẫn.
Sol

Câu trả lời:


72

Cả hai đều là các tính năng JavaScript 1.7. Đầu tiên là các biến cấp khối :

letcho phép bạn khai báo các biến, giới hạn phạm vi của nó đối với khối, câu lệnh hoặc biểu thức mà nó được sử dụng. Điều này không giống như vartừ khóa, định nghĩa một biến trên toàn cục hoặc cục bộ cho toàn bộ một hàm bất kể phạm vi khối.

Cái thứ hai được gọi là hủy cấu trúc :

Phép gán hủy cấu trúc giúp bạn có thể trích xuất dữ liệu từ mảng hoặc đối tượng bằng cách sử dụng cú pháp phản ánh việc xây dựng các ký tự mảng và đối tượng.
...
Một điều đặc biệt hữu ích mà bạn có thể làm với việc gán cấu trúc là đọc toàn bộ cấu trúc trong một câu lệnh duy nhất, mặc dù có một số điều thú vị bạn có thể làm với chúng, như được hiển thị trong phần đầy đủ các ví dụ sau.

Đối với những người quen thuộc với Python, nó tương tự như cú pháp này:

>>> a, (b, c) = (1, (2, 3))
>>> a, b, c
(1, 2, 3)

Đoạn mã đầu tiên là viết tắt của:

var {Hotkey: Hotkey} = require("sdk/hotkeys");
// Or
var Hotkey = require("sdk/hotkeys").Hotkey;

Bạn có thể viết lại đoạn mã thứ hai như sau:

let Cc = Components.classes;
let Ci = Components.interfaces;
let Cr = Components.results;
let Cu = Components.utils;

2
Từ thử nghiệm của tôi, có vẻ như var { Hotkey }tương đương với var { Hotkey: Hotkey }. Cảm ơn bạn đã tìm thấy tài liệu!
timdream

@timdream: Tôi đã có cảm giác nó giống như vậy, nhưng nó khác với var Hotkey = require(...).Hotkeycái gì? Hay là nó chỉ lưu các lần gõ phím?
Máy xay sinh tố

trông giống như vậy: - / (hehehe, các lập trình viên lười biếng ...)
timdream

2
Thêm vào đó, nó làm cho mọi thứ trở nên khó hiểu hơn khi sử dụng một cú pháp không phổ biến như vậy.
trusktr

Điều thứ hai là "Object Destructuring", refere để developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
IcyBrk

80

Những gì bạn đang xem là một nhiệm vụ tái cấu trúc. Đó là một dạng đối sánh mô hình như trong Haskell.

Sử dụng phép gán cấu trúc cơ cấu, bạn có thể trích xuất các giá trị từ các đối tượng và mảng và gán chúng cho các biến mới được khai báo bằng cách sử dụng cú pháp của đối tượng và mảng. Điều này làm cho mã ngắn gọn hơn nhiều.

Ví dụ:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var {a, b, c} = ascii;

Đoạn mã trên tương đương với:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var a = ascii.a;
var b = ascii.b;
var c = ascii.c;

Tương tự cho các mảng:

var ascii = [97, 98, 99];

var [a, b, c] = ascii;

Điều này tương đương với:

var ascii = [97, 98, 99];

var a = ascii[0];
var b = ascii[1];
var c = ascii[2];

Bạn cũng có thể trích xuất và đổi tên một thuộc tính đối tượng như sau:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var {a: A, b: B, c: C} = ascii;

Điều này tương đương với:

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var A = ascii.a;
var B = ascii.b;
var C = ascii.c;

Thats tất cả để có nó.


12
+1 cho các ví dụ về cấu trúc đối tượng, chúng thực sự hữu ích. Các ví dụ MDN chỉ hiển thị cấu trúc mảng.
Máy xay sinh tố

@Blender - Họ cung cấp các ví dụ về cấu trúc đối tượng. Nhìn vào Vòng lặp qua các giá trị trong một mảng đối tượng .
Aadit M Shah

Ý tôi là var {a, b, c} = ascii;cú pháp.
Máy xay sinh tố

Ví dụ cuối cùng đó thực sự kỳ lạ vì thông thường những gì bên trái dấu hai chấm là những gì đang được gán.
Curtis

1

Đây là một phép gán hủy trong Javascript và là một phần của tiêu chuẩn ES2015. Nó giải nén hoặc trích xuất các giá trị từ mảng hoặc thuộc tính từ các đối tượng thành các biến riêng biệt. Vd: Phá hủy mảng

var foo = ["one", "two", "three"];
//without destructuring
var one = foo[0];
var two = foo[1];
var three = foo[2];

// với hàm hủy var [one, two, three] = foo

Vd: Cấu trúc đối tượng

var o = {p: 42, q: true}; var {p, q} = o;

console.log (p); // 42 console.log (q); // thật

// Gán tên biến mới var {p: foo, q: bar} = o;

console.log (foo); // 42 console.log (bar); // thật


0

Có tài liệu cho lettuyên bố trên MDN: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let

lettương tự như varnó giới hạn phạm vi của biến được khai báo. Nó cho phép bạn khai báo một biến bên trong một if(){}khối (hoặc một số khối khác) và biến đó chỉ "hiển thị" bên trong khối đó (JavaScript, cho đến nay, có phạm vi hàm chứ không có phạm vi khối như hầu hết các ngôn ngữ khác). Vì vậy, letvề cơ bản là một "bản sửa lỗi" cho một cái gì đó mà nhiều người gặp vấn đề. Lưu ý rằng tihs là một tính năng JavaScript 1.7.

Không tìm thấy bất cứ điều gì trên {Foo}.


Xin lỗi, tôi nghĩ rằng bạn đang hỏi về cả hai ... Google-fu của tôi đã làm tôi thất bại khi nói đến {Foo}: /
Jan Hanči

Tôi cũng vậy: - / Google không lập chỉ mục {}.
timdream
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.