
พูดง่ายๆ ก็คือ หากตัวแปรหรืออ็อบเจ็กต์ "ไม่สามารถเข้าถึงได้" ก็ไม่จำเป็นต้องให้ตัวแปรหรืออ็อบเจ็กต์นั้นถูกจัดเก็บไว้ในหน่วยความจำต่อไป และควรนำกลับมาใช้ใหม่
ตัวอย่างเช่น:
ให้ xiaoming = {name:'xiaoming'}//สร้างวัตถุและใช้ตัวแปร xiaoming เพื่ออ้างอิง xiaoming = null //ทำให้ตัวแปร xiaoming ว่างเปล่า ทำให้วัตถุ {name:'xiaoming'} ไม่สามารถเข้าถึงได้//{ name:'xiaoming'} วัตถุถูกรีไซเคิล หากวัตถุถูกอ้างอิงโดยอาร์เรย์และวัตถุอื่น ๆ ตราบใดที่อาร์เรย์และวัตถุที่อ้างอิงนั้นมีอยู่ในอาร์เรย์ วัตถุนั้นจะถือว่าสามารถเข้าถึงได้
วัตถุในอาร์เรย์:
ให้ xiaoming = {name:'xiaoming'}
ให้ arr = [เสี่ยวหมิง]
xiaoming = null //ทำให้ตัวแปร xiaoming ว่างเปล่า //วัตถุ {name:'xiaoming'} จะไม่ถูกปล่อยออกมาเนื่องจากมีอยู่ในอาร์เรย์ ในทำนองเดียวกัน หากเราใช้วัตถุเป็นคีย์ของ Map ถ้ามี Map อยู่ แล้ววัตถุนั้นจะไม่ถูกนำกลับมาใช้ใหม่โดยเครื่องยนต์
วัตถุหลักใน Map :
ให้ xiaoming = {name:'xiaoming'}
ให้ map = new Map()
map.set (เสี่ยวหมิง 'เด็กชาย')
xiaoming = null //ทำให้ตัวแปร xiaoming ว่างเปล่า //วัตถุ {name:'xiaoming'} จะไม่ถูกปล่อยออกมาเนื่องจากเป็นคีย์ของแผนที่ โดยพื้นฐานแล้ว WeapMap จะแตกต่างจาก Map ในการประมวลผลของการปล่อยวัตถุหลัก เพียง , , WeapMap จะไม่ป้องกันการรวบรวมขยะเนื่องจากวัตถุเป็นกุญแจ
ความแตกต่างระหว่าง WeakMap และ Map สามารถแบ่งออกได้เป็น 3 ด้าน คือ
WeakMap สามารถใช้วัตถุเป็นคีย์ได้เท่านั้นให้weakMap = new WeakMap()
ให้ obj = {ชื่อ:'obj'}
อ่อนแอMap.set(obj,'obj เป็นกุญแจ')
อ่อนแอMap.set('str','str as the key')// ผลการดำเนินการโค้ดข้อผิดพลาดเป็นดังนี้:

