[]
คืออาร์เรย์
ไม่ได้ใช้อาร์เรย์นี้เลย
.forEach
มันถูกวางไว้บนหน้าเว็บเพราะใช้อาร์เรย์ช่วยให้คุณเข้าถึงต้นแบบอาร์เรย์เช่น
แค่นี้เร็วกว่าพิมพ์ Array.prototype.forEach.call(...);
ถัดไปforEach
เป็นฟังก์ชันที่รับฟังก์ชันเป็นอินพุต ...
[1,2,3].forEach(function (num) { console.log(num); });
... และสำหรับแต่ละองค์ประกอบในthis
(โดยที่this
เหมือนอาร์เรย์ในนั้นมี a length
และคุณสามารถเข้าถึงส่วนต่างๆได้เช่นthis[1]
) มันจะส่งผ่านสามสิ่ง:
- องค์ประกอบในอาร์เรย์
- ดัชนีขององค์ประกอบ (องค์ประกอบที่สามจะผ่านไป
2
)
- การอ้างอิงถึงอาร์เรย์
สุดท้าย.call
คือต้นแบบที่มีฟังก์ชัน (เป็นฟังก์ชันที่เรียกใช้ฟังก์ชันอื่น ๆ )
.call
จะใช้อาร์กิวเมนต์แรกและแทนที่this
ภายในฟังก์ชันปกติด้วยสิ่งที่คุณส่งผ่านcall
เป็นอาร์กิวเมนต์แรก ( undefined
หรือnull
จะใช้window
ใน JS ประจำวันหรือจะเป็นอะไรก็ตามที่คุณผ่านไปหากอยู่ใน "โหมดเข้มงวด") อาร์กิวเมนต์ที่เหลือจะถูกส่งต่อไปยังฟังก์ชันเดิม
[1, 2, 3].forEach.call(["a", "b", "c"], function (item, i, arr) {
console.log(i + ": " + item);
});
ดังนั้นคุณกำลังสร้างวิธีที่รวดเร็วในการเรียกใช้forEach
ฟังก์ชันและคุณกำลังเปลี่ยนthis
จากอาร์เรย์ว่างเป็นรายการ<a>
แท็กทั้งหมดและสำหรับแต่ละ<a>
ลำดับคุณกำลังเรียกใช้ฟังก์ชันที่มีให้
แก้ไข
ข้อสรุปเชิงตรรกะ / การล้างข้อมูล
ด้านล่างนี้มีลิงก์ไปยังบทความที่แนะนำให้เรายกเลิกความพยายามในการเขียนโปรแกรมเชิงฟังก์ชันและยึดติดกับการวนซ้ำแบบอินไลน์ด้วยตนเองทุกครั้งเนื่องจากโซลูชันนี้แฮ็คและไม่น่าดู
ผมว่าในขณะที่.forEach
เป็นประโยชน์น้อยกว่าคู่ของมัน, .map(transformer)
, .filter(predicate)
, .reduce(combiner, initialValue)
ก็ยังคงให้บริการเพื่อวัตถุประสงค์เมื่อสิ่งที่คุณอยากจะทำคือการปรับเปลี่ยนที่อยู่นอกโลก (ไม่อาร์เรย์) n ครั้งในขณะที่มีการเข้าถึงอย่างใดอย่างหนึ่งหรือarr[i]
i
แล้วเราจะจัดการกับความเหลื่อมล้ำได้อย่างไรเนื่องจาก Motto เห็นได้ชัดว่าเป็นผู้ชายที่มีความสามารถและมีความรู้และฉันอยากจะจินตนาการว่าฉันรู้ว่าฉันกำลังทำอะไร / กำลังจะไปที่ไหน (ตอนนี้และแล้ว ... ครั้งเป็นการเรียนรู้ครั้งแรก)?
คำตอบนั้นค่อนข้างง่ายจริง ๆ และมีบางอย่างที่ลุงบ็อบและเซอร์คร็อกฟอร์ดทั้งคู่มองหน้ากันเนื่องจากการกำกับดูแล:
ทำความสะอาดขึ้น
function toArray (arrLike) {
return [].slice.call(arrLike);
}
var checked = toArray(checkboxes).filter(isChecked);
checked.forEach(listValues);
ตอนนี้หากคุณกำลังตั้งคำถามว่าคุณจำเป็นต้องทำสิ่งนี้ด้วยตัวคุณเองหรือไม่คำตอบอาจจะไม่ใช่ ...
สิ่งที่แน่นอนนี้ทำโดย ... ...
หากคุณกำลังใช้ lodash หรือขีดล่างหรือแม้แต่ jQuery พวกเขาทั้งหมดจะมีวิธีการชุดองค์ประกอบและดำเนินการ n-times
หากคุณไม่ได้ใช้สิ่งนั้นก็ให้เขียนของคุณเอง
lib.array = (arrLike, start, end) => [].slice.call(arrLike, start, end);
lib.extend = function (subject) {
var others = lib.array(arguments, 1);
return others.reduce(appendKeys, subject);
};
อัปเดตสำหรับ ES6 (ES2015) และอื่น ๆ
ไม่เพียง แต่วิธีตัวช่วยa slice( )
/ array( )
/ etc จะทำให้ชีวิตง่ายขึ้นสำหรับผู้ที่ต้องการใช้รายการเช่นเดียวกับที่ใช้อาร์เรย์ (เท่าที่ควร) แต่สำหรับผู้ที่มีความหรูหราในการใช้งานเบราว์เซอร์ ES6 + ที่ค่อนข้างใกล้ อนาคตหรือ "การถ่ายทอด" ใน Babel วันนี้คุณมีคุณลักษณะด้านภาษาในตัวซึ่งทำให้สิ่งประเภทนี้ไม่จำเป็น
function countArgs (...allArgs) {
return allArgs.length;
}
function logArgs (...allArgs) {
return allArgs.forEach(arg => console.log(arg));
}
function extend (subject, ...others) { }
var nodeArray = [ ...nodeList1, ...nodeList2 ];
สะอาดมากและมีประโยชน์มาก
เงยหน้าขึ้นมองส่วนที่เหลือและการแพร่กระจายผู้ประกอบการ; ลองใช้งานได้ที่เว็บไซต์ BabelJS หากกองเทคโนโลยีของคุณเป็นไปตามลำดับให้ใช้ในการผลิตกับ Babel และขั้นตอนการสร้าง
ไม่มีเหตุผลที่ดีที่จะไม่สามารถใช้การแปลงจากอาร์เรย์ที่ไม่ใช่อาร์เรย์เป็นอาร์เรย์ ... ... เพียงแค่อย่าทำให้โค้ดของคุณยุ่งเหยิงโดยไม่ทำอะไรเลยนอกจากวางบรรทัดที่น่าเกลียดเดียวกันนั้นทุกที่