微众银行面试小总结

昨天进行微众银行的面试,其中有一个面试题目引起了我的兴趣(恭喜你,成功引起我的兴趣→_→)就是在jquery选择器中$('#div .cls')和$('#div').find('.cls')有什么不同

当时知道这个问题的时候,我是懵逼的,因为我从来没有思考过这个问题,最近用cheerio经常用到find来查找,但是也没有思考过。于是在面试完后查阅API,谷歌只能找到一些比较理论的解释

和同事交流,得出结果是:

    $()选择时返回的是一个jquery对象,而find方法是调用这个对象的方法。

  所以按照这样来说,$()会比find快,如果这个问题就这样完结了那就太没意思了,当时面试回答的是find方法的查询效率会更高(程序员的直觉),但是作为一个科学的程序员,咱们可不能凭直觉说话,刚刚洗澡的时候又想起这个问题,

于是洗完澡赶紧出来手写了个demo,如下:

http://2.danielcv.sinaapp.com/sae/jquerySelectorDemo/index2.html

源码在此:


 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6     <style>
 7         
 8     </style>
 9 </head>
10 <body>
11     <div id='target'>
12         <div id="div">
13             <span class="cls">ddd</span>
14             <span class="cls">ddd</span>
15             <span class="cls">ddd</span>
16         </div>
17     </div>
18     <button value="start" id='startBtn'>start</button>
19     <input type="text" id='result'>
20     <input type="text" id='findRes'>
21     <input type="text" id='test3'>
22     <script src='http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js'></script>
23     <script>
24         $(function(){
25             $('#startBtn').click(function(){
26             var start=(new Date()).getTime();
27             for(var i=0;i<100000;i++){
28                 $('#div .cls').css("background-color",'red');
29             }
30             var end=(new Date()).getTime();
31             $('#result').val(end-start);
32             console.log(end-start);
33 
34             start=(new Date()).getTime();
35             for(var i=0;i<100000;i++){
36                 $('#div').find('.cls').css("background-color",'red');
37             }
38             end=(new Date()).getTime();
39             $('#findRes').val(end-start);
40             console.log(end-start);
41 
42             start=(new Date()).getTime();
43             for(var i=0;i<100000;i++){
44                 $('.cls').css("background-color",'red');
45             }
46             end=(new Date()).getTime();
47             $('#test3').val(end-start);
48             console.log(end-start);
49             })
50         })
51     </script>
52 </body>
53 </html>

 

 

每一次的第一次执行结果,一定是find方法花的时间会比直接查找会少,因此,推翻了之前的那个结论,至于为什么?

我的观点是这样的:

  CSS的选择器的匹配规则是从右到左的,我猜JQUERY也是这样,也就是说比如:

 $('#div .cls')会在dom树中先查找.cls的类,再从这些类中查找其ID为div的节点,因此这样的写法是比较耗时的。

说到这里,你应该懂我的意思了吧?!
好,抱着验证我的观点的想法,我再写了一次代码,就是现在你看到的第三个input框,他是直接查找$('.cls')的结果,数据说话,它所耗费的时间是最短的。
我想,到了这里,似乎可以做一个小总结了,
之前所得的结论并没有错————$()选择时返回的是一个jquery对象,而find方法是调用这个对象的方法。
然而在查找嵌套层次比较深,或者查询次数比较多的情况下find的效率会更高效
然而真正的原因是不是这样呢?!欢迎各位留言或者私信我一起探讨~!
posted @ 2015-11-10 22:19  DanielLam  阅读(1104)  评论(1编辑  收藏  举报