คอลเล็กชันคีย์

คุณสามารถใช้ลิเทอรัลของออบเจ็กต์เพื่อจัดเก็บคู่คีย์-ค่า และใช้อาร์เรย์ในการจัดเก็บ คอลเล็กชันค่าที่สามารถทำซ้ำได้ 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 จะส่งคืนอะไร

undefined
100
"My string"