04-querySelector 和 getElementByXXX 的区别

先说总结:

  1. querySelector 获取的是静态集合,且返回的是NodeList,NodeList是包含了注释,换行等节点的信息。
  2. getElementsByXXX 获取的是动态集合,且返回的是HTMLCollection,HTMLCollection只包含元素。
  • 正是因为nodeList是包含所有的节点信息,HTMLCollection只包含元素信息,所以性能上 getElementsByXXX 是要比 querySelector 要高的,但是因为querySelector选择器可以获取类名,标签名,属性原则器,还能像CSS选择器那样连写等等,就很方便,所以现在就非常常用,之前最早是用于移动端,webkit内核这种,IE不兼容,性能虽然比byXXX这种要差一点,但是现在的设备性能完全足够,IE也已经成为历史产物,所以还是以querySelector选择器成为主流。
下面主要说明一下querySelector的静态和getElementsByXXX的动态是什么意思:
<body>
  <ul>
      <li>aaa</li>
      <li>ddd</li>
      <li>ccc</li>
   </ul>
  <ol>
      <li>111</li>
      <li>222</li>
      <li>333</li>
    </ol>
</body>
<script>
  // getElementsByXXX的动态属性的 demo1
  var ul = document.getElementsByTagName("ul")[0];
  var list = ul.getElementsByTagName("li");
  for (var i = 0; i < 3; i++) {  //这里我们写成固定的3
    ul.appendChild(document.createElement("li"));
  }
  // 这时创建了3个新li,添加在ul列表中
  console.log(list.length); // 输出6;
  

  // getElementsByXXX的动态属性的 demo2
    var ul = document.getElementsByTagName("ul")[0];
    var lis = ul.getElementsByTagName("li");
   // 这里循环的中止条件是数组的长度,因为其动态添加的特性,每添加一个数组的长度就会++, 那么循环就一直打不破了。
    for (var i = 0; i < lis.length; i++) {   
      ul.appendChild(document.createElement("li"));
    }
    console.log(lis.length); // 输出不出来,因为死循环了

  // querySelector的静态属性说明的 demo1
    var ul2 = document.querySelector("ol");
    var list2 = ul2.querySelectorAll("li");
    for (var i = 0; i < 3; i++) {
      ul2.appendChild(document.createElement("li"));
    }
    //这时创建了3个新li,添加在ul列表中
    console.log(list2.length); //输出3,输出的是添加前li的数量,而非此时li的总数量6

  // querySelector的静态属性说明的 demo2
    var ul2 = document.querySelector("ol");
    var list2 = ul2.querySelectorAll("li");
    // 这里循环的中止条件也是数组的长度,但是因为li虽然添加了,但是由于li这个集合是静态的,还是原来页面上的三个,所以就不会像上面动态那样造成死循环
    for (var i = 0; i < list2.length; i++) {   
      ul2.appendChild(document.createElement("li"));
    }
    //这时创建了3个新li,添加在ul列表中
    console.log(list2.length); //输出3,输出的是添加前li的数量,而非此时li的总数量6
    // 只有再重新获取一遍才能得到最新的li集合  
    console.log(ul2.querySelectorAll("li").length);
</script>
  • 综上,动态和静态的区别就好像 我们的对象对应一个内存地址,并且把这个内存地址赋值给了另外一个对象,其中一个改变了,内存地址中的值也会发生改变,是联动的。静态的就好像我们的基本数据类型,把值赋值给另外一个变量,另外一个变量改变了值得话,原来得变量得值不会改变。简单点说:动态静态就是一个数据联动与不联动的区别
posted @ 2021-03-04 00:25  猎奇游渔  阅读(57)  评论(0编辑  收藏  举报