คุณสามารถใช้ลิเทอรัลของออบเจ็กต์เพื่อจัดเก็บคู่คีย์-ค่า และใช้อาร์เรย์ในการจัดเก็บ คอลเล็กชันค่าที่สามารถทำซ้ำได้ ES6 ยังนำเสนอโครงสร้างข้อมูลเฉพาะ เพื่อให้เหมาะกับกรณีการใช้งานที่ละเอียดยิ่งขึ้น: แมปสำหรับคู่คีย์-ค่า และ "Set for" แต่ละค่า
แผนที่
แผนที่เป็นโครงสร้างข้อมูลที่สามารถทำซ้ำได้ ซึ่งจัดเก็บข้อมูลเป็นคู่คีย์-ค่า คล้ายกับลิเทอรัลของออบเจ็กต์ ซึ่งแตกต่างจากลิเทอรัลของออบเจ็กต์ตรงที่แผนที่อนุญาตให้มีทั้ง 2 ค่า และคีย์ในการใส่ข้อมูลประเภทใดก็ได้ และองค์ประกอบลำดับที่ เพิ่มลงในแผนที่จะเป็น เก็บรักษาไว้เมื่อทำซ้ำ
หากต้องการสร้างแผนที่ ให้ใช้ตัวสร้าง Map()
:
const myMap = new Map();
myMap;
> Map(0)
คุณสามารถสร้างข้อมูลในแผนที่ไว้ล่วงหน้าโดยใช้ไวยากรณ์ที่คล้ายกับอาร์เรย์ (หรือ ออบเจ็กต์iterator ทั้งหมด) ที่มี อ็อบเจ็กต์ที่มีลักษณะคล้ายอาร์เรย์ ซึ่งประกอบด้วย 2 องค์ประกอบ องค์ประกอบแรกในแต่ละรายการเหล่านี้ โครงสร้างข้อมูลที่ประกอบด้วย 2 องค์ประกอบ จะกลายเป็นกุญแจสำคัญ ส่วนโครงสร้างที่ 2 จะกลายเป็นค่า ที่เชื่อมโยงกับคีย์นั้น รูปแบบที่ง่ายที่สุดคืออาร์เรย์ใน ซึ่งแต่ละอีลิเมนต์ก็คืออาร์เรย์ที่ประกอบด้วย 2 อีลิเมนต์ คือคีย์และ ค่าขององค์ประกอบที่จะเพิ่มลงในแผนที่:
const myMap = new Map([
[ "myKey", "A string value" ],
[ "mySecondKey", 500 ],
[ "myThirdKey", true ]
]);
myMap;
> Map(3) {'myKey' => 'A string value', 'mySecondKey' => 500, 'myThirdKey' => true}
เช่นเดียวกัน ออบเจ็กต์แผนที่แตกต่างจากลิเทอรัลของออบเจ็กต์ตรงที่ค่าทั้งสอง และคีย์สามารถใช้ประเภทข้อมูลและค่าใดก็ได้ดังนี้
const notAFunction = () => console.log( "function" );
const myMap = new Map([
[ null, 0 ],
[ false, "This is false" ],
[ undefined, "No defined value" ],
[ NaN, "Not a number" ]
]);
myMap;
> Map(4) {null => 0, false => 'This is false', undefined => 'No defined value', NaN => 'Not a number'}
หากต้องการรับ ตั้งค่า หรือลบองค์ประกอบแผนที่ ให้ใช้วิธีการที่รับช่วงมาจาก Map
เครื่องมือสร้าง:
const myMap = new Map();
myMap;
> Map(0)
myMap.set( "myKey", "My value." );
myMap.has( "myKey" );
> true
myMap.get( "myKey" );
"My value."
myMap.delete( "myKey" );
myMap;
> Map(0)
คีย์ใน Maps จะไม่ซ้ำกัน ซึ่งหมายความว่าการตั้งค่าคีย์ที่เหมือนกันจะเขียนทับ คู่คีย์-ค่าที่จัดเก็บไว้ก่อนหน้า:
const myMap = new Map([ [ "myKey", "A string value" ] ]);
myMap.set( "myKey", 500 );
myMap;
> Map(1) {'myKey' => 500}
เช่นเดียวกับวัตถุ คุณสามารถกำหนด Maps ให้กับตัวแปรที่ประกาศด้วย const
และ
แล้วแก้ไขแผนที่นั้น แต่เช่นเดียวกับกรณีการใช้งานอื่นๆ ของ const
คุณไม่สามารถ
แก้ไขหรือลบตัวแปร
const myMap = new Map();
myMap.set( "myKey", "A string value" );
myMap;
> Map(1) {'myKey' => 500}
WeakMap
WeakMap คือแผนที่ที่ “อ่อนแอ" ข้อมูลอ้างอิง ซึ่งต้องอ้างอิงถึงวัตถุหรือสัญลักษณ์ ที่ยังไม่ได้เพิ่มลงในรีจิสทรีสัญลักษณ์ทั่วโลก
หากต้องการสร้าง WeakMap ให้ใช้ตัวสร้าง WeakMap()
:
const myWeakMap = new WeakMap();
myWeakMap;
> WeakMap(0)
ไวยากรณ์ WeakMap คล้ายคลึงกับ Map แต่ WeakMaps ไม่เป็นเช่นนั้น iterable และพยายามใช้ ค่าอื่นนอกเหนือจากออบเจ็กต์หรือสัญลักษณ์เป็นคีย์จะทำให้เกิดข้อผิดพลาดทางไวยากรณ์ เมื่อไม่ การอ้างอิงกับคีย์ที่มีอยู่ นอก WeakMap วัตถุหรือสัญลักษณ์นั้น และค่าที่เกี่ยวข้องใน WeakMap ต่างก็มีสิทธิ์ในการเก็บขยะ
ซึ่งช่วยให้ใช้งานกรณีการใช้งานต่างๆ เช่น การจัดเก็บข้อมูลเมตาที่เชื่อมโยงกับออบเจ็กต์ใน WeakMap โดยใช้การอ้างอิงไปยังออบเจ็กต์เป็นคีย์ หากไม่มีข้อมูลอ้างอิงอื่นๆ อยู่ในออบเจ็กต์นี้ และออบเจ็กต์จะถูกนำออกจากหน่วยความจำ ข้อมูลเมตาก็จะถูกนำออกด้วย
ตั้งค่า
เซตคือคอลเล็กชันซ้ำของค่าที่ไม่ซ้ำกันซึ่งค่อนข้างคล้ายกับอาร์เรย์ แต่ชุดจะมีได้เฉพาะค่าที่ไม่ซ้ำกันเท่านั้น เช่นเดียวกับแผนที่ การทำซ้ำบน ตั้งค่าจะเก็บองค์ประกอบลำดับที่เพิ่มลงไป
หากต้องการสร้างชุด ให้ใช้ตัวสร้าง Set()
:
const mySet = new Set();
mySet;
> Set []
นอกจากนี้คุณยังสร้างชุดจากสัญกรณ์ของอาร์เรย์ได้ด้วย โดยทำดังนี้
const mySet = new Set([ 1, 2, 3 ]);
mySet;
> Set(3) [ 1, 2, 3 ]
เนื่องจากชุดไม่อนุญาตให้มีองค์ประกอบที่ซ้ำกัน เมื่อมีการสร้างชุดจาก ที่มีหลายอินสแตนซ์ที่มีค่าเดียวกัน ฟังก์ชันดังกล่าวจะเก็บไว้เฉพาะ อินสแตนซ์ของค่านั้น:
const mySet = new Set([ 1, 2, 3, 2 ]);
mySet;
> Set(3) [ 1, 2, 3 ]
หากต้องการเพิ่มหรือนำองค์ประกอบออกจากชุด ให้ใช้เมธอดที่รับมาจาก Set
เครื่องมือสร้างขึ้นมา วิธีการเหล่านี้จะดำเนินการกับองค์ประกอบตามค่าขององค์ประกอบ
แทนการอ้างอิงดัชนี:
const mySet = new Set();
mySet.add( "My value." );
mySet;
> Set [ "My value." ]
mySet.has( "My value." );
> true
mySet.delete( "My value." );
mySet;
> Set []
แม้ว่าชุดจะไม่ใช่คอลเล็กชันที่มีการจัดทำดัชนี และไม่ได้มีไว้เพื่อใช้เป็น ดังนั้น องค์ประกอบในชุดจะทำซ้ำ ตามลำดับของการแทรก ความพยายามที่จะเพิ่มค่าองค์ประกอบที่ซ้ำกันในชุด ได้แก่ ข้าม โดยเก็บใบสั่งซื้อการใส่โฆษณาเดิมไว้:
const mySet = new Set([ 1, 2, 3 ]);
mySet;
> Set(3) [ 1, 2, 3 ]
mySet.add( 2 );
> Set(3) [ 1, 2, 3 ]
หากต้องการสร้างอาร์เรย์จากชุด ให้ใช้เมธอด Array.from()
หรือการกระจาย
ไวยากรณ์:
const mySet = new Set([ 1, 2, 3 ]);
const myArray = Array.from( mySet );
myArray;
> Array(3) [ 1, 2, 3 ]
[ ...mySet ];
> Array(3) [ 1, 2, 3 ]
WeakSet
WeakSet เป็นชุดที่มีเฉพาะค่าที่อ่านได้ขยะ เช่น การอ้างอิงวัตถุ หรือสัญลักษณ์ ที่ยังไม่ได้เพิ่มลงในรีจิสทรีสัญลักษณ์ทั่วโลก
หากต้องการสร้าง WeakSet ให้ใช้ตัวสร้าง WeakSet()
:
const myWeakSet = new WeakSet();
myWeakSet;
> WeakSet []
ไวยากรณ์ WeakSet คล้ายกับ Set แม้ว่า WeakSet จะไม่ใช่ iterable และพยายามเพิ่ม ค่าอื่นนอกเหนือจากออบเจ็กต์หรือสัญลักษณ์จะทำให้เกิดข้อผิดพลาดทางไวยากรณ์ เช่นเดียวกับ WeakMap เมื่อไม่มีการอ้างอิงอื่นๆ มีค่าที่ WeakSet อ้างอิงอยู่ ค่าดังกล่าวจะมีสิทธิ์สำหรับ ระบบเก็บขยะ
ซึ่งช่วยให้กรณีการใช้งานต่างๆ เช่น การรวมคอลเล็กชันเดียวที่ทำซ้ำได้ ออบเจ็กต์ที่เกี่ยวข้อง หากไม่มีการอ้างอิงอื่นๆ กับออบเจ็กต์ที่อ้างอิงโดย WeakSet องค์ประกอบที่เกี่ยวข้องจะถูกนำออกจาก WeakSet ด้วย
ตรวจสอบความเข้าใจ
โดยพิจารณาจากสิ่งต่อไปนี้
const myMap = new Map([ [ "myKey", "My string" ] ]); myMap.set( "myKey", 100 );
myMap
จะส่งคืนอะไร
100
undefined
"My string"