jQuery .hasClass () เทียบกับ .is ()


96

มีวิธีที่ต้องการในการพิจารณาว่าองค์ประกอบถูกกำหนดคลาสจากมุมมองด้านประสิทธิภาพหรือไม่?

$('#foo').hasClass('bar');

หรือ

$('#foo').is('.bar');

6
คุณสามารถตรวจสอบประสิทธิภาพบนเว็บไซต์นี้ได้ตลอดเวลาผ่านเบราว์เซอร์หลายตัว: jsperf.com ... นี่คือกรณีทดสอบบางส่วนที่จะเรียกดู: jsperf.com/browse
iwasrobbed

คำตอบ:


164

อัปเดต:

ฉันทำแบบทดสอบหลังจากแสดงความคิดเห็นและโหวตโหวตสี่ครั้งเพื่อแสดงความคิดเห็น ปรากฎว่าสิ่งที่ฉันพูดเป็นคำตอบที่ถูกต้อง นี่คือผลลัพธ์:

ป้อนคำอธิบายภาพที่นี่

http://jsperf.com/hasclass-vs-is-so


isเป็นอเนกประสงค์เช่นคุณสามารถทำis('.class'), is(':checked')ฯลฯ ซึ่งหมายความว่าisมีขึ้นจะทำอย่างไรที่จะhasClassถูก จำกัด ซึ่งตรวจสอบเฉพาะสำหรับเป็นชุดชั้นเรียนหรือไม่

ดังนั้นhasClassควรเร็วขึ้นหากประสิทธิภาพในระดับใด ๆ เป็นสิ่งสำคัญของคุณ


7
คุณมีหลักฐานว่าเร็วกว่าหรือไม่? เพียงเพราะฟังก์ชันมีฟังก์ชันการทำงานน้อยไม่ได้หมายความว่าจะเร็วขึ้นโดยอัตโนมัติ
Kris

15
@Kris: ใช่ฉันทำ: jsperf.com/hasclass-vs-is-so อย่างที่บอกhasClass คือเร็วกว่าเยอะ
Sarfraz

4
'เร็วกว่ามาก' => 'เร็วกว่ามาก'
Kirk Strobeck

@SgtPooki ฉันแค่ขอหลักฐาน ถ้ามันเป็นเรื่องจริงฉันอยากรู้ว่าทำไม ฉันอยากรู้อยากเห็นแบบนั้น :) คุณสามารถใช้งานได้ง่ายขึ้นและเร็วขึ้น ขึ้นอยู่กับการนำไปใช้งานเสมอ 99% ของคุณเป็นลักษณะทั่วไปที่ครอบคลุมและไม่จำเป็นต้องเป็นสถานะที่แท้จริงของการพัฒนาซอฟต์แวร์ คำถามของคุณที่ว่า "jQuery จะเร็วเท่ากับ JavaScript ที่ตรงหรือไม่คำตอบอื่นที่ไม่ใช่ไม่ผิด" ไม่ใช่คำถามที่ดี จริงๆแล้ว jQuery มีการเพิ่มประสิทธิภาพมากมายซึ่งจะช่วยให้เข้าถึงองค์ประกอบ DOM ได้เร็วขึ้นเมื่อข้อมูลถูกแคช มันขึ้นอยู่กับการใช้งานเฉพาะของคุณจริงๆ
Kris

1
@SgtPooki เท่าที่เร็วขึ้นลองดูที่เครื่องมือเลือกเสียงดังฉ่า ในขณะที่ฉันยังคงพูดถึงมันขึ้นอยู่กับการใช้งานและในเบราว์เซอร์รุ่นเก่าที่ไม่รองรับการสืบค้นโดยกำเนิดมันมักจะเร็วกว่าผ่านการใช้งานของ jQuery เนื่องจากไม่มีเวอร์ชันเนทีฟ (ชนะโดยค่าเริ่มต้น) นอกจากนี้หากคุณยังคงเรียกคืนองค์ประกอบ DOM เดิมทั้งนี้ขึ้นอยู่กับเบราว์เซอร์และเวอร์ชันอาจต้องใช้เวลาเพิ่มเติมเนื่องจาก jQuery สามารถแคชองค์ประกอบนี้เพื่อให้เรียกค้นได้เร็วขึ้น โดยทั่วไปแล้วฟังก์ชัน JavaScript ดั้งเดิมจะเร็วกว่า แต่ขึ้นอยู่กับการสนับสนุนและการใช้งานเบราว์เซอร์
Kris

13

เนื่องจากisเป็นข้อมูลทั่วไปมากกว่าhasClassและใช้filterในการประมวลผลนิพจน์ที่ให้มาจึงดูเหมือนว่าhasClassจะเร็วกว่า

ฉันรันโค้ดต่อไปนี้จากคอนโซล Firebug:

function usingIs() {
for (var i=0; i<10000;i++) {
 $('div#example-0').is('.test');
}
}

function usingHas(){
for (var i=0; i<10000;i++) {
 $('div#example-0').hasClass('test');
}
}

usingIs();
usingHas();

ฉันได้:

  • กำลังใช้: 3191.663ms
  • การใช้งาน: 2362.523ms

ไม่ใช่ความแตกต่างมากนัก แต่อาจเกี่ยวข้องหากคุณทำการทดสอบจำนวนมาก

แก้ไขเมื่อฉันพูดว่า 'ไม่ใช่ความแตกต่างอย่างมากประเด็นของฉันคือคุณต้องทำ 10,000 รอบเพื่อให้เห็นความแตกต่าง 0.8 วินาที ฉันประหลาดใจที่เห็นเว็บแอปพลิเคชันที่การเปลี่ยนจากisเป็นhasClassจะเห็นการปรับปรุงประสิทธิภาพทั้งหมดอย่างมีนัยสำคัญ อย่างไรก็ตามฉันให้สิทธิ์ว่านี่เป็นการปรับปรุงความเร็ว 35%


9

ทั้งสองอย่างน่าจะใกล้เคียงกันในแง่ของประสิทธิภาพ แต่$('#foo').hasClass('bar');ดูเหมือนว่าจะอ่านได้ง่ายกว่าและถูกต้องตามความหมายสำหรับฉัน


7

.hasClassเร็วกว่า.is คุณสามารถทดสอบได้จากที่นี่ เปลี่ยนกรณีทดสอบตามคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.