บทนำใหม่เกี่ยวกับการทำลายโครงสร้างการมอบหมาย

เผยแพร่แล้ว: 2022-03-10
สรุปโดยย่อ ↬ เบื่อกับการผูกคีย์จำนวนมากพร้อมกับจุดเพื่อเข้าถึงค่าที่ซ้อนกันในวัตถุ? ผิดหวังที่ชื่อ arr[0] ไม่ใช่ชื่อที่สื่อความหมายมากนักหรือ การกำหนดโครงสร้างทำลายล้างมีคุณค่าอย่างไม่น่าเชื่อเมื่อเข้าถึงค่าในอาร์เรย์และอ็อบเจ็กต์ อ่านต่อไปเพื่อเรียนรู้กรณีการใช้งานต่างๆ ที่ไวยากรณ์นี้มีประโยชน์

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

 const response = { status: 200, data: {} } // instead of response.data we get... const {data} = response //now data references the data object directly const objectList = [ { key: 'value' }, { key: 'value' }, { key: 'value' } ] // instead of objectList[0], objectList[1], etc we get... const [obj, obj1, obj2] = objectList // now each object can be referenced directly

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

1. การทำลายล้างแบบซ้อน

ความสามารถในการเข้าถึงคีย์ระดับบนสุดภายในออบเจ็กต์หรือองค์ประกอบแรกของอาร์เรย์นั้นมีประสิทธิภาพ แต่ก็ค่อนข้างจำกัดเช่นกัน มันขจัดความซับซ้อนเพียงระดับเดียวเท่านั้น และเรายังคงลงเอยด้วยชุดของจุดหรือ [0] การอ้างอิงเพื่อเข้าถึงสิ่งที่เราต้องการจริงๆ

ตามที่ปรากฏ การทำลายโครงสร้างสามารถทำงานเกินระดับบนสุด และอาจมีเหตุผลที่ถูกต้องในการทำเช่นนั้น นำตัวอย่างการตอบสนองของอ็อบเจ็กต์นี้จากคำขอ HTTP เราต้องการไปไกลกว่าวัตถุข้อมูลและเข้าถึงเฉพาะผู้ใช้ ตราบใดที่เรารู้กุญแจที่เราต้องการ ก็ไม่เป็นปัญหา

 const response = { status: 200, data: { user: { name: 'Rachel', title: 'Editor in Chief' }, account: {}, company: 'Smashing Magazine' } } const {data: {user}} = response // user is { name: 'Rachel', title: 'Editor in Chief'}

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

 const smashingContributors = [['rachel', ['writer', 'editor', 'reader']], ['laurie', ['writer', 'reader']]] const [[rachel, roles]] = smashingContributors // rachel is 'rachel' // roles is [ 'writer', 'editor', 'reader' ]

โปรดทราบว่าควรใช้คุณลักษณะเหล่านี้อย่างรอบคอบ เช่นเดียวกับเครื่องมืออื่นๆ รับรู้กรณีการใช้งานและผู้ชมของฐานรหัสของคุณ พิจารณาความง่ายในการอ่านและความสะดวกในการเปลี่ยนแปลง ตัวอย่างเช่น หากคุณต้องการเข้าถึงอาร์เรย์ย่อยเท่านั้น แผนที่อาจเหมาะสมกว่า

เพิ่มเติมหลังกระโดด! อ่านต่อด้านล่าง↓

2. การทำลายวัตถุและอาร์เรย์

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

นำตัวอย่างของอาร์เรย์นี้ภายในวัตถุ

 const organization = { users: ['rachel', 'laurie', 'eric', 'suzanne'], name: 'Smashing Magazine', site: 'https://www.smashingmagazine.com/' } const {users:[rachel]} = organization // rachel is 'rachel'

กรณีใช้ตรงข้ามก็ใช้ได้เช่นกัน อาร์เรย์ของวัตถุ

 const users = [{name: 'rachel', title: 'editor'}, {name: 'laurie', title: 'contributor'}] const [{name}] = users // name is 'rachel'

ตามที่ปรากฎ เรามีปัญหาเล็กน้อยในตัวอย่างนี้ เราสามารถเข้าถึงได้เฉพาะชื่อของผู้ใช้รายแรกเท่านั้น มิฉะนั้น เราจะพยายามใช้ 'ชื่อ' เพื่ออ้างอิงสองสตริงที่แตกต่างกัน ซึ่งไม่ถูกต้อง สถานการณ์การทำลายล้างครั้งต่อไปของเราควรแยกแยะออก

3. นามแฝง

ดังที่เราเห็นในตัวอย่างข้างต้น (เมื่อเรามีคีย์ซ้ำภายในวัตถุต่างๆ ที่เราต้องการดึงออกมา) เราไม่สามารถทำได้ในลักษณะ "ทั่วไป" ชื่อตัวแปรไม่สามารถทำซ้ำได้ภายในขอบเขตเดียวกัน (นั่นเป็นวิธีที่ง่ายที่สุดในการอธิบาย เห็นได้ชัดว่าซับซ้อนกว่านั้น)

 const users = [{name: 'rachel', title: 'editor'}, {name: 'laurie', title: 'contributor'}] const [{name: rachel}, {name: laurie}] = users // rachel is 'rachel' and laurie is 'laurie'

