1、js基础类型
boolean, string, number, null, undefined, Object, Symbol
2、Object类型和其它类型有何不同
其它类型是值类型,数据存放在栈里面。
Object
类型是堆类型,存放在堆里面。
追问: 如果Object 的属性值时值类型,该属性存放在哪里呢?
堆内存中
我说是栈内存
3、var,let,const 区别
var
es5 语法,用于定义变量
let
,const
es6 语法 分别用于变量,常量
相同:变量都会提升。
不同:var
变量没有作用域概念,会提升至全局作用域,let
定义的变量只会在局部作用域进行提升,const
则是用于定义常量
4、原型链
省略不想写
5、箭头函数和普通函数区别
首先是语法不同。() => {}
, function name() {}
this
指向有所不同,箭头函数没有自己的this
,它的this
指向他的父级作用域,普通函数有自己的this
。
箭头不能作为构造函数即(不能new
,也没有prototype
)。
箭头函数没有arguments
这个对象,普通函数则有。
6、new 创建对象时发生了什么
创建对象,绑定原型链,绑定this
,返回对象
7、箭头函数能new吗?
不能,为什么因为他既没有自己的this,有没有prototype
所以没办法执行new
操作。
8、如何改变this指向
bind
, call
, apply
等方法可以改变this
指向。
9、for…in,for…of 区别
for…in 可以变量对象,for…of 通常用于遍历可迭代对象,
10、深浅拷贝的区别
浅拷贝仅仅只拷贝了对象第一层不会嵌套拷贝,当源对象的属性是对象是,拷贝的是引用地址
深拷贝通常是创建一个新对象,将源对象的属性一个一个的添加到新对象上。
11、如何实现深拷贝
JSON.parse(JSON.stringify())
递归
这两种方式实现
追问: 第一种方式什么缺陷吗?
一些特殊对象会导致其异常,比如:RegExp
, Date
, 无法处理循环引用
12、如何拷贝循环引用的对象
1、递归的过程中使用一个Map
或者Array
存放已拷贝的对象,再次出现直接使用即可
2、递归限制层数,仅拷贝几层后不再递归。
13、循环引用的对象会被垃圾回收机制回收吗
我的观点是不会,因为该对象一直处于被引用的状态,所以不会被垃圾回收机制标记回收。
我得到的回答是,会!孤岛对象会被垃圾回收机制检测到并将其释放。
GPT的回答是 会!
14、React 函数式组件如何模拟生命周期回调
useEffect(() => {}, [])
代表初始化阶段
useEffect(() => {}, [a])
代表更新阶段
useEffect(() => { return function destory() {} }, [])
这个返回的函数就是卸载时执行的
15、React State更新机制
异步更新,react
会将他们收集起来,待到一定的时机一起更新,这样做有一个好处,多个state
改变只会更新一次视图。
16、key的作用
方便diff算法
去更新DOM
,例子:[1, 2, 3, 4, 5] 找到 4 ,遍历数组肯定比直接用索引取慢,所以这就是key
的作用
追问: diff算法
是深度优先还是广度优先,是深度优先,有利于最小视图的更新,在一定程度上提升了性能。
17、算法&场景
1、编写一个函数,接收两个参数,参数一一个数组,参数二数字,从数组中找出三个数的和等于参数二并返回其,若不足三个则反[],未找到也[]
function findListItemParams(list, value) {}
// 示例
输入:[1, 2, 3], 6
输出:[0, 1, 2] // 返回
2、这部分有些忘了。篇幅过长没记住,大概是根据给定的数据结构将其渲染成dom,数据结构包含宽高位置信息,不能使用定位。