前端面试问题总结

40次阅读

共计 2479 个字符,预计需要花费 7 分钟才能阅读完成。

浅拷贝、深拷贝之间的区别

 核心:引用类型和非引用类型的拷贝结果是不同的 

浅拷贝只是拷贝基本类型的数据,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,因此存在父对象被篡改的可能,浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存

// 简单的浅拷贝
var a = 1;
var b = a;// 赋值
console.log(b) //1
a = 2;// 改变 a 的值
console.log(b) //1

实现深拷贝,用什么方法来实现:
JSON.parse() + JSON.stringify()(缺点:只能处理可以被枚举的属性);
原理:用 JSON.stringify 将对象转成 JSON 字符串,再用 JSON.parse() 把字符串解析成对象,一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。

let arr = [1, 3, {username: 'kobe'}];
let arr4 = JSON.parse(JSON.stringify(arr));

var、let、const 的区别 **
var 会变量提升;
let 声明的变量只在它所在的代码块有效;
const 声明后不能再修改其指向的目标,假如 const 指向的是一个对象 / 数组,那么虽然不能更改指向目标,但是可以更改对象和数组内部的值;

** 从输入 URL 到浏览器显示页面发生了什么。(特别注意)**
*   1. 在浏览器中输入 url(解析 IP 地址)*   2. 应用层 DNS 解析域名
*   3. 应用层客户端发送 HTTP 请求
*   4. 传输层 TCP 传输报文 (3 次握手)
*   5. 网络层 IP 协议查询 MAC 地址
*   6. 数据到达数据链路层
*   7. 服务器接收数据
*   8. 服务器响应请求
*   9. 服务器返回相应文件
*   二、页面渲染:现代浏览器渲染页面的过程是这样的:解析 HTML 以构建 DOM 树 –> 构建渲染树 –> 布局渲染树 –> 绘制渲染树。

在浏览器还没接收到完整的 HTML 文件时,它就开始渲染页面了,在遇到外部链入的脚本标签或样式标签或图片时,会再次发送 HTTP 请求重复上述的步骤。在收到 CSS 文件后会对已经渲染的页面重新渲染,加入它们应有的样式,图片文件加载完立刻显示在相应位置。在这一过程中可能会触发页面的重绘或重排。

5、async、await 的使用场景是什么?
连续的异步请求,下一步的异步请求依赖于前一步的异步请求结果;
进阶一:假如有 A、B、C 三个异步请求,异步请求 C 依赖于异步请求 A 和 B 的结果(即 A 和 B 完成后再发起 C),那么你会如何实现它?

Promise.all();
设置状态分别标记 A 和 B,A、B 完成后会去修改自己的完成标记,然后检查所有的状态标记,假如都是完成状态,然后去执行异步请求 C。

6、Promise 是什么?
是异步编程的一种解决方案;
所谓 Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。
一般什么时候使用?

处理异步请求时使用,比如 ajax 请求;
有哪些状态?

状态有 pending、resolved、rejected;
怎么捕获他的错误?

最后写 catch;
then 里面第二个参数可以捕获;
如果内部抛错,但是没有被捕获,这个没被捕获的错误接下来会发生什么事情?

冒泡;
能不能被 try catch 捕获?为什么?

不能,因为是异步编程。
能不能被 window.onerror 捕获?

不能
new Promise((resolve,reject)=>throw new Error(‘a’)).then(fn1).then(fn2,fn3).catch(fn4) 这个函数,会执行哪些函数 * fn3,没了

7、数字计算:请问在 js 中,输入表达式 0.1 + 0.2 的结果是什么?
0.30000000000000004(能回答出来不是 0.3,而是 0.3 后有若干个 0 和一个数字即可)
进阶一:为什么?

原因是浮点数和整数,在存储时的方法是不同的,因此相加的规则也是不同的;
进阶二:浮点数是怎么存储的(本问题比较难)(可以跳到进阶三,比本题简单)

而 double 类型就是双精度浮点数,这种指使用 64 位(8 字节)来存储一个浮点数。

根据规定,这 64 位 bit 里,分为三部分:

第一部分 (1bit):

符号位,表示正负,正数为 0,负数为 1。

第二部分 (11bit):

阶码位,也可以称为指数位。

第三部分(52bit)

尾数位,即表示实际数字的。

假如正负符号的值为 S,正数 S 为 1,负数 S 为 -1;
假如指数位表示的值为 E(计算后),指数位表示的值为 2 的 E 次方;
假如尾数位表示的值为 M,尾数位表示的值为 M;

根据科学表示法,任何一个范围内的浮点数可以通过以下方法来表示:(别问我为啥,我没去谷歌……)

浮点数 = S Math.pow(2,E) M;
进阶三:我们在实际开发中,如果遇见了这种浮点数计算的情况,怎么处理比较合适?

8、移动端开发的时候,一般怎么实现自适应?
rem
vw 和 vh
媒体查询(bootstrap);
进阶一:他们的特点分别是什么?或者说实现原理是什么?

rem 根据 html 的 font-size;
vw 是浏览器窗口宽度,vh 是高度;
媒体查询是根据浏览器窗口宽度或高度,进行响应式选择显示哪个 css;
进阶二:弹出输入框会发生定位错误,fixed 布局,怎么解决?

9、在我们将开发好的页面,进入线上环境的时候,肯定要最大化性能优化,那么我们常见的做法有哪些?
https://csspod.com/frontend-p…
gzip、雪碧图、减少 http 请求数、减少 DNS 请求、避免重定向、缓存 ajax 请求、延迟加载、预加载、减少 DOM 数、使用框架例如 React 的虚拟 DOM 树、减少 DOM 操作、使用 CDN、减少 css 里 @import 写法、
10、图片使用 雪碧图 和 base64 字符串 你觉得哪个好?为什么?
雪碧图可以缓存;
base64 可以减少请求数;
进阶一:如果你决定使用雪碧图 /base64 字符串,你会怎么做?

webpack 配 url-loader(base64);
webpack 的雪碧图插件 webpack-spritesmith;

正文完
 0