mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6mobile wallpaper 7mobile wallpaper 8mobile wallpaper 9mobile wallpaper 10mobile wallpaper 11mobile wallpaper 12mobile wallpaper 13mobile wallpaper 14mobile wallpaper 15mobile wallpaper 16mobile wallpaper 17
1881 字
5 分钟
Js进阶
2026-01-03
2026-04-12

作用域#

局部作用域#

函数作用域#

块作用域#

全局作用域#

作用域链#

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#

一个模块只能有一个默认导出

直接默认导出#

先定义后默认导出#

默认导出对象/类#

默认导出类#

默认导出的导入方式#

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

混合导出的导入方式#

分别导入#

先导入默认再导入命名#

全部导入#

注意事项#

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Js进阶
https://krisreynard.top/posts/js进阶/
作者
Kris_Reynard
发布于
2026-01-03
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录