จะเห็นได้ว่าเมื่อเราใช้ strings เป็น key โปรแกรมจะไม่สามารถทำงานได้ตามปกติ
กล่าวอีกนัยหนึ่งถ้าวัตถุไม่มีการอ้างอิงอื่น ๆ ยกเว้นการอ้างอิง WeakMap จากนั้นระบบจะรีไซเคิลวัตถุนั้น
ตัวอย่างเช่น:
ให้อ่อนแอMap = ใหม่ WeakMap()
ให้ obj = {ชื่อ:'obj'}
อ่อนแอMap.set(obj,'obj เป็นกุญแจ')
obj = null //ทำให้ตัวแปร obj ว่างเปล่า //ในขณะนี้ วัตถุ {name:'obj'} จะถูกรีไซเคิล WeakMap รองรับวิธีการที่จำกัดWeakMap ไม่รองรับการวนซ้ำWeakMap ไม่รองรับ keys()WeakMap ไม่รองรับ values()WeakMap ไม่รองรับ entires()ดังนั้นเราจึงไม่มีทางรับคู่คีย์-ค่าทั้งหมดได้
WeakMap สามารถใช้วิธีการต่อไปนี้เท่านั้น:
weakMap.get(key) รับคู่คีย์-ค่าweakMap.set(key,val) ตั้งค่าคู่คีย์-ค่าweakMap.delete(key) ลบคู่คีย์-ค่าweakMap.has(key) ตรวจสอบว่ามีอยู่จริงหรือไม่ ต้องจำกัดวิธีการเข้าถึงข้อมูลของ WeakMap เนื่องจากไม่สามารถกำหนดเวลาของเอ็นจิ้น JavaScript ที่ปล่อยออบเจ็กต์ได้
เมื่อวัตถุสูญเสียการอ้างอิงทั้งหมด กลไก JavaScript อาจปล่อยพื้นที่ที่วัตถุครอบครองทันที หรืออาจรอสักครู่
ดังนั้น ณ เวลาหนึ่ง จึงไม่สามารถระบุจำนวนองค์ประกอบของ WeakMap ได้ (ลองนึกภาพว่า ถ้าเราสำรวจองค์ประกอบของ WeakMap หลังจากที่วัตถุสูญเสียการอ้างอิงทั้งหมด เราอาจได้รับผลลัพธ์ที่แตกต่างกัน)
สถานการณ์การใช้งานของ WeakMap มักจะเก็บข้อมูลที่ "เป็น" ของวัตถุ เมื่อมีข้อมูล "ที่เป็น" ของออบเจ็กต์นี้ควรได้รับการเผยแพร่ด้วย
มีเรื่องราวทางประวัติศาสตร์ที่เหมาะมากสำหรับการใช้ WeakMap`: "กระต่ายเจ้าเล่ห์ตาย ขี้ข้าสุกแล้ว นกหายไป และธนูที่ดีก็ซ่อนอยู่"
หากเราอธิบายเรื่องราวนี้ด้วยโค้ด JavaScript เราควรใช้ WeakMap :
ให้weakMap = new WeakMap()
ให้กระต่าย = {ชื่อ:'rabbit'} // กระต่ายเจ้าเล่ห์ ให้ runDog = {ชื่อ: 'runDog'} // สุนัขวิ่ง ให้ flyBird = {ชื่อ: 'flyBird'} // นกบิน ให้ goodBow = {ชื่อ :'goodBow'} //เหลียงกงweakMap.set(rabbit,runDog)
อ่อนแอMap.set(flyBird,goodBow)
rabbit = null //กระต่ายเจ้าเล่ห์ตาย flyBird = null //นกจากไปแล้ว//อีกไม่นานลูกน้องและธนูที่ดีจะออกอาจจะไม่ทันที // เรื่องนี้บอกเราว่าการเป็น a ไม่มีจุดจบที่ดี ขี้ข้าอาจจะไม่ถูกฆ่าโดยทันที แต่จะถูกฆ่าไม่ช้าก็เร็ว เมื่อเทียบกับ Set Set WeakSet แตกต่างดังต่อไปนี้:
WeakSet สามารถเพิ่มองค์ประกอบอ็อบเจ็กต์ได้เท่านั้นWeakSet add()WeakSet ป้องกันระบบจากการรีไซเคิลองค์ประกอบadd() , has() , delete()WeakSet ไม่รองรับแอตทริบิวต์ size และเมธอด keys()เราสามารถใช้ WeakMap เพื่อตรวจสอบข้อมูลที่มีอยู่บางส่วน หรือตรวจสอบสถานะ เช่น "ใช่/ไม่ใช่" ตัวอย่างเช่น เราสามารถใช้ WeakMap เพื่อตรวจสอบว่าผู้ใช้ออนไลน์อยู่หรือไม่:
ให้ onlineUser = new WeakMap()
ให้ zhangSan = {ชื่อ:'Zhang San'}
ให้ ลีซี่ = {ชื่อ:'李思'}
ให้ wangEr = {ชื่อ:'王二'}
ให้ maZi = {ชื่อ:'Mazi'}
ฟังก์ชั่นเข้าสู่ระบบ (ผู้ใช้) {
-
onlineUser.add(ผู้ใช้)
-
//ตรวจสอบว่าผู้ใช้ออนไลน์อยู่หรือไม่ ฟังก์ชัน isOnline(user){
ส่งคืน onlineUser.has (ผู้ใช้)
} ข้อจำกัดของ WeakMap และ WeakSet คือไม่สามารถวนซ้ำและรับองค์ประกอบทั้งหมดในคราวเดียว ซึ่งไม่ส่งผลกระทบต่อบทบาทที่สำคัญในตำแหน่งที่สำคัญมาก
WeakMap สามารถใช้วัตถุเป็นคีย์เท่านั้น เมื่อการอ้างอิงภายนอกทั้งหมดไปยังคีย์หายไป (ไม่มีตัวแปรอื่น ๆ ยกเว้น WeakMap อ้างถึงวัตถุคีย์) WeakMap จะไม่ป้องกันกลไกจากการรีไซเคิลค่าคีย์ เมื่อรีไซเคิลแล้ว องค์ประกอบที่เกี่ยวข้องของ WeakMap จะไม่มีอยู่อีกต่อไปWeakSet สามารถจัดเก็บได้เฉพาะวัตถุเท่านั้น เมื่อองค์ประกอบวัตถุสูญเสียการอ้างอิงภายนอกทั้งหมด (ยกเว้น WeakSet จะไม่มีตัวแปรอื่นอ้างอิงถึงวัตถุองค์ประกอบ) WeakSet จะไม่ป้องกันกลไกจากการรีไซเคิลองค์ประกอบ เมื่อรีไซเคิลแล้ว องค์ประกอบที่เกี่ยวข้องใน WeakSet จะหายไปclear() , size , keys() values()WeakMap และ WeakSet มักจะใช้เพื่อจัดเก็บโครงสร้างข้อมูลที่เกี่ยวข้องกับวัตถุ "main" เมื่อวัตถุ "main" สูญเสียความหมายไป โครงสร้างข้อมูลที่เกี่ยวข้องจะถูกลบออกตามธรรมชาติ