前端面试(6)
前端面试(6)
接上:前端面试(5):https://blog.csdn.net/weixin_45266979/article/details/123697554?spm=1001.2014.3001.5501
文章目录
- 前端面试(6)
-
- 前言
-
- 一、let、const和var
- 二、0.1+0.2 === 0.3 (x)
- 三、同步异步
- 四、null == undefined,返回true
- 五、NAN ==NAN,返回false
- 六、vue中的watch属性
- 七、前端优化
- 八、前端渲染
前言
这是以往遇到的,或则觉得有记录意义的一些题。
一、let、const和var
- 变量提升
let和const,声明之前,打印为RefferenceError;
var,声明之前,打印为undefined; - 作用范围
let只能在它所在的块内使用,不然就是undefined,var不用; - 只读
const声明一个只读的变量,一旦声明,变量值不能改变;声明完必须立马赋值,只声明不赋值就会报错。
二、0.1+0.2 === 0.3 (x)
let a = 0.1,b = 0.2
let c = a + b
//输出0.30000000000000004
如果让他们相等,这需要对c进行转化
c.toFixed(1)
toFixed()语法:
number.toFixed(x)
x:必需。规定小数的位数,是 0 ~ 20 之间的值,包括 0 和 20,有些实现可以支持更大的数值范围。如果省略了该参数,将用 0 代替。
number,转换的数据
返回值是String类型
菜鸟:https://www.runoob.com/jsref/jsref-tofixed.html
问题产生原因:
计算机通过二进制方式存储数据,所以0.1+0.2实际上是0.0001100110011001100…(1100循环)+0.00110011001100…(1100循环),所以最后的值不等于0.3
推荐:https://blog.csdn.net/qq_42033567/article/details/107753355
三、同步异步
同步和异步通常用来形容方法的调用方式。
同步模式
:是一种执行模式,后一个任务等待前一个任务结束,然后再执行,程序的执行顺序和任务的排列顺序是一致的、同步的。
同步方法表明
调用一旦开始,调用者必须等待方法执行完成,才能继续执行后续方法。
异步模式
:是每一个任务有一个或多个回调函数(callback),前一个任务结束,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一样的,异步的。
异步模式表明
,方法一旦开始,立即返回,调用者无需等待期中方法执行完成,就可以继续执行后续方法。
通常我们写的方法都是同步方法,方法间都是串行化的,在一个县城内运行。
四、null == undefined,返回true
输出为undefined的几种情况:
- 声明变量,但是没有赋值,输出为undefined
- 输出不存在的对象,输出为undefined
- 定义形参,但是没有传递实参,输出为undefined
//函数定义了形参afunction fn(a) {console.log(a); //undefined}fn();//未传递实参
使用void对表达式求职也均为undefined
void a;void false; //undefinedvoid []; //undefinedvoid null; //undefinedvoid function fn(){}; //undefined
五、NAN ==NAN,返回false
原因:
JS规定,NaN表示的是非数字,但这个非数字也是不同的,因此,NaN不等于NaN,并且两个NaN永远不可能相等
。
NaN虽然表示是一个非数字,但是一般是算术运算执行的结果,因此NaN仍然是数值类型。那么这个非数字可以是不同的数字。
六、vue中的watch属性
watch第一次绑定值的时候不会执行监听函数,只有当值发生改变的时候才会执行,如果需要在最初绑定值的时候执行,需要用到immediate。
监听的数据写成对象格式,包含hander方法和immediate,之前我们写的函数其实就是在写handle方法。
当监听一个对象的改变时,基本的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听变化,此时就需要deep属性对对象进行深度监听,这样只会给对象的某个特定的属性加监听器。
数组(一维、多维)的变化不需要通过深度监听,对象数组中的对象的属性变化则需要deep深度监听。
推荐:https://www.jianshu.com/p/b630466669ab
七、前端优化
初始阶段–>加载优化
- 首页加载
- 首页加载图片过多
- 首页请求量过多
- 请求的资源过大
- CDN加速
CDN:内容发布网络,放置静态资源(JS CSS图片等)的服务器。
运行阶段–>渲染优化
目标是减少DOM操作
- 虚拟DOM,用js数据来模拟真实的DOM树,从而大大减少操作真实DOM的次数。
- 在渲染的时候,使用document。createDocumentFragment创建虚拟节点,从而避免引起没有必要的渲染。
- 采用分段渲染的方式,最后用window。requestAnimationFrame逐帧渲染。
渲染顺序:
- CSS样式表置于头部,CSS会一边加载一边渲染。
- JS脚本置于尾部,JS在未加载完成之前,会阻塞渲染。
- 关键JS、CSS代码可以内嵌在HTML中,比如:rem动态等。
- 避免使用IFrame
- 使用骨架屏
推荐:
下面两个博客从两方面对前端优化进行阐述,
一个是从用户角度和服务商角度:https://blog.csdn.net/weixin_49199038/article/details/110128888
一个是从初始阶段和运行阶段:https://www.cnblogs.com/coder-zero/p/14754160.html
八、前端渲染
页面加载完成的过程
在网页的地址栏输入url后,浏览器经历了什么样的过程?
- 客户端根据DNS服务器得到域名对应的ip地址;
- 客户端向该ip地址发送http请求;
- 客户端收到处理并返回http请求;
- 客户端收到响应并返回内容;
- 客户端渲染。
页面渲染过程
HTML渲染过程主要分为一下部分:
- 解析HTML,生成DOM树;
- 解析CSS,生成CSS规则树;
- 合并DOM树和CSS规则树,生成render树;
- 布局render树(layout/reflow);
- 绘制render树(print),绘制页面像素信息;
- 浏览器将各层的信息发送给GUI,GUI将各层合成,显示在屏幕上。
优化策略:
- 从文件大小考虑。
- 将CSS放在头部,将js放在尾部。
- 减少资源请求数量。
- 下载的内容是否要在首屏上使用。
- script标签的使用加defer或async属性。
推荐:https://www.cnblogs.com/bzsheng/p/12590369.html