Ký hiệu dấu ngoặc đối tượng Javascript ({Điều hướng} =) ở bên trái của phép gán


108

Tôi chưa nhìn thấy cú pháp này trước đây và tôi đang tự hỏi nó là gì.

var { Navigation } = require('react-router');

Các dấu ngoặc ở bên trái đang gây ra lỗi cú pháp:

mã thông báo bất ngờ {

Tôi không chắc phần nào của cấu hình webpack đang chuyển đổi hoặc mục đích của cú pháp là gì. Nó có phải là một điều Hòa hợp? Ai đó có thể khai sáng cho tôi không?


Trong bạn, webpack.config.jsbạn có thể có jsx-loadervới harmonycờ được bật
Paolo Moretti

Câu trả lời:


112

Nó được gọi là phân công cơ cấu lại và nó là một phần của tiêu chuẩn ES2015 .

Cú pháp gán hủy cấu trúc là một biểu thức JavaScript giúp bạn có thể trích xuất dữ liệu từ các mảng hoặc đối tượng bằng cách sử dụng cú pháp phản ánh cấu trúc của các ký tự mảng và đối tượng.

Nguồn: Tham khảo chuyển nhượng cơ cấu trên MDN

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

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

 console.log(p); // 42
 console.log(q); // true 

 // Assign new variable names
 var {p: foo, q: bar} = o;

 console.log(foo); // 42
 console.log(bar); // true

Cấu trúc mảng

var foo = ["one", "two", "three"];

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

// with destructuring
var [one, two, three] = foo;

4
Cảm ơn. Tôi sẽ chấp nhận điều này và đặt ra một câu hỏi khác. Bây giờ tôi biết cú pháp là gì, tôi phải tìm ra những gì nó vẫn chưa được biên dịch trong dự án của tôi.
captainill

Webpack sử dụng Esprima và sẽ hỗ trợ es6 khi Esprima 2.0 được xuất bản . Cho đến lúc đó, bạn có thể sử dụng một trong những trình tải es6 để biên dịch nó thành es5: github.com/conradz/esnext-loader github.com/Couto/6to5-loader github.com/shama/es6-loader
Johannes Ewald

2
Tôi đã từ chối giải pháp này vì nó không giải quyết được ví dụ mà anh ấy đưa ra không được hiển thị trong giải pháp. Ví dụ đầu tiên cho thấy một đối tượng theo nghĩa đen đang bị hủy. Hình thứ hai cho thấy một mảng bị hủy. Nhưng ví dụ đang được hỏi là sau: var {Navigation} = request ('react-router'); Hơn nữa, trong ví dụ anh ấy đưa ra, niềng răng là không cần thiết.
AndroidDev

2
@AndroidDev, bạn có thể đề xuất chỉnh sửa; OP chắc chắn đã tìm thấy câu trả lời thỏa đáng.
Matt Ball

1
Bất kỳ ý tưởng tại sao đặt tên [lại] là "ngược"? Đó là, var {newVarName: oldVarName} = varSource;trông rất giống { newVarName: varSource.oldVarName }hoặc scope.newVarName = varSource.oldVarName;, nhưng đó, rõ ràng là sai. Có lý do thực tế nào để có những cái tên cũ / hiện có ở bên trái :không?
ruffin

114

Đây là nhiệm vụ tái cấu trúc . Đó là một tính năng mới của ECMAScript 2015.

var {
  AppRegistry,
  StyleSheet,
  Text,
  View,
} = React;

Tương đương với:

var AppRegistry = React.AppRegistry;
var StyleSheet = React.StyleSheet;
var Text = React.Text;
var View = React.View;

17
var { Navigation } = require('react-router');

... sử dụng cấu trúc hủy để đạt được điều tương tự như ...

var Navigation = require('react-router').Navigation;

... nhưng dễ đọc hơn nhiều.


3
Điều này trả lời trực tiếp câu hỏi được hỏi và vì vậy có lẽ là câu trả lời tốt nhất để đọc trước, trong khi một số câu trả lời trước đó đi sâu hơn.
Mallory-Erik

3
Ngắn gọn hơn ... có. Dễ đọc hơn - không thực sự. Ví dụ sau rõ ràng hơn bằng cách sử dụng các cấu trúc cơ bản hơn, do đó dễ đọc hơn - nhưng đối với một chuyên gia, cấu trúc trước đây hiệu quả hơn.
Brian

5

Đó là một tính năng mới trong ES6 để phá hủy các đối tượng.

Như chúng ta đều biết rằng có một hoạt động gán diễn ra ở đây, Điều đó có nghĩa là giá trị bên phải đang được gán cho biến bên trái.

var { Navigation } = require('react-router');

Trong trường hợp này, require('react-router')phương thức trả về một đối tượng có cặp giá trị khóa, một số thứ như

{ Navigation: function a(){}, Example1: function b(){}, Example2: function c(){} }.

Và nếu chúng ta muốn lấy một khóa trong đối tượng trả về đó, nói Navigationvới một biến, chúng ta có thể sử dụng đối tượng hủy cho điều đó.

Điều này chỉ có thể thực hiện được nếu chúng ta có chìa khóa hít vào.

Vì vậy, sau câu lệnh gán, biến cục bộ Navigationsẽ chứafunction a(){}

Một ví dụ khác trông như thế này.

var { p, q } = { p: 1, q:2, r:3, s:4 };
console.log(p) //1;
console.log(q) //2;
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.