jQuery .হাস ক্লাস () বনাম .আইএস ()


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
আপনার কাছে প্রমাণ আছে যে এটি দ্রুত? কোনও ফাংশনটিতে কম ফান্টিশিয়ালিটি থাকার কারণে এটি স্বয়ংক্রিয়ভাবে দ্রুত হয় না।
ক্রিস

15
@ ক্রিস: হ্যাঁ আমি করি: jsperf.com/hasclass-vs-is-so । আমি আগেই বলেছি, hasClass হয় আরো অনেক দ্রুত।
সরফরাজ

4
'অনেক বেশি দ্রুত' => 'আরও দ্রুত'
কर्क স্ট্রোবেক

@ এসজিটিপুকি, আমি কেবল প্রমাণ চাইছিলাম; যদি এটি সত্য হয় আমি কেন জানতে চেয়েছিলাম। আমি যেমন জিজ্ঞাসাবাদী :)। আপনার সহজে আরও কার্যকারিতা থাকতে পারে এবং এটি দ্রুত হতে পারে; এটি সর্বদা বাস্তবায়নের উপর নির্ভর করে। আপনার 99% হ'ল একটি সুস্পষ্ট সাধারণীকরণ এবং এটি সফ্টওয়্যার বিকাশের সত্যিকারের অবস্থা নয়। আপনার "প্রশ্ন jQuery কখনও কখনও সরাসরি জাভাস্ক্রিপ্ট হিসাবে দ্রুত হবে? না ছাড়া অন্য একটি উত্তর ভুল।" একটি ভাল প্রশ্ন নয়; jQuery এর আসলে অনেকগুলি অপ্টিমাইজেশন রয়েছে যার মধ্যে একবার ডেটা ক্যাশে হয়ে যাওয়ার পরে DOM উপাদানগুলিতে দ্রুত অ্যাক্সেস সরবরাহ করা হবে; এটি আপনার নির্দিষ্ট ব্যবহারের উপর নির্ভর করে।
ক্রিস

4
@ এসজিটিপুকি যত দ্রুত গতিতে সিজল সিলেক্টর ইঞ্জিনটি দেখুন; যেহেতু আমি এটি উল্লেখ করতেই থাকি এটি বাস্তবায়নের উপর নির্ভর করে এবং পুরানো ব্রাউজারগুলিতে যা স্থানীয়ভাবে প্রশ্নগুলি সমর্থন করে না এটি সম্ভবত জাভিউরির প্রয়োগের মাধ্যমে দ্রুততর হবে কারণ কোনও নেটিভ সংস্করণ নেই (ডিফল্টরূপে জিতে)। এছাড়াও আপনি যদি ব্রাউজার এবং সংস্করণের উপর নির্ভর করে একই ডিওএম উপাদানগুলি স্মরণ করতে অব্যাহত থাকেন তবে জিকুয়েরি দ্রুত পুনরুদ্ধারের জন্য এই উপাদানটিকে ক্যাশে করতে পারে এমন অতিরিক্ত সময় নিতে পারে। সাধারণত নেটিভ জাভাস্ক্রিপ্ট ফাংশন দ্রুত হবে; তবে এটি ব্রাউজার সমর্থন এবং বাস্তবায়নের উপর নির্ভর করে।
ক্রিস

13

যেহেতু সরবরাহকৃত এক্সপ্রেশনটি প্রক্রিয়া করার isচেয়ে বেশি সাধারণ hasClassএবং filterএটি সম্ভবত এটি hasClassদ্রুততর বলে মনে হয়।

আমি ফায়ারব্যাগ কনসোল থেকে নিম্নলিখিত কোডটি চালিয়েছি:

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.663 মিমি
  • হ্যাস: 2362.523 মিমি ব্যবহার করে

কোনও বিশাল পার্থক্য নয়, তবে আপনি যদি প্রচুর পরীক্ষা করে নিচ্ছেন তবে এটি প্রাসঙ্গিক হতে পারে ।

সম্পাদনা করুন যখন আমি বলি 'বিশাল পার্থক্য নয়, আমার বক্তব্যটি হ'ল পার্থক্যটির 0.8s দেখতে আপনার 10000 চক্র করা উচিত। আমি একটি ওয়েব অ্যাপ্লিকেশন দেখতে যেমন যে থেকে সুইচিং অবাক হবো isকরার hasClassসব কর্মক্ষমতা উপর উল্লেখযোগ্য উন্নতি দেখতে হবে। তবে, আমি সম্মতি দিচ্ছি যে এটি গতিতে 35% উন্নতি।


9

উভয়েরই পারফরম্যান্সের দিক দিয়ে খুব কাছাকাছি হওয়া উচিত তবে আমার কাছে এটি $('#foo').hasClass('bar');আরও পাঠযোগ্য এবং শব্দার্থগতভাবে সঠিক বলে মনে হচ্ছে।


7

.hasClassঅনেক দ্রুত চেয়ে .is আপনি থেকে এটা পরীক্ষা করতে পারেন এখানে । আপনার অনুযায়ী পরীক্ষার কেস পরিবর্তন করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.