You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
CommonJs 的 this 是当前模块,ES6 Module 的 this 是 undefined
4.[腾讯一面]Virtual Dom 的优势在哪里?
「Virtual Dom 的优势」 其实这道题目面试官更想听到的答案不是上来就说「直接操作/频繁操作 DOM 的性能差」,如果 DOM 操作的性能如此不堪,那么 jQuery 也不至于活到今天。所以面试官更想听到 VDOM 想解决的问题以及为什么频繁的 DOM 操作会性能差。
首先我们需要知道:
DOM 引擎、JS 引擎 相互独立,但又工作在同一线程(主线程) JS 代码调用 DOM API 必须 挂起 JS 引擎、转换传入参数数据、激活 DOM 引擎,DOM 重绘后再转换可能有的返回值,最后激活 JS 引擎并继续执行若有频繁的 DOM API 调用,且浏览器厂商不做“批量处理”优化,
引擎间切换的单位代价将迅速积累若其中有强制重绘的 DOM API 调用,重新计算布局、重新绘制图像会引起更大的性能消耗。
其次是 VDOM 和真实 DOM 的区别和优化:
虚拟 DOM 不会立马进行排版与重绘操作
虚拟 DOM 进行频繁修改,然后一次性比较并修改真实 DOM 中需要改的部分,最后在真实 DOM 中进行排版与重绘,减少过多 DOM 节点排版与重绘损耗
虚拟 DOM 有效降低大面积真实 DOM 的重绘与排版,因为最终与真实 DOM 比较差异,可以只渲染局部
面试题汇总
1.[腾讯二面]了解 v8 引擎吗,一段 js 代码如何执行的
在执行一段代码时,JS 引擎会首先创建一个执行栈
然后 JS 引擎会创建一个全局执行上下文,并 push 到执行栈中, 这个过程 JS 引擎会为这段代码中所有变量分配内存并赋一个初始值(undefined),在创建完成后,JS 引擎会进入执行阶段,这个过程 JS 引擎会逐行的执行代码,即为之前分配好内存的变量逐个赋值(真实值)。
如果这段代码中存在 function 的声明和调用,那么 JS 引擎会创建一个函数执行上下文,并 push 到执行栈中,其创建和执行过程跟全局执行上下文一样。但有特殊情况,即当函数中存在对其它函数的调用时,JS 引擎会在父函数执行的过程中,将子函数的全局执行上下文 push 到执行栈,这也是为什么子函数能够访问到父函数内所声明的变量。
还有一种特殊情况是,在子函数执行的过程中,父函数已经 return 了,这种情况下,JS 引擎会将父函数的上下文从执行栈中移除,与此同时,JS 引擎会为还在执行的子函数上下文创建一个闭包,这个闭包里保存了父函数内声明的变量及其赋值,子函数仍然能够在其上下文中访问并使用这边变量/常量。当子函数执行完毕,JS 引擎才会将子函数的上下文及闭包一并从执行栈中移除。
最后,JS 引擎是单线程的,那么它是如何处理高并发的呢?即当代码中存在异步调用时 JS 是如何执行的。比如 setTimeout 或 fetch 请求都是 non-blocking 的,当异步调用代码触发时,JS 引擎会将需要异步执行的代码移出调用栈,直到等待到返回结果,JS 引擎会立即将与之对应的回调函数 push 进任务队列中等待被调用,当调用(执行)栈中已经没有需要被执行的代码时,JS 引擎会立刻将任务队列中的回调函数逐个 push 进调用栈并执行。这个过程我们也称之为事件循环。
2.[未知]首屏和白屏时间如何计算?
首屏时间的计算,可以由
Native WebView
提供的类似onload
的方法实现,在ios
下对应的是webViewDidFinishLoad
,在android
下对应的是onPageFinished
事件。白屏的定义有多种。可以认为“没有任何内容”是白屏,可以认为“网络或服务异常”是白屏,可以认为“数据加载中”是白屏,可以认为“图片加载不出来”是白屏。场景不同,白屏的计算方式就不相同。
3.[字节跳动] common.js 和 es6 中模块引入的区别?
CommonJS
是一种模块规范,最初被应用于Nodejs,成为
Nodejs
的模块规范。运行在浏览器端的JavaScript
由于也缺少类似的规范,在ES6
出来之前,前端也实现了一套相同的模块规范 (例如:AMD
),用来对前端模块进行管理。自ES6
起,引入了一套新的 ES6 Module 规范,在语言标准的层面上实现了模块功能,而且实现得相当简单,有望成为浏览器和服务器通用的模块解决方案。但目前浏览器对ES6 Module
兼容还不太好,我们平时在Webpack
中使用的export
和import
,会经过Babel
转换为CommonJS
规范。在使用上的差别主要有:CommonJS
模块输出的是一个值的拷贝,ES6
模块输出的是值的引用。CommonJS
模块是运行时加载,ES6
模块是编译时输出接口。CommonJs
是单个值导出,ES6 Module
可以导出多个CommonJs
是动态语法可以写在判断里,ES6 Module
静态语法只能写在顶层CommonJs
的this
是当前模块,ES6 Module
的this
是undefined
4.[腾讯一面]Virtual Dom 的优势在哪里?
「Virtual Dom 的优势」 其实这道题目面试官更想听到的答案不是上来就说「直接操作/频繁操作 DOM 的性能差」,如果
DOM
操作的性能如此不堪,那么jQuery
也不至于活到今天。所以面试官更想听到VDOM
想解决的问题以及为什么频繁的DOM
操作会性能差。首先我们需要知道:
DOM 引擎、JS 引擎 相互独立,但又工作在同一线程(主线程)
JS
代码调用DOM API
必须 挂起 JS 引擎、转换传入参数数据、激活 DOM 引擎,DOM 重绘后再转换可能有的返回值,最后激活 JS 引擎并继续执行若有频繁的DOM API
调用,且浏览器厂商不做“批量处理”优化,引擎间切换的单位代价将迅速积累若其中有强制重绘的
DOM API
调用,重新计算布局、重新绘制图像会引起更大的性能消耗。其次是
VDOM
和真实DOM
的区别和优化:DOM
不会立马进行排版与重绘操作DOM
进行频繁修改,然后一次性比较并修改真实 DOM 中需要改的部分,最后在真实 DOM 中进行排版与重绘,减少过多DOM
节点排版与重绘损耗DOM
有效降低大面积真实 DOM 的重绘与排版,因为最终与真实DOM
比较差异,可以只渲染局部5.[高德一面]一个 tcp 连接能发几个 http 请求?
如果是
HTTP 1.0
版本协议,一般情况下,不支持长连接,因此在每次请求发送完毕之后,TCP 连接即会断开,因此一个TCP
发送一个HTTP
请求,但是有一种情况可以将一条 TCP 连接保持在活跃状态,那就是通过Connection
和Keep-Alive
首部,在请求头带上Connection
:Keep-Alive
,并且可以通过Keep-Alive
通用首部中指定的,用逗号分隔的选项调节keep-alive
的行为,如果客户端和服务端都支持,那么其实也可以发送多条,不过此方式也有限制,可以关注 《HTTP 权威指南》 4.5.5 节对于Keep-Alive
连接的限制和规则。而如果是
HTTP 1.1
版本协议,支持了长连接,因此只要TCP
连接不断开,便可以一直发送HTTP
请求,持续不断,没有上限;同样,如果是
HTTP 2.0
版本协议,支持多用复用,一个 TCP 连接是可以并发多个 HTTP 请求的,同样也是支持长连接,因此只要不断开 TCP 的连接,HTTP 请求数也是可以没有上限地持续发送阅读原文
The text was updated successfully, but these errors were encountered: