Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

อะไรคือความแตกต่างระหว่าง Map และ WeakMap ใน JavaScript?


ความแตกต่างระหว่างแผนที่และจุดอ่อน

กลไกการทำงานของ Map และ WeakMap เหมือนกันแต่มีความแตกต่างกันเล็กน้อย

1) จุดอ่อน ยอมรับเฉพาะวัตถุที่เป็นกุญแจในขณะที่ แผนที่ นอกจากวัตถุแล้ว ยังยอมรับประเภทข้อมูลพื้นฐาน เช่น สตริง ตัวเลข เป็นต้น

2) จุดอ่อน ออบเจ็กต์จะไม่ป้องกันการรวบรวมขยะหากไม่มีการอ้างอิงถึงอ็อบเจ็กต์ที่ทำหน้าที่เหมือนคีย์ ดังนั้นจึงไม่มีวิธีการดึงคีย์ใน WeakMap ในขณะที่อยู่ใน แผนที่ มีวิธีเช่น Map.prototype.keys() เพื่อรับกุญแจ

3) ไม่มีคุณสมบัติขนาดอยู่ใน WeakMap .

แผนที่

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

ตัวอย่าง

<html>
<body>
<script>

// Creates a new Map object
   var map = new Map();    

// Defines an object that will be used a key in the ma                
   var objKey = {name: 'tutorialspoint'};    
   document.write("</br>");

// Adds a new element having a String as its key and a String as its value
   map.set('first', 'a');                    
   document.write("</br>");

// Adds a new element having a Number as its key and an Array as its value
   map.set(3, ['c']);      
   document.write("</br>");

// Adds a new element having an Object as its key and a Number as its value
   map.set(objKey, 3);

// Adds a new element having an Array as its key and a String as its value
   map.set(['add', 'mapping'], 'd');          

// Checks whether an element having a key of "2" exists in the map.
   document.write(map.has(2));
   document.write("</br>");

// Checks whether an element having a key of "first" exists in the map.
   document.write(map.has('first'));
   document.write("</br>");

// Retrieves the element having key of "first". Prints "a"
   document.write(map.get('first'));
   document.write("</br>");

// Retrieves the element having as a key the value of objKey.
   document.write(map.get(objKey));
   document.write("</br>");

// Retrieves the element having key of "empty". Prints "undefined"
   document.write(map.get('empty'));
   document.write("</br>");

// Retrieves the map size. Prints "4"
   document.write(map.size);
   document.write("</br>");

// deletes all the value  
   map.clear();
   document.write(map.size);
</script>
</body>
</html>

ผลลัพธ์

false
true
a
3
undefined
4
0

จุดอ่อน

ในตัวอย่างด้านล่าง เราจะพบว่า WeakMap รับเฉพาะวัตถุแต่ไม่รับค่าดั้งเดิมใดๆ (สตริง, ตัวเลข)

ตัวอย่าง

<html>
<body>
<script>

// Creates a new WeakMap object
   var weakMap = new WeakMap();

// Defines an object that will be used a key in the map
   var obj4 = {d: 4};

// Defines another object that will be used a key in the map
   var obj5 = {e: 5};

// Adds a new element having an Object as its key and a String as its value
   weakMap.set(obj4, 'fourth');

// Adds a new element having an Object as its key and a String as its value
   weakMap.set(obj5, 'fifth');

// Adds a new element having a Function as its key and a Number as its value
   weakMap.set(function(){}, 7);

// Checks whether an element having as its key the value of objKey4 exists in the weak map.
   document.write(weakMap.has(obj4));
   document.write("</br>");

// Retrieve the value of element associated with the key having the value of objKey4. Prints "first"
   document.write(weakMap.get(obj4));
   document.write("</br>");

// Deletes the element having key of objKey4. Prints "true"
   document.write(weakMap.delete(obj4));
   document.write("</br>");

// Deletes all the elements of the weak map
   weakMap.clear();

</script>
</body>
</html>

ผลลัพธ์

true
fourth
true