chenjg88

Results 39 comments of chenjg88

> 没有componentDidUnmount 确实,不过有什么场景不能再 componentWillUnmount 做,必须在 componentDidUnmount 做

> 我的思路是通过判断 indexOf 和 lastIndexOf 的值是否相等来找出只出现一次的数。 > > ```js > function singleNumber(nums) { > return nums.filter( > (num, idx, array) => array.indexOf(num) === array.lastIndexOf(num) > )[0]; > } > ```...

这就不得不介绍(推销)下我的文章了:[你真的了解回流和重绘吗](https://github.com/chenjigeng/blog/issues/4) 原文如下: # 你真的了解回流和重绘吗 回流和重绘可以说是每一个web开发者都经常听到的两个词语,可是可能有很多人不是很清楚这两步具体做了什么事情。最近有空对其进行了一些研究,看了一些博客和书籍,整理了一些内容并且结合一些例子,写了这篇文章,希望可以帮助到大家。 ## 浏览器的渲染过程 本文先从浏览器的渲染过程来从头到尾的讲解一下回流重绘,如果大家想直接看如何减少回流和重绘,优化性能,可以跳到后面。(这个渲染过程来自[MDN](https://developers.google.com/web/fundamentals/performance/critical-rendering-path/render-tree-construction?hl=zh-cn)) ![webkit渲染过程](https://user-gold-cdn.xitu.io/2018/12/10/16798b8db54caa31?w=624&h=289&f=png&s=41057) 从上面这个图上,我们可以看到,浏览器渲染过程如下: 1. 解析HTML,生成DOM树,解析CSS,生成CSSOM树 2. 将DOM树和CSSOM树结合,生成渲染树(Render Tree) 3. Layout(回流):根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小) 4. Painting(重绘):根据渲染树以及回流得到的几何信息,得到节点的绝对像素 5. Display:将像素发送给GPU,展示在页面上。(这一步其实还有很多内容,比如会在GPU将多个合成层合并为同一个层,并展示在页面中。而css3硬件加速的原理则是新建合成层,这里我们不展开,之后有机会会写一篇博客) 渲染过程看起来很简单,让我们来具体了解下每一步具体做了什么。 ### 生成渲染树 ![生成渲染树](https://user-gold-cdn.xitu.io/2018/12/10/16798b8d839a7d6d?w=1150&h=537&f=png&s=34944) 为了构建渲染树,浏览器主要完成了以下工作: 1. 从DOM树的根节点开始遍历每个可见节点。 2. 对于每个可见的节点,找到CSSOM树中对应的规则,并应用它们。...

> > 这就不得不介绍(推销)下我的文章了:[你真的了解回流和重绘吗](https://github.com/chenjigeng/blog/issues/4) > > 原文如下: > > # 你真的了解回流和重绘吗 > > 回流和重绘可以说是每一个web开发者都经常听到的两个词语,可是可能有很多人不是很清楚这两步具体做了什么事情。最近有空对其进行了一些研究,看了一些博客和书籍,整理了一些内容并且结合一些例子,写了这篇文章,希望可以帮助到大家。 > > ## 浏览器的渲染过程 > > 本文先从浏览器的渲染过程来从头到尾的讲解一下回流重绘,如果大家想直接看如何减少回流和重绘,优化性能,可以跳到后面。(这个渲染过程来自[MDN](https://developers.google.com/web/fundamentals/performance/critical-rendering-path/render-tree-construction?hl=zh-cn)) > > ![webkit渲染过程](https://camo.githubusercontent.com/bc1b4024057309bf919e96e7ccdccb39d50fa712/68747470733a2f2f757365722d676f6c642d63646e2e786974752e696f2f323031382f31322f31302f313637393862386462353463616133313f773d36323426683d32383926663d706e6726733d3431303537) > > 从上面这个图上,我们可以看到,浏览器渲染过程如下: > > > >...

我本来也以为只会重绘。。不过在chrome里,使用performance记录了下,发现还是会触发回流,这个我也觉得很奇怪。你们也可以去尝试复现下。也有可能是我模拟的有问题

@HenryYong ![image](https://user-images.githubusercontent.com/14784326/64074113-e0067580-ccd9-11e9-8000-185448761a77.png)这里不是触发了回流了吗。

@HenryYong 恩恩,那看来修改background是不会触发回流(Layout)的。他这里的Recaculate Style和Update Render Tree让人误解了。

@jakesamz hhhh,都可以~你也可以用这种方式,没有什么特别的原因

**很多人以为await会一直等待之后的表达式执行完之后才会继续执行后面的代码,**实际上await是一个让出线程的标志。await后面的函数会先执行一遍,然后就会跳出整个async函数来执行后面的代码。等本轮事件循环执行完了之后又会跳回到async函数中执行后面的代码。** 那么async在await后,它是属于macro task还是micro task。 如果是micro task,为什么会比promose慢,如果是macro task,为什么会比settimeout快?

> > **很多人以为await会一直等待之后的表达式执行完之后才会继续执行后面的代码,**实际上await是一个让出线程的标志。await后面的函数会先执行一遍,然后就会跳出整个async函数来执行后面的代码。等本轮事件循环执行完了之后又会跳回到async函数中执行后面的代码。** > > 那么async在await后,它是属于macro task还是micro task。 > > 如果是micro task,为什么会比promose慢,如果是macro task,为什么会比settimeout快? > > 取决于async函数里面的内容,里面是同步代码就立即执行,异步就加入到任务队列。文章中有写,变式2也有论证~ 我说的是await后面的代码,比如下面这个: ![image](https://user-images.githubusercontent.com/14784326/52939471-3a279500-339f-11e9-866d-72e07885359f.png)