腾讯面试官:为什么用innerText 替代innerHTML?

90 阅读1分钟

前言

在一次腾讯的面试中,碰到了一道code review 的面试题,题目需要从各方面考虑,指出代码中的不足。
其中有一处纯文本的修改使用了innerHTML,在作答时我写下:将innerHTML 修改为innerText。

面试官问:为什么使用innerText 替代innerHTML?
我答:因为只修改了文本,所以可以使用innerText,它的性能更好、开销更小一些。

这个回答十分笼统,有点知其然不知其所以然的味道,所以今天出这篇文章来对比一下innerHTML 和innerText 。
:本文仅讨论对文本进行修改时,innerHTML 和innerText 的性能表现。

正文

对比

更新innerHTML 时:对文本进行HTML 解析 + 更新DOM + 重排 + 重绘
更新innerText 时:更新DOM + 重排 + 重绘

对于innerHTML 而言,在进行内容更新的时候,它会先对内容进行HTML 解析,然后更新DOM ,并触发重排重绘。
对于innerText 而言,它会直接将内容插入到对应的DOM 中,也就是直接更新DOM,然后触发重排重绘,并不会进行HTML 解析。

我们使用下面代码来进行测试:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="container1">container1</div>
  <div id="container2">container2</div>
  <script>
    console.time(1)
    let div1 = document.getElementById('container1');
    div1.innerHTML = 'Hello World';
    console.timeEnd(1)
    
    console.time(2)
    let div2 = document.getElementById('container2');
    div2.innerText = 'Hello World';
    console.timeEnd(2)
  </script>
</body>
</html>

image.png 可以看到,使用innerText 更新文本性能优于使用innerHTML。

总结

在使用innerHTML 和innerText 更新节点文本的时候,由于innerHTML 需要对内容进行HTML 解析,因此性能开销相对于innerText 来说更大。
因此,在不涉及修改DOM 结构的时候,可以使用innerText 来修改。
最后(其实也可以使用textContent)