นามแฝงใช้ได้กับวัตถุเท่านั้น นั่นเป็นเพราะอาร์เรย์สามารถใช้ชื่อตัวแปรใดก็ได้ที่ผู้พัฒนาเลือก แทนที่จะต้องจับคู่กับคีย์อ็อบเจ็กต์ที่มีอยู่

4. ค่าเริ่มต้น

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

มาดูกันว่ามันทำงานอย่างไรกับวัตถุ

 const user = {name: 'Luke', organization: 'Acme Publishing'} const {name='Brian', role='publisher'} = user // name is Luke // role is publisher

หากคีย์ที่อ้างอิงมีค่าอยู่แล้ว ค่าดีฟอลต์จะถูกละเว้น หากไม่มีคีย์ในอ็อบเจ็กต์ ค่าดีฟอลต์จะถูกใช้

เราสามารถทำสิ่งที่คล้ายกันสำหรับอาร์เรย์ได้

 const roleCounts = [2] const [editors = 1, contributors = 100] = roleCounts // editors is 2 // contributors is 100

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

5. ละเลยค่านิยม

หนึ่งในส่วนที่ดีที่สุดของการทำลายโครงสร้างคือมันช่วยให้คุณเข้าถึงค่าที่เป็นส่วนหนึ่งของโครงสร้างข้อมูลขนาดใหญ่ได้ ซึ่งรวมถึงการแยกค่าเหล่านั้นและละเว้นเนื้อหาที่เหลือ หากคุณเลือก

เราเห็นตัวอย่างของสิ่งนี้ก่อนหน้านี้แล้ว แต่ให้แยกแนวคิดที่เรากำลังพูดถึง

 const user = {name: 'Luke', organization: 'Acme Publishing'} const {name} = user // name is Luke

ในตัวอย่างนี้ เราไม่เคยทำลายโครงสร้าง organization และนั่นก็ไม่เป็นไร ยังคงพร้อมใช้งานสำหรับการอ้างอิงภายในวัตถุ user เช่นนั้น

 user.organization

สำหรับอาร์เรย์ จริงๆ แล้วมีสองวิธีในการ "ละเว้น" องค์ประกอบ ในตัวอย่างอ็อบเจ็กต์ เรากำลังอ้างอิงค่าภายในโดยเฉพาะโดยใช้ชื่อคีย์ที่เกี่ยวข้อง เมื่ออาร์เรย์ถูกทำลาย ชื่อตัวแปรจะถูกกำหนดตามตำแหน่ง เริ่มต้นด้วยการละเว้นองค์ประกอบที่ส่วนท้ายของอาร์เรย์

 const roleCounts = [2, 100, 100000] const [editors, contributors] = roleCounts // editors is 2 // contributors is 100

เราทำลายโครงสร้างองค์ประกอบแรกและองค์ประกอบที่สองในอาร์เรย์ และส่วนที่เหลือไม่เกี่ยวข้อง แต่แล้วองค์ประกอบในภายหลังล่ะ? ถ้าอิงตามตำแหน่ง เราต้องทำลายแต่ละองค์ประกอบจนกว่าจะถึงส่วนที่เราต้องการใช่หรือไม่?

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

 const roleCounts = [2, 100, 100000] const [, contributors, readers] = roleCounts // contributors is 100 // readers is 100000

และเราสามารถทำได้ทั้งสองอย่างพร้อมกัน ข้ามองค์ประกอบทุกที่ที่เราต้องการโดยใช้ตัวแทนจุลภาค และอีกครั้ง เช่นเดียวกับตัวอย่างอ็อบเจ็กต์ อิลิเมนต์ "ละเว้น" ยังคงพร้อมใช้งานสำหรับการอ้างอิงภายในอาร์เรย์ roleCounts

ตัวอย่างวองกี้

พลังและความเก่งกาจของการทำลายโครงสร้างยังหมายความว่าคุณสามารถทำสิ่งที่แปลกประหลาดอย่างแท้จริง ไม่ว่าจะสะดวกหรือไม่ก็พูดยาก แต่ก็คุ้มค่าที่จะรู้ว่ามันเป็นทางเลือก!

ตัวอย่างหนึ่งคือ คุณสามารถใช้การทำลายโครงสร้างเพื่อทำสำเนาแบบตื้นได้

 const obj = {key: 'value', arr: [1,2,3,4]} const {arr, arr: copy} = obj // arr and copy are both [1,2,3,4]

อีกสิ่งหนึ่งที่การทำลายโครงสร้างสามารถใช้สำหรับเป็น dereference

 const obj = {node: {example: 'thing'}} const {node, node: {example}} = obj // node is { example: 'thing' } // example is 'thing'

และเช่นเคย ความสามารถในการอ่านมีความสำคัญสูงสุด และควรใช้ตัวอย่างเหล่านี้ทั้งหมดอย่างเหมาะสม แต่การรู้ตัวเลือกทั้งหมดของคุณจะช่วยให้คุณเลือกสิ่งที่ดีที่สุดได้

บทสรุป

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

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