EcmaScript 6
หากคุณใช้ ES6 คุณสามารถสร้างอาร์เรย์ของรายการและใช้includes
:
['a', 'b', 'c'].includes('b')
ซึ่งมีประโยชน์โดยธรรมชาติบางกว่าindexOf
เพราะมันถูกต้องสามารถทดสอบสำหรับการปรากฏตัวของNaN
ในรายการและสามารถตรงกับองค์ประกอบมากมายที่ขาดหายไปเช่นหนึ่งกลางในการ[1, , 2]
ยังทำงานบนพิมพ์อาร์เรย์ JavaScriptเช่นundefined
includes
Uint8Array
หากคุณกังวลเกี่ยวกับการสนับสนุนเบราว์เซอร์ (เช่น IE หรือ Edge) คุณสามารถตรวจสอบได้Array.includes
ที่ CanIUse.Comและหากคุณต้องการกำหนดเป้าหมายเบราว์เซอร์หรือเบราว์เซอร์เวอร์ชันที่ขาดหายไปincludes
ฉันแนะนำpolyfill.ioสำหรับ polyfilling
โดยไม่ต้องมีอาร์เรย์
คุณสามารถเพิ่มisInList
คุณสมบัติใหม่ให้กับสตริงได้ดังนี้:
if (!String.prototype.isInList) {
String.prototype.isInList = function() {
let value = this.valueOf();
for (let i = 0, l = arguments.length; i < l; i += 1) {
if (arguments[i] === value) return true;
}
return false;
}
}
จากนั้นใช้งานเช่น:
'fox'.isInList('weasel', 'fox', 'stoat') // true
'fox'.isInList('weasel', 'stoat') // false
คุณสามารถทำสิ่งเดียวกันNumber.prototype
ได้
Array.indexOf
หากคุณใช้เบราว์เซอร์ที่ทันสมัยใช้indexOf
งานได้เสมอ อย่างไรก็ตามสำหรับ IE8 และก่อนหน้านี้คุณจะต้องมี polyfill
หากindexOf
ส่งคืน -1 รายการจะไม่อยู่ในรายการ จะมี แต่สติว่าวิธีการนี้จะไม่ถูกต้องตรวจสอบNaN
และในขณะที่มันสามารถจับคู่ชัดเจนundefined
ก็ไม่สามารถจับคู่เป็นองค์ประกอบที่ขาดหายไปในขณะที่ในอาร์เรย์undefined
[1, , 2]
Polyfill สำหรับindexOf
หรือincludes
ใน IE หรือเบราว์เซอร์ / รุ่นอื่น ๆ ที่ขาดการสนับสนุน
หากคุณไม่ต้องการใช้บริการเช่นpolyfill.ioดังที่ได้กล่าวไว้ข้างต้นคุณสามารถรวมไว้ใน polyfills ที่กำหนดเองตามมาตรฐานซอร์สโค้ดของคุณเอง ยกตัวอย่างเช่น Mozilla indexOf
พัฒนาเครือข่ายมีหนึ่งสำหรับ
ในสถานการณ์นี้ที่ฉันต้องแก้ปัญหาสำหรับ Internet Explorer 7 ฉัน "ย้อนกลับรุ่นของตัวเอง" indexOf()
ฟังก์ชั่นที่ง่ายขึ้นซึ่งไม่ได้มาตรฐาน:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) {
var i = this.length;
while (i--) {
if (this[i] === item) return i;
}
return -1;
}
}
อย่างไรก็ตามฉันไม่คิดว่าการแก้ไขArray.prototype
เป็นคำตอบที่ดีที่สุดในระยะยาว การแก้ไขObject
และArray
ต้นแบบใน JavaScript สามารถนำไปสู่ข้อผิดพลาดร้ายแรง คุณต้องตัดสินใจว่าการทำเช่นนั้นปลอดภัยในสภาพแวดล้อมของคุณหรือไม่ สิ่งสำคัญอันดับแรกคือการวนซ้ำอาร์เรย์ (เมื่อ Array.prototype ได้เพิ่มคุณสมบัติ) ด้วยfor ... in
จะส่งคืนชื่อฟังก์ชันใหม่เป็นหนึ่งในคีย์:
Array.prototype.blah = function() { console.log('blah'); };
let arr = [1, 2, 3];
for (let x in arr) { console.log(x); }
// Result:
0
1
2
blah // Extra member iterated over!
รหัสของคุณอาจใช้งานได้ในขณะนี้ แต่ขณะที่บางคนในอนาคตเพิ่มห้องสมุด JavaScript หรือปลั๊กอินของบุคคลที่สามซึ่งไม่ได้ปกป้องคีย์ที่สืบทอดมาอย่างกระตือรือร้นทุกอย่างสามารถทำลายได้
วิธีการแบบเก่าเพื่อหลีกเลี่ยงความแตกแยกที่อยู่ในระหว่างการนับเพื่อตรวจสอบแต่ละค่าเพื่อดูว่าวัตถุที่จริงมีว่ามันเป็นสถานที่ให้บริการที่ไม่ได้รับการถ่ายทอดด้วยif (arr.hasOwnProperty(x))
และเพียงแล้วx
การทำงานกับ
วิธี ES6 ใหม่เพื่อหลีกเลี่ยงปัญหากุญแจพิเศษนี้คือการใช้of
แทนin
, for (let x of arr)
. อย่างไรก็ตามหากคุณไม่สามารถรับประกันได้ว่ารหัสและห้องสมุดของบุคคลที่สามทั้งหมดของคุณยึดตามวิธีนี้อย่างเคร่งครัดดังนั้นสำหรับวัตถุประสงค์ของคำถามนี้คุณอาจต้องการใช้includes
ตามที่ระบุไว้ข้างต้น