web前端面试
深拷贝浅拷贝js数据类型es6语法let var constvue 生命周期我就是这样不擅长表达,但是我实际上手能力可能比谁都强的感觉。
- 深拷贝浅拷贝
- js数据类型
- es6语法
- let var const
- vue 生命周期
- 网页渲染过程
- 两个数组拼接成一个数组的所有方法
js数据类型
1、五大基本数据类型
undefined,null,string,number,Boolean
2、复杂数据类型
object
vue生命周期函数
-
beforecreate()初始化vue实例
-
created()
此时data属性已和数据绑定,也是最早ajax请求数据的地方
在页面还没渲染出来时就调用的函数,一般用来在页面渲染出来之前获取整个页面的数据 -
beforeMoute()
-
mounted()数据挂载
-
beforeUpdate()
-
updated()当data中数据发生变化,组件将会重新渲染
-
beforeDestory()
-
destoryed()实例销毁后,所有绑定指示的值及监听器等都将被销毁
const let var 的区别
var:
- 可以多次声明
- var定义的变量属于全局变量,存在变量提升
const、let差不多,他们不存在变量提升
let :
- 在同一作用域内只能定义一次,
- 不存在变量提升,一次在定义之前使用会报referenceError的错误,因此在使用之前一定要先定义。
- (暂时性死区:一个作用域内存在let,那么从这个作用域开始,直至let定义变量那行,都是暂时性死区,在这个区域内let定义的变量无法使用)
const 和 let的异同:
相同:都是只在声明的块级作用域内生效
不同: let声明的变量后期值和类型都可以改变,没有限制
const一旦声明值和类型都无法改变,即一开始声明变量就得立即赋值初始化他,const声明常量多。
const a;
a = 10; //这种就只有let可以,const会报错
深拷贝和浅拷贝
浅拷贝: 复制基本类型的属性,引用类型的属性,复制栈中的变量 和变量指向堆内存中的对象的指针,不复制堆内存中的对象。
深拷贝: 复制基本类型的属性,引用类型的属性,复制栈中的变量和变量指向堆内存的指针,复制堆内存中的对象
网页渲染过程
- 获取HTML文件,并解析成DOM模型(文档对象模型)
- 将css文件用css解析器解释成内部表示,形成css对象模型
- 将DOM模型与css对象模型合并。在DOM树上附加样式信息,生成RenderObject树
- RenderObject节点在创建的同时,webkit会根据网页层次结构构建RenderLayer树,同时构建一个虚拟绘图上下文。
- 布局(layout)和绘制
数组的方法
array.map() 遍历数组每个元素,但不改变数组
array.pop() 删除数组中最后一个元素并返回数组,
let amm = [1,2,3,4,5]
amm.pop()
console(amm) //此处数组amm = [1,2,3,4]
array.splice(开始位置,删除个数,删除元素) 删除数组的元素
let amm = [1,2,3,4]
let a = amm.splice(0,1) // a = [2,3,4]
let b = amm.splice(1, 0, "abc") // b = [1,abc,2,3,4] 不删除元素反而新增一个
let c = amm.splice(1, 1, "abc") // c = [1,abc,3,4] 不存在的被删除的元素反而替代删除的那个
array.slice(开始位置,结束位置)返回数组中元素从开始位置到结束位置
array.shift() 删除数组的第一个元素,并返回数组
let amm = [1,2,3,4]
amm.shift()
console.log(amm) // amm = [2,3,4]
array.unshift() 将一个或多个元素添加到数组的开头
let amm = [1,2,3,4]
amm.unshift(6,7)
console.log(amm) //amm = [6,7,1,2,3,4]
array.isArray() 判断是否是数组,返回布尔值Boolean
array.toString() 将数组转换为字符串
let amm = [1,2,3,4]
amm.toString()
console.log(amm) //1,2,3,4
array.join()将数组转换为字符串
let array = [3,4,5,6]
let a = array.join(,)
let b = array.join(&)
let c = array.join()
console.log(a) //3,4,5,6
console.log(b) //3&4&5&6
console.log(c) //3456
array.concat() 数组拼接
let amm1 = [1,2]
let amm2 = [3,4]
let a = amm1.concat(amm2) //a = [1,2,3,4]
array.push() 在数组末尾添加元素
array.reduce()
array.every()如果每个元素都满足这个条件返回true,否则true
array.some()
-
重绘重排(重绘不一定需要重排,重排必然导致重绘)
-
重绘:是一个元素的外观被改变所触发的浏览器行为,浏览器会根据元素的新属性重新绘制,使元素呈现新的外观
-
重排:当渲染树的一部分必须更新,并且节点的尺寸发生了变化,浏览器会使树中受到影响的部分失效,并且重新构造渲染树
1、添加、删除可见的dom
2、元素的位置改变
3、元素的尺寸的改变(外边距,内边距、边框厚度、宽高等几何属性)
4、页面的渲染初始化
5、浏览器窗口尺寸改变 -
减少reflow 重排,repaint 重绘
1、不要一条一条的修改DOM的样式,可先定义好css的class,然后修改DOM的className, 动态绑定classname
2、不要把DOM节点的属性值放在一个循环里面当成循环里面的变量
3、为动画的HTML元件适用fixed 或absolute 的position,那么修改他们的css是不会reflow
更多推荐
所有评论(0)