前端面试高频考题(二)

239 阅读2分钟

一、Javascript

1 求和1- 100

       function sum(num) {
            return num < 2 ? num : num + sum(num -1)
         }
         console.log(sum(1)) // 1
         console.log(sum(100)) // 5050
         
         function getSum(a, b) {
            const sum = a + b // 3
            const c = b + 1
            if (c > 100) {
                return sum 
            } else {
                return getSum(sum, c)
            }
        }
        console.log(getSum(1,2)) // 5050

2 用递归的方式求阶乘

一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。

亦即n!=1×2×3×…×(n-1)×n。
阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。 参考文档: blog.csdn.net/ThisEqualTh…

// 输入5,求5*4*3*2*1
       function factorial(num) {
            return num <= 1 ? 1 : num * factorial(num-1)
        }
        const res = factorial(5) // 120

3 window.onload 和 $(document).ready 的区别

image.png

一般情况下一个页面响应加载顺序: 域名解析---加载html---加载js和css---加载图片等。

两者的加载时机: 域名解析---加载html---加载js和css---document.ready---加载图片---window.onload

window.onload = function () {
            console.log('window---onload1')
        }
        $(document).ready(function() {
            console.log('document--ready1') 
        })
        window.onload = function () {
            console.log('window---onload2')
        }
        $(document).ready(function() {
            console.log('document--ready2')
        })
        $(function() {
            console.log('document----ready3')
        })
  // 'document--ready1' 'document--ready2' 'document----ready3' 'window---onload2'

4 重绘和重排

参考文档: blog.csdn.net/weixin_4267…

重排负责元素几何属性的更新,如元素宽高、位置变化都会引起重排;
重绘负责元素样式的更新,如改变某个元素的背景,就会引发重绘。
重排必然带来重绘,重绘未必带来重排。
尽量减少重绘、重排。

浏览器在下载完页面所有资源后,就开始构建DOM树,同时构建style树,两者合并渲染为render树。流程如下图:

image.png

引发重排触发的场景有:
01 添加或删除可见的DOM元素
02 元素位置改变(外边距,position)
03 元素本身的尺寸发生改变(内边距、边框厚度、宽高等几何属性)
04 内容改变
05 浏览器窗口大小发生变化

5 为什么vite比webpack快

因为webpack在启动时,会从入口文件找到所有的依赖模块,编译并打包整个项目文件。随着项目越来越复杂,模块越来越多,打包后的bundle也越来越大,打包的速度自然也会越来越慢,所以启动时间也会越来越长。

而vite在启动时不需要打包,也就意味着它不需要拆分模块的依赖,不需要编译,所以启动速度非常快。 这主要是利用了现代浏览器本身支持ES Module这一特点实现的。

在底层实现方面,vite是基于es build预构建的。es build基于go语言编写,比js编写的打包器预构建快10-100倍,