ฉันถูกสอนมาตลอดว่าการมีผลข้างเคียงในifสภาพที่ไม่ดี ที่ฉันหมายถึงคือ;
if (conditionThenHandle()) {
// do effectively nothing
}
... ตรงข้ามกับ;
if (condition()) {
handle();
}
... และฉันเข้าใจว่าและเพื่อนร่วมงานของฉันมีความสุขเพราะฉันไม่ได้ทำและเราทุกคนกลับบ้านเวลา 17:00 น. ในวันศุกร์และทุกคนมีวันหยุดสุดสัปดาห์ที่มีความสุข
ตอนนี้ ECMAScript5 แนะนำวิธีการเช่นevery()และsome()เพื่อArrayและฉันพบว่าพวกเขามีประโยชน์มาก พวกมันสะอาดกว่าfor (;;;)ให้ขอบเขตกับคุณและทำให้องค์ประกอบเข้าถึงได้โดยตัวแปร
แต่เมื่อตรวจสอบการป้อนข้อมูลผมมากขึ้นบ่อยกว่าไม่พบตัวเองโดยใช้every/ someอยู่ในสภาพที่จะตรวจสอบการป้อนข้อมูลแล้วใช้every/ some อีกครั้งในร่างกายการแปลงการป้อนข้อมูลในรูปแบบที่ใช้งานได้;
if (input.every(function (that) {
return typeof that === "number";
})) {
input.every(function (that) {
// Model.findById(that); etc
}
} else {
return;
}
... เมื่อสิ่งที่ฉันต้องการจะทำคือ;
if (!input.every(function (that) {
var res = typeof that === "number";
if (res) {
// Model.findById(that); etc.
}
return res;
})) {
return;
}
... ซึ่งทำให้ฉันมีผลข้างเคียงในifเงื่อนไขซึ่งไม่ดี
ในการเปรียบเทียบนี้เป็นรหัสจะดูด้วยเก่าfor (;;;);
for (var i=0;i<input.length;i++) {
var curr = input[i];
if (typeof curr === "number") {
return;
}
// Model.findById(curr); etc.
}
คำถามของฉันคือ:
- นี่เป็นวิธีปฏิบัติที่ไม่ดีอย่างแน่นอนหรือไม่?
- ฉันกำลังใช้ (mis | ab)
someและevery( ฉันควรใช้สิ่งfor(;;;)นี้หรือไม่) - มีแนวทางที่ดีกว่านี้ไหม?
someฉันต้องการทำบางสิ่งกับองค์ประกอบถ้าฉันใช้everyฉันต้องการทำบางสิ่งกับองค์ประกอบทั้งหมดเหล่านั้น ... someและeveryอย่าให้ฉันเข้าถึงข้อมูลนั้นดังนั้นฉันจึงไม่สามารถ ใช้พวกเขาหรือฉันต้องเพิ่มผลข้างเคียง
someในifเงื่อนไขของฉันเพื่อตรวจสอบว่าองค์ประกอบบางอย่างในอาร์เรย์แสดงคุณสมบัติบางอย่าง 9/10 ฉันจำเป็นต้องทำงานกับองค์ประกอบนั้นในifร่างกายของฉัน; ตอนนี้เป็นsomeไม่ได้บอกฉันซึ่งองค์ประกอบการจัดแสดงทรัพย์สิน (เพียงแค่ "ใครทำ") ผมสามารถใช้some อีกครั้งในร่างกาย (O (2n)) หรือฉันก็สามารถดำเนินการได้ภายในถ้าสภาพ ( ซึ่งเป็นสิ่งที่ไม่ดีเพราะมันเป็นผลข้างเคียงที่อยู่ภายในหัว)
everyเช่นกันแน่นอน