jQuery .hasClass () so với .is ()


96

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');

6
Bạn luôn có thể xác thực hiệu suất trên trang web này cũng như trên nhiều trình duyệt: jsperf.com ... Đây là một số trường hợp thử nghiệm để duyệt: jsperf.com/browse
iwasrobbed

Câu trả lời:


164

Cập nhật:

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ả:

nhập mô tả hình ảnh ở đây

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


Đây islà mục đích đa năng, ví dụ bạn có thể làm is('.class'), is(':checked')v.v. có nghĩa là isnhiều việc phải làm hơn ở những nơi hasClassbị giới hạn, chỉ kiểm tra một lớp có được thiết lập hay không.

Do đó, hasClasssẽ nhanh hơn nếu hiệu suất ở bất kỳ cấp độ nào là ưu tiên của bạn.


7
Bạn có bằng chứng rằng nó nhanh hơn không? Chỉ vì một chức năng có ít sai lầm hơn KHÔNG có nghĩa là nó tự động nhanh hơn.
Kris

15
@Kris: Có tôi làm: jsperf.com/hasclass-vs-is-so . Như tôi đã nói, hasClass nhanh hơn rất nhiều hơn.
Sarfraz

4
'rất nhiều nhanh hơn' => 'nhanh hơn nhiều'
Kirk Strobeck

@SgtPooki, tôi chỉ đơn giản là yêu cầu bằng chứng; nếu nó là sự thật, tôi muốn biết tại sao. Tôi đang tò mò như vậy :). Bạn có thể dễ dàng có nhiều chức năng hơn và nhanh hơn; nó luôn phụ thuộc vào việc thực hiện. 99% của bạn là tổng quát hóa sâu rộng và không nhất thiết phải là trạng thái thực sự của phát triển phần mềm. Câu hỏi của bạn về "Liệu jQuery có bao giờ nhanh như JavaScript thông thường không? Một câu trả lời không phải là không là sai." không phải là một câu hỏi hay; jQuery thực sự có nhiều tối ưu hóa trong đó sẽ cung cấp quyền truy cập nhanh hơn vào các phần tử DOM sau khi dữ liệu được lưu vào bộ nhớ đệm; nó thực sự phụ thuộc vào cách sử dụng cụ thể của bạn.
Kris

1
@SgtPooki càng nhanh càng tốt, hãy nhìn vào công cụ bộ chọn nóng hổi; như tôi tiếp tục đề cập, nó phụ thuộc vào việc triển khai và trong các trình duyệt cũ hơn không hỗ trợ các truy vấn, rất có thể sẽ nhanh hơn thông qua triển khai của jQuery vì không có phiên bản gốc (win theo mặc định). Ngoài ra, nếu bạn đang tiếp tục gọi lại các phần tử DOM giống nhau, tùy thuộc vào trình duyệt và phiên bản, có thể mất thêm thời gian khi jQuery có thể lưu vào bộ nhớ cache phần tử này để truy xuất nhanh hơn. Thông thường, các hàm JavaScript gốc sẽ nhanh hơn; nhưng nó phụ thuộc vào sự hỗ trợ và triển khai của trình duyệt.
Kris

13

islà chung chung hơn hasClassvà sử dụng filterđể xử lý biểu thức được cung cấp, nên có vẻ như nó sẽ hasClassnhanh 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:

  • usingIs: 3191.663ms
  • usingHas: 2362.523ms

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ừ issang hasClasssẽ 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 độ.


9

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.


7

.hasClassnhanh hơn nhiều so với .is Bạn có thể kiểm tra nó từ đây . Thay đổi trường hợp kiểm tra theo bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.