สัญลักษณ์วงเล็บวัตถุ Javascript ({การนำทาง} =) ทางด้านซ้ายของการกำหนด


109

ฉันไม่เคยเห็นไวยากรณ์นี้มาก่อนและฉันสงสัยว่ามันเกี่ยวกับอะไร

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

วงเล็บด้านซ้ายแสดงข้อผิดพลาดทางไวยากรณ์:

โทเค็นที่ไม่คาดคิด {

ฉันไม่แน่ใจว่าส่วนใดของการกำหนดค่า webpack กำลังเปลี่ยนแปลงหรือวัตถุประสงค์ของไวยากรณ์คืออะไร มันเป็นความสามัคคี? มีใครสามารถสอนฉันได้บ้าง?


ในของwebpack.config.jsคุณคุณอาจมีjsx-loaderการharmonyเปิดใช้งานธง
Paolo Moretti

คำตอบ:


113

มันเรียกว่าได้รับมอบหมาย destructuringและมันเป็นส่วนหนึ่งของมาตรฐาน ES2015

ไวยากรณ์การกำหนดการทำลายคือนิพจน์ JavaScript ที่ทำให้สามารถดึงข้อมูลจากอาร์เรย์หรืออ็อบเจ็กต์โดยใช้ไวยากรณ์ที่สะท้อนการสร้างอาร์เรย์และอ็อบเจ็กต์ลิเทอรัล

ที่มา: การอ้างอิงการกำหนดโครงสร้างการทำลายบน MDN

การทำลายโครงสร้างวัตถุ

 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

การทำลายโครงสร้างอาร์เรย์

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
ขอบคุณ. ฉันจะยอมรับสิ่งนี้และตั้งคำถามอื่น ตอนนี้ฉันรู้แล้วว่าไวยากรณ์คืออะไรฉันต้องหาว่าอะไรยังไม่ได้รวบรวมในโครงการของฉัน
กัปตันทีม

Webpack ใช้ Esprima และจะมีการสนับสนุน ES6 เมื่อ Esprima 2.0 มีการเผยแพร่ ก่อนหน้านี้คุณสามารถใช้หนึ่งในตัวโหลด es6 ซึ่งรวบรวมลงใน es5: github.com/conradz/esnext-loader github.com/Couto/6to5-loader github.com/shama/es6-loader
Johannes Ewald

2
ฉันลดคะแนนโซลูชันนี้เนื่องจากไม่สามารถจัดการกับตัวอย่างที่เขาให้ไว้ซึ่งไม่ได้แสดงไว้ในโซลูชัน ตัวอย่างแรกแสดงตัวอักษรของวัตถุที่ถูกทำลาย ส่วนที่สองแสดงอาร์เรย์ที่ถูกทำลาย แต่ตัวอย่างที่ถูกตั้งคำถามคือ: var {Navigation} = require ('react-router'); นอกจากนี้ในตัวอย่างที่เขาให้ไว้การจัดฟันนั้นไม่จำเป็น
AndroidDev

2
@AndroidDev ยินดีที่จะแนะนำการแก้ไข ดูเหมือนว่า OP จะพบคำตอบที่น่าพอใจอย่างแน่นอน
Matt Ball

1
มีความคิดว่าทำไมการตั้งชื่อ [re] จึง "ย้อนกลับ" นั่นคือvar {newVarName: oldVarName} = varSource;ดูเหมือนมาก{ newVarName: varSource.oldVarName }หรือscope.newVarName = varSource.oldVarName;แต่เห็นได้ชัดว่าผิด มีเหตุผลที่เป็นประโยชน์สำหรับการมีชื่อเก่า / ที่มีอยู่ทางด้านซ้ายของ:หรือไม่?
ruffin


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

... ใช้การทำลายล้างเพื่อให้บรรลุสิ่งเดียวกับ ...

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

... แต่อ่านได้ไกลกว่า


3
สิ่งนี้ตอบคำถามได้โดยตรงตามที่ถามและอาจเป็นคำตอบที่ดีที่สุดในการอ่านก่อนในขณะที่คำตอบก่อนหน้านี้บางส่วนจะเจาะลึกมากขึ้น
Mallory-Erik

3
กระชับมากขึ้น ... ใช่ อ่านได้มากขึ้น - ไม่จริง ตัวอย่างหลังมีความชัดเจนมากขึ้นโดยใช้โครงสร้างพื้นฐานมากกว่าดังนั้นจึงอ่านได้ง่ายกว่า - แต่สำหรับผู้เชี่ยวชาญในอดีตนั้นมีประสิทธิภาพมากกว่า
Brian

5

เป็นคุณสมบัติใหม่ใน ES6 ในการทำลายโครงสร้างวัตถุ

อย่างที่เราทราบกันดีว่ามีการดำเนินการมอบหมายที่นี่ซึ่งหมายความว่าค่าด้านขวาจะถูกกำหนดให้กับตัวแปรด้านซ้าย

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

ในกรณีนี้require('react-router')วิธีการส่งคืนวัตถุที่มีค่าคีย์จับคู่บางอย่างเช่น

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

และถ้าเราต้องการใช้คีย์หนึ่งในอ็อบเจ็กต์ที่ส่งคืนนั้นพูดNavigationกับตัวแปรเราสามารถใช้Object ทำลายสำหรับสิ่งนั้นได้

สิ่งนี้จะเกิดขึ้นได้ก็ต่อเมื่อเรามีกุญแจอยู่ในมือ

ดังนั้นหลังจากคำสั่งมอบหมายตัวแปรท้องถิ่นNavigationจะมีfunction a(){}

อีกตัวอย่างหนึ่งมีลักษณะเช่นนี้

var { p, q } = { p: 1, q:2, r:3, s:4 };
console.log(p) //1;
console.log(q) //2;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.