JS的知识点总结
# let、var和const的区别
var 变量提升,let 暂时性死区 作用域,const 不能修改值 作用域
# 数据类型
基本类型:字符串(string)、数字(number)、布尔(boolean)、未定义(undefined)、空(null)、大整数(bigint)、符号(symbol)
引用类型:方法(Function),对象(Object)、数组(Array)、Map、Set、Date
# Map、Set
Map有序的键值储存
Set唯一的类数组储存
# 堆和栈的区别
栈 大小是固定的,存放 基本类型,存取速度比堆快
堆 大小不固定,存放 引用类型数据
# 数据的深浅拷贝
浅拷贝 拷贝引用地址
深拷贝 拷贝数据
深拷贝的实现与缺陷
JSON 循环引用对象无法正确实现深拷贝、new Date的对象会转换成字符串、函数和undefined会丢失
循环递归 考虑除对象之外的数据类型、循环引用对象
# this
this 对象,不同函数指向不同,(#普通函数和箭头函数)
绑定规则 new,显示绑定,隐式绑定,默认绑定
# 普通函数和箭头函数
箭头函数 this是函数上下文环境对象的,不能使用new构造函数
普通函数 this是谁调用就指向谁,可以使用new构造函数
(#call、apply 、bind)
# call、apply 、bind
call和apply 立即修改
bind 返回函数执行函数修改。
apply传参不一样,它只接受一个类数组的参数
call,bind是(obj,val,val,val....) | apply(obj,[val,val,val...])
# 判断数据类型
typeof判断 基本类型(判断结果:基本类型)和undefined(undefined),NaN(number)和null、引用类型(object)没法准确判断
instanceof判断 引用类型。
构建函数判断([].constructor === Array),isNaN,数组的isArray,toString配合call来判断
# instanceof的原理
内部通过原型链的方式来判断是否为构建函数的实例
# 原型、原型链
提供共享属性的对象
对象有__proto__ ,constructor --> 构造函数 - prototype -->原型
__proto__一层一层,顶层 Object再往上 null 就原型链
优点:是共用数据方法,通过原型链找,不用每一个对象都带数据方法。
缺点:是共用的话一个地方修改,会影响到其他地方。
原型可以做继承,(#继承)
# 继承
子类通过继承父类,获取父类的属性和方法。
常见继承实现,优缺点看链接 JavaScript面向对象&继承 (opens new window)
# new做了什么
创建新对象,新对象继承了函数的原型,修改this,返回对象。
# es6新特性
箭头函数、字符串模板、let const、class声明类、解构赋值、Promise、Es6模块化、参数默认值等等
# Promise
异步任务解决方案,链式调用避免回调地狱
三种状态 pending,fulfilled,rejected
API all(全部请求完更改状态),race(一个请求完更改状态)
# 作用域、作用域链
变量的作用的范围
全局作用域 js最大一层任意作用域都可以访问
函数作用域 函数内部定义,函数执行结束变量销毁
块级作用域 {}包裹 ,if块、while块、for块、try/catch/finallyd等都会产生块级作用域
作用域链 局部作用域到全局作用域依次查找
# 闭包
定义在函数内部的函数 并且能够被函数外部引用
优点:变量持久化 防止变量污染
缺点:内存泄露
解决办法 在退出函数之前 将不使用的局部变量全部删除 变量=null
闭包可以做什么 节流和防抖
# 节流和防抖
防抖 多次触发事件,只执行第一次或最后一次事件
节流 多次触发事件,只执行固定间隔时间的事件