có một phương pháp ưa thích để xác định xem một phần tử có được gán một lớp hay không, từ quan điểm hiệu suất?
$('#foo').hasClass('bar');
hoặc là
$('#foo').is('.bar');
có một phương pháp ưa thích để xác định xem một phần tử có được gán một lớp hay không, từ quan điểm hiệu suất?
$('#foo').hasClass('bar');
hoặc là
$('#foo').is('.bar');
Câu trả lời:
Tôi đã thực hiện một bài kiểm tra sau một nhận xét và bốn lượt ủng hộ cho rất nhiều nhận xét. Nó chỉ ra rằng những gì tôi đã nói là câu trả lời chính xác. Đây là kết quả:
http://jsperf.com/hasclass-vs-is-so
Đây is
là mục đích đa năng, ví dụ bạn có thể làm is('.class')
, is(':checked')
v.v. có nghĩa là is
có nhiều việc phải làm hơn ở những nơi hasClass
bị giới hạn, chỉ kiểm tra một lớp có được thiết lập hay không.
Do đó, hasClass
sẽ nhanh hơn nếu hiệu suất ở bất kỳ cấp độ nào là ưu tiên của bạn.
hasClass
là nhanh hơn rất nhiều hơn.
Vì is
là chung chung hơn hasClass
và sử dụng filter
để xử lý biểu thức được cung cấp, nên có vẻ như nó sẽ hasClass
nhanh hơn.
Tôi đã chạy mã sau từ bảng điều khiển 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();
Tôi đã nhận:
Không phải là một sự khác biệt lớn, nhưng có thể có liên quan nếu bạn đang thực hiện nhiều thử nghiệm.
CHỈNH SỬA khi tôi nói 'không phải là một sự khác biệt quá lớn, quan điểm của tôi là bạn cần thực hiện 10000 chu kỳ để thấy 0,8s của sự khác biệt. Tôi sẽ rất ngạc nhiên khi thấy một ứng dụng web mà chuyển từ is
sang hasClass
sẽ thấy sự cải thiện đáng kể về tất cả hiệu suất. Tuy nhiên, tôi cho rằng đây là sự cải thiện 35% về tốc độ.
Cả hai đều khá gần nhau về mặt hiệu suất nhưng $('#foo').hasClass('bar');
có vẻ dễ đọc hơn và chính xác về mặt ngữ nghĩa đối với tôi.