DOM 是什么

DOM (Document Object Model, 文档对象模型)是文档内容(HTML 或 XML)在编程语言上的抽象模型,它建模了文档的内容和结构,并提供给编程语言一套完整的操作文档的 API。

DOM 提供了一种便捷、高效、可跟踪的文档修改方式。

  1. 在浏览器方面,浏览器首次解析文档时,把文档中的标签解析成一个个节点,整个文档最终形成了一个称为 DOM 树的结构。浏览器再根据 DOM 树去呈现页面。浏览器会跟踪 DOM 树的变化,一旦 DOM 树变化,页面也会做出相应变化。
  2. DOM 节点对象是普通的 JS 对象,有易于操作的方法和属性,这样,在 JS 操作文档就像操作对象一样方便快捷。而且,浏览器会知道你修改了哪个节点,这样,只需要重新渲染被修改影响的局部页面就好了(即发生回流和重绘)。

DOM 组件后来发展成为一套不依托于浏览器和 JS 的规范,提供了一套完整的访问和修改文档的接口,这些 API 在浏览器中被广泛使用。 DOM 标准由 W3C 维护,目前版本 DOM4.

DOM 的两层含义:在浏览器的角度是根据文档建模出来的一个树形模型,即 DOM 树;在编程语言来看,它提供了一套操纵文档的 API。

怎么选择 DOM 节点

document.querySelector()、 document.querySelectorAll();
document.getElementById()、document.getElementByClassName()、document.getElementByTagName();

Java 有哪些集合

Collection 接口是集合类的根接口,Java 中没有提供这个接口的直接的实现类,但是却让其被继承产生了两个接口就是 Set 和 List。Set 中不能包含重复的元素。List 是一个有序的集合,提供了按索引访问的方式;
Map 是 Java.util 中的接口,它和 Collection 接口没有关系,是相互独立的,但是都属于集合类的一部分。
Iterator,所有的集合类都实现了 Iterator 接口,这是一个用于遍历集合中元素的接口,主要包含以下三种方法:

  1. hasNext(): 是否还有下一个元素;
  2. next(): 下一个元素;
  3. remove(): 删除当前元素;

List: ArrayList 和 LinkedList
工作中多用 ArrayList :

  1. 在工作中,遍历的需求比增删多,即便是增加元素,往往也是从尾部插入元素,而 ArrayList 在尾部插入元素也是 O(1);
    ArrayList 增删没有没有想象中慢,ArrayList 的增删底层调用的 copyof() 被优化过,加上现代 CPU对内存可以块操作,普通大小的 ArrayList 增删比 LinkedList 更快;

Set: HashSet、TreeSet、LinkedHashSet
一般开发中最多用到的就是 HashSet。 TreeSet 是可以排序的 Set。在开发中很少管元素插入有序的问题,所以 LinkedHashSet 一般也用不上。

Map: HashMap、LinkedHashMap、TreeMap

ArrayList 与 LinkedList 的区别

  1. 从实现看:
    LinkedList 的底层实现是双链表,ArrayList 的底层实现是动态数组;
  2. 从扩容机制看:
    LinkedList 不存在扩容的说法,因为是链表结构;ArrayList底层是动态数组存在扩容说法,默认的数组大小是10;在检测需要扩容后,如果扩容,会扩容为原来的1.5倍大小。原理就是把老数组的元素存储到新数组里面
  3. 从优点看:
    ArrayList 的查找性能好,因为底层是数组,适用于查找元素;
    LinkedList 底层是双链表,对于插入或者删除元素来说,操作方便,性能高;
  4. 从缺点看:
    ArrayList 是一块连续的内存,所以需要删除或者插入一个元素,那么之前或者之后的元素都需要移动,代价很高;
    LinkedList 是链表,在内存中可以是不连续的,通过指针连接节点,如果要查找元素,必须去遍历整个链表。
    从安全角度来看:
    ArrayList 在单线程环境下是安全的,多线程环境下不是线程安全的,容易造成脏读的问题;
    LinkedList 在单线程环境下是安全的,多线程环境下不是线程安全的,容易造成脏读的问题;

讲一下归并排序

归并排序算法的核心就是“归并”,将两个有序的数列合并,形成更大的有序数组。
归并排序使用的思想是分治思想,将复杂问题分解为两个或者多个规模相同或类似的子问题,然后继续细化,当子问题足够简单,能够被求解,那么复杂的问题也就能够被求解出来。

讲一下快速排序

快速排序使用的是 分治思想,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

讲一下 React 与 Vue 的区别

两侧固定200 px,中间自适应

HTML5 有什么新的特性

  1. 语义标签
  2. 增强型表单
  3. 视频和音频
  4. Canvas 绘图
  5. SVG 绘图
  6. 地理定位
  7. 拖放 API
  8. Web Worker
  9. Web Storage
  10. WebSocket

CSS 的优先级