基本 数据类型 和引用数据类型
7种(栈):string number boolean null undefined sysbol bigInt
引用数据类型(堆 存储的是内存地址):object array function
bigint和symbol的使用场景
判断数据类型的方法和优缺点
隐式类型转换,+,-的规则
==和===的区别和规则
浮点数精度
let var const的区别
1.作用域:var是全局作用域 let const是块级作用域 2.变量提升:var 声明会被提升到作用域顶部,但是赋值不会。即在声明前使用变量(值为undefined)
let const 声明也会被提升,但存在暂时性死区,就会报错
3.可变性: var let 声明的变量可以重新赋值。const 不可
4.重复声明:var允许在同一作用域内重复声明同一变量,后声明的会覆盖前一个。
let const 不允许
this指向的判断
1.全局作用域中this指向window对象,严格模式指向undefined
- 对象方法调用时,指向当前调用该方法的对象(谁调用,指向谁)
3.构造函数调用(new 关键字),指向新创建的实例
4.DOM事件处理函数,指向触发事件的DOM元素
5.箭头函数无this,继承外层作用域的this
6.显示改变this指向:call apply bind可以手动强制改变函数this指向
箭头函数
1.继承外层作用域的this
2.内部没有arguments(类数组对象),可用剩余参数...args来获取所有参数
3.不能作为构造函数:因为无法通过new关键字调用,会报错(因为没有prototype,也没有自己的this)
4.没有super:箭头函数不能作为类的方法(因为 super 依赖动态 this)。super是一个关键字,可访问父类的属性和方法
原型和原型链的作用
1.原型:每一个函数都有prototype属性称之原型,也称为原型对象
作用:1.原型可以存放一些属性和方法,共享给实例对象使用2.原型可以做继承
2.原型链:每个对象都有__proto__属性,这个属性指向它的原型对象,原型对象也是对象,也有__proto__属性,指向原型对象的原型对象,就这样一层一层形成的链式结构称为原型链,最顶层找不到则返回null.
promise的使用场景和相关 API
使用场景:1.网络请求 feachAPI/Axios,用于处理请求的成功/失败逻辑2.多步异步依赖,可避免回调地狱3.并行异步任务,promise.all()提高效率4.异步操作超时控制Promise.race()实现超时逻辑
相关API:1.实例方法(promise实例调用) .then()处理成功/失败状态 .catch()处理错误 finally()
2.静态方法(promise构造函数调用) Promise.resolve()快速创建一个处于fulfilled状态的promise Promise.rejected()快速创建一个处于rejected状态的Promise Promise.all()接收Promise数组
Promise.race()接收promise数组,返回第一个完成的Promise的结果
事件循环机制 浏览器和node
事件循环(Event Loop)是 JavaScript 实现异步编程的核心机制,负责协调执行代码、处理事件和执行异步操作。
浏览器中:同步代码(执行栈)-->微任务(eg:promise 在任务队列中)-->宏任务(eg:script settimeout在任务队列中)
Node.js 的事件循环由 libuv 库实现,比浏览器更复杂,包含多个阶段,每个阶段处理特定类型的任务。六个阶段:...
垃圾回收
闭包和 作用域
闭包=内层函数+引用的外层函数变量 可实现数据的私有
闭包允许一个函数访问并操作其声明时所在作用域中的变量,即使该函数在其声明的作用域之外执行。
闭包不一定有return 也不一定会有内存泄漏
什么时候用return:外部如果想要使用闭包的变量时需要return 闭包-内存泄漏:借助垃圾回收机制的标记清除法 不是所有的内存泄漏都要手动回收的
raf和ric
事件委托,事件冒泡
事件冒泡:事件触发后在 DOM 树中向上传播的过程
事件委托:利用事件冒泡的特性,将子元素的事件处理逻辑委托给父元素或更外层元素
浅拷贝 , 深拷贝 ,口述如何实现深拷贝
浅拷贝:拷贝的是对象的指针,修改内容互相影响
深拷贝:整个对象拷贝到另一个内存中,修改内容互不影响
实现深拷贝:法一 JSON.parse(JSON.stringify());简单,但存在很大的缺陷 法二:递归(为避免循环引用,用 WeakMap 存储已拷贝对象) 法三 使用第三方库 Lodash 的 _.cloneDeep()
防抖和节流
防抖(debounce):在事件被触发n秒后再执行回调,如果在这n秒内又被重新触发,则重新计时
节流(throttle):规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。
-
函数防抖和函数节流都是防止某一时间频繁触发,但是这两兄弟之间的原理却不一样。
-
函数防抖是某一段时间内只执行一次,而函数节流是间隔时间执行。