Является ли более эффективным использование функции find(), а не> для дочернего селектора в jQuery?
В jQuery я подумал, что будет более эффективным найти дочерний DOM с определенным селектором с Реализация 1, как показано ниже:
var $dataTable = $('#' + tabId + ' > div.container > div.dataTableContainer > table.dataTable');
Но один мой друг сказал мне, что это будет более эффективно при использовании
Реализация 2, как показано ниже:
var dataTable = $('#' + tabId).find('table.dataTable');
Ссылка на другой вопрос, я обнаружил, что реализация 2 может быть менее эффективной, чем:
var $dataTable = $('#' + tabId + ' div.container div.dataTableContainer table.dataTable');
Но будет Реализация 2 более эффективной, чем Реализация 1?
Ответы
Ответ 1
document.querySelector()
с прямым селектором потомков >
является самым быстрым, .find()
является самым медленным.
var tabId = "abc";
console.time(".find()");
var $dataTable = $('#' + tabId).find('table.dataTable');
console.timeEnd(".find()");
console.time("jQuery(), >");
var $dataTable = $('#' + tabId + ' > div.container > div.dataTableContainer > table.dataTable');
console.timeEnd("jQuery(), >");
console.time("document.querySelector()");
var $dataTable = document.querySelector('#' + tabId + ' div.container div.dataTableContainer table.dataTable');
console.timeEnd("document.querySelector()");
console.time("document.querySelector(), >");
var $dataTable = document.querySelector('#' + tabId + ' > div.container > div.dataTableContainer > table.dataTable');
console.timeEnd("document.querySelector(), >");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="abc">
<div class="container">
<div class="dataTableContainer">
<table class="dataTable">
<tbody>
<tr>
<td></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
Ответ 2
Мое предположение:
Под капотом $('#XXX whatever')
есть родной document.queryselectorAll()
, который будет проверять все элементы документа, чтобы увидеть, соответствуют ли они < #xxx whatever
'
$('#XXX').find('whatever')
сначала выполняет document.getElementById('XXX')
, находя элемент с id="XXX"
, а затем делает queryselectorAll()
внутри этого элемента, поэтому имеет меньшее количество дочерних элементов для проверки и видит, соответствуют ли они "whatever
"
Но это предположение полностью отрицается реальными данными - см. ответ by @guest271314