作用域
局部作用域
函数作用域

块作用域

全局作用域

作用域链


JS垃圾回收机制与算法


引用计数


标记清除法

闭包




变量提升

函数进阶
函数提升



函数参数
动态参数

剩余参数


箭头函数内没有arguments,只能用剩余参数
展开运算符




箭头函数
基本语法


只有一行,为了区分函数体的花括号和对象的花括号而加上小括号


箭头函数参数

箭头函数this



注意是否存在谁调用了具名/无名函数,以确定this指向

处理this
普通函数this的指向

开启严格模式的方法

这里setTimeout虽然在btn内,但是setTimeout是普通函数,实际上是window在调用,因此里面的this指向window
箭头函数this的指向




改变this的指向:call() apply() (重点)bind()

传入多余的参数,则多余的参数会被忽略






![]()
![]()


直接使用匿名函数调用bind,再用返回的匿名函数作为参数去传递
解构赋值
数组解构


应用与特殊情况









对象解构 注意属性名要与变量名一致


属性名与变量名必须一致

对解构的属性名重新改名

数组对象结合的解构

多级对象解构,注意子级要加上子对象名

注:可以只对一部分属性进行解构,忽略其他属性即可
解构的数据同时作为形参

forEach遍历数组(区别map,不返回数组)



map的function内可以填返回值,会返回到新的数组
而forEach不返回数组
对象进阶
创建对象的三种方式

构造函数





实例化执行过程

实例成员/静态成员




-
实例方法:通过this绑定,每个实例都有自己的一份。
-
静态方法:直接添加到构造函数上的方法,只能通过构造函数访问,实例不能访问。



基本包装类与内置构造函数

const str = ‘content’等价于
const str = new String(‘content’)
Object

Object . keys/values(my_obj):获得所有键/值


Object . assign(target_obj , my_obj):对象拷贝/追加属性


Array

my_arr.reduce:累计器




数组其他方法

find 查找某个元素


every 比对全部元素

String

split 分割字符串

substring 截取字符串

输出![]()

以上面的字符串微粒,str.substring(5,6)相当于取索引号为5的字“核”
startsWith 判断是否以某字符串开头

includes 判断是否包含某个子字符串

Number my_num . toFixed()设置小数位长度

面向对象:通过构造函数与原型实现
构造函数:体现了封装特性





原型对象prototype:构造函数的属性所指向的对象



原型对象与构造函数的this都指向实例对象
在构造函数创建对象后定义的原型属性,之前创建的对象仍然具备该属性
通过原型扩展数组函数max/min与sum


constructor属性

构造函数的prototype属性指向原型对象,原型对象的constructor属性指向构造函数
对象形式赋值原型会覆盖原有内容,应该补充constructor
对象原型_ _proto_ _ 每个实例对象都有的只读属性,指向原型对象

注意__proto__是只读的


原型继承
令子类构造函数的prototype属性指向父类构造函数的实例(并包含constructor),使得继承后的子类构造函数的prototype可以有自己的属性而不因与其他子类共有prototype而受影响

原型链
任意构造函数的prototype属性指向该构造函数所对应的原型对象,而该原型对象也有一个__proto__属性指向该原型对象的对象原型。
事实上,这个__proto__属性指向的是object的原型对象(object. prototype),这意味着构造函数所对应的原型对象并不是由该构造函数所创建,而是object构造函数创建,因此才指向object的原型
而object.prototype也有__proto__属性,但再无更高级的指向,因此指向null


返回true
深浅拷贝
浅拷贝:对象内的对象不会被真正拷贝,只能指向同个对象

拷贝的时候,单层对象没问题,多层对象只会被拷贝第一层

深拷贝

递归

通过递归与对象的键值对实现深拷贝,首先在函数内实现浅拷贝,其次要在实现浅拷贝时判断元素是否属于数组/对象类型,如果是则需要为当前被拷贝的属性赋值空数组/对象,随后为其递归。
一定要先写array再写object,因为数组属于对象
引用lodash.js,用_.cloneDeep()函数实现

利用JSON转字符串实现

js无法实现undefined类型以及方法,有一定缺陷

异常处理
throw抛出异常(抛出Error对象)


try catch finally


debugger 断点调试

防抖与节流

防抖debounce:单位时间内频繁触发事件,只执行最后一次

利用防抖优化性能




手写防抖函数:利用定时器setTimeout


为了让事件每次触发都重新重置一次计时器,需要将重置逻辑作为新的函数写在返回值。重置逻辑为:先判断并清除已有的计时器函数,再创建新的计时器函数。
定时器标识应该声明在该函数之前,作为局外的一个变量
fn的调用写在计时器函数内部
节流 throttle:单位时间内频繁触发事件只执行第一次



手写节流函数


返回值的设置情况同防抖一样,不同的是判断逻辑改为:是否存在定时器,若存在则开启新的定时器,否则无操作。并且在调用完函数后,需要将定时器标志重设为null
不使用clearTimeout的原因是:setTimeout里无法使用clearTimeo ut,而且就算清除了定时器,timer还会保留定时器编号。因此将timer设置为null,等待定时器自然关闭即可
模块化export和import
三种导出方式:
命名导出(分别导出、统一导出、重命名导出)、
默认导出(直接默认导出、先定义后默认导出、默认导出对象/类、默认导出类)、
混合导出
命名导出
可以导出多个值,导入时需要相同的名称
分别导出

统一导出

重命名导出 使用as重命名

命名导出的导入方式

默认导出 export default
一个模块只能有一个默认导出
直接默认导出

先定义后默认导出

默认导出对象/类

默认导出类

默认导出的导入方式

混合导出 同时使用默认导出和命名导出

混合导出的导入方式
分别导入

先导入默认再导入命名

全部导入

注意事项




如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时















