ได้รับคำตอบแล้ว แต่ฉันแค่อยากให้เค้กชิ้นของฉัน สิ่งที่คุณต้องการบรรลุนั้นเรียกว่าmethod borrowing
ในบริบทของ JS ซึ่งเมื่อเราใช้วิธีการจากวัตถุและเรียกมันในบริบทของวัตถุอื่น เป็นเรื่องปกติที่จะใช้วิธีอาร์เรย์และนำไปใช้กับการขัดแย้ง ผมขอยกตัวอย่างให้คุณ
ดังนั้นเราจึงมีฟังก์ชั่นการแฮ็ช "super" ซึ่งรับสองตัวเลขเป็นอาร์กิวเมนต์และส่งคืนสตริงแฮช "super safe":
function hash() {
return arguments[0]+','+arguments[1];
}
hash(1,2); // "1,2" whoaa
จนถึงตอนนี้ดีมาก แต่เรามีปัญหาเล็กน้อยกับวิธีการข้างต้นมันถูก จำกัด ใช้งานได้กับตัวเลขสองตัวเท่านั้นนั่นไม่ใช่แบบไดนามิกขอให้มันทำงานกับตัวเลขใด ๆ และคุณไม่ต้องผ่านอาร์เรย์ (คุณสามารถ ถ้าคุณยังยืนยัน) โอเคพอคุยกันสู้กัน!
วิธีแก้ปัญหาตามธรรมชาติจะใช้arr.join
วิธี:
function hash() {
return arguments.join();
}
hash(1,2,4,..); // Error: arguments.join is not a function
โอ้มนุษย์ น่าเสียดายที่มันใช้ไม่ได้ เนื่องจากเรากำลังเรียกแฮช (อาร์กิวเมนต์) และวัตถุอาร์กิวเมนต์เป็นทั้ง iterable และ array เหมือน แต่ไม่ใช่อาร์เรย์จริง วิธีการเกี่ยวกับวิธีการด้านล่าง?
function hash() {
return [].join.call(arguments);
}
hash(1,2,3,4); // "1,2,3,4" whoaa
เคล็ดลับที่เรียกว่า method borrowing.
เรายืมjoin
วิธีจากอาร์เรย์ปกติ[].join.
และใช้ในการทำงานในบริบทของ[].join.call
arguments
ทำไมมันทำงาน
นั่นเป็นเพราะอัลกอริทึมภายในของวิธีการเนทิฟarr.join(glue)
นั้นง่ายมาก
นำมาจากข้อมูลจำเพาะเกือบ“ ตามสภาพ”:
Let glue be the first argument or, if no arguments, then a comma ",".
Let result be an empty string.
Append this[0] to result.
Append glue and this[1].
Append glue and this[2].
…Do so until this.length items are glued.
Return result.
ดังนั้นในทางเทคนิคมันต้องใช้สิ่งนี้และเข้าร่วมกับ [0], [1] นี้ ... ฯลฯ พร้อมกัน มันเขียนโดยเจตนาในลักษณะที่อนุญาตให้มีอาเรย์แบบนี้ (ไม่ใช่เรื่องบังเอิญหลายวิธีทำตามแบบฝึกหัดนี้) นั่นเป็นเหตุผลที่มันยังทำงานได้ด้วยthis=arguments.