หลายครั้งที่ฉันใช้match
ฟังก์ชันสตริงเพื่อทราบว่าสตริงตรงกับนิพจน์ทั่วไปหรือไม่
if(str.match(/{regex}/))
มีความแตกต่างระหว่างสิ่งนี้หรือไม่:
if (/{regex}/.test(str))
พวกเขาดูเหมือนจะให้ผลลัพธ์เดียวกัน
หลายครั้งที่ฉันใช้match
ฟังก์ชันสตริงเพื่อทราบว่าสตริงตรงกับนิพจน์ทั่วไปหรือไม่
if(str.match(/{regex}/))
มีความแตกต่างระหว่างสิ่งนี้หรือไม่:
if (/{regex}/.test(str))
พวกเขาดูเหมือนจะให้ผลลัพธ์เดียวกัน
คำตอบ:
ก่อนอื่นเรามาดูกันว่าแต่ละฟังก์ชั่นทำอะไร:
regexObject ทดสอบ ( สตริง )
ดำเนินการค้นหาการจับคู่ระหว่างการแสดงออกปกติและสตริงที่ระบุ ผลตอบแทนจริงหรือเท็จ
เชือก จับคู่ ( RegExp )
ใช้เพื่อดึงข้อมูลการแข่งขันเมื่อจับคู่สตริงกับนิพจน์ทั่วไป ส่งกลับอาร์เรย์ด้วยการจับคู่หรือ
null
ถ้าไม่มี
เนื่องจากnull
ประเมินfalse
,
if ( string.match(regex) ) {
// There was a match.
} else {
// No match.
}
มีความแตกต่างเกี่ยวกับประสิทธิภาพหรือไม่
ใช่แล้ว ฉันพบบันทึกย่อนี้ในเว็บไซต์ MDN :
หากคุณต้องการทราบว่าสตริงตรงกับนิพจน์ปกติ regexp หรือไม่ให้ใช้ regexp.test (สตริง)
ความแตกต่างสำคัญหรือไม่
คำตอบอีกครั้งคือใช่ ! jsPerfนี้ที่ฉันรวบรวมไว้แสดงความแตกต่างคือ ~ 30% - ~ 60%ขึ้นอยู่กับเบราว์เซอร์:
ใช้.test
ถ้าคุณต้องการการตรวจสอบบูลีนที่เร็วขึ้น ใช้.match
เพื่อดึงข้อมูลการแข่งขันทั้งหมดเมื่อใช้g
ค่าสถานะโกลบอล
.test()
ต่อไป :)
อย่าลืมพิจารณาธงโลกใน regexp ของคุณ:
var reg = /abc/g;
!!'abcdefghi'.match(reg); // => true
!!'abcdefghi'.match(reg); // => true
reg.test('abcdefghi'); // => true
reg.test('abcdefghi'); // => false <=
นี่เป็นเพราะ Regexp ติดตาม lastIndex เมื่อพบการแข่งขันใหม่
.test()
อย่างไร ไม่ใช่จุดที่.test()
จะตรวจสอบว่าสตริงมี regexp ตรงกันหรือไม่
นี่คือผลลัพธ์มาตรฐานของฉัน
ทดสอบ 4,267,740 ops / วินาที± 1.32% (สุ่มตัวอย่าง 60 ครั้ง)
ผู้บริหาร 3,649,719 คน / วินาที± 2.51% (สุ่มตัวอย่าง 60 ครั้ง)
ตรงกับ 3,623,125 ops / วินาที± 1.85% (สุ่มตัวอย่างรัน 62 ครั้ง)
indexOf 6,230,325 ops / วินาที± 0.95% (สุ่มตัวอย่าง 62 ครั้ง)
วิธีการทดสอบนั้นเร็วกว่าวิธีการจับคู่ แต่วิธีที่เร็วที่สุดคือ indexOf