# JS 基础
# 数据类型
# 基本类型有 7 种: undefined
、 null
、 string
、 number
、 boolean
、 bigint
、 symbol
# 引用类型有: Object
、 Array
# For 循环
for..of.. | |
for..in.. | |
Array.prototype.foreach() | |
Array.prototype.map() | |
Array.prototype.filter() | |
Array.prototype.every() | |
Array.prototype.some() | |
Array.prototype.reduce() |
数组原型链上的方法可能经常会拿出来单独考,如果平时不常使用就很容易卡壳,可以从数组去重这个切入点来巩固 for 循环。
# 数组方法:
数组常考,实际开发中也常用,需要尽量全面地了解。
push:末尾添加 | |
unshift:首部添加 | |
pop:末尾删除 | |
shift:首部删除 | |
concat:数组合并 | |
join:数组元素通过连接符变成字符串 | |
reverse:数组反转 | |
sort:数组排序 | |
flat:数组拍平 | |
slice (start, end):切割,不改变原数组,返回新数组 | |
splice (start, length, newItem):切割,改变数组,从指定位置开始删除,同时可插入新元素 | |
indexOf:查找元素下标 | |
map、foreach、filter .... |
# 闭包
简单来说就是函数中嵌套函数,这个内部函数暴露给了外部调用。作用是可以访问局部变量,缺点是容易发生内存泄漏(即变量不会被自动回收)。
- 可以用来封装私有变量,编写 JS 库 / 插件可能会用到
- 用来实现节流这类函数
- 可以作为缓存数据的一种策略
# 原型链
每个函数都有 prototype
属性,每个函数实例对象都有一个 __proto__
属性, __proto__
指向了 prototype
,当访问实例对象的属性或方法,会先从自身构造函数中查找,如果找不到就通过 __proto__
去原型中查找。
# 作用域链:
在当前作用域下找不到某个变量时就去父级作用域查找,依次向上一级一层层查找变量的过程就叫做作用域链。
# call、apply、bind
- 共同点:都可以改变函数的作用域(改变 this 指向)
call
/apply
:会立即执行函数,两者基本区别在于传参不同bind
:不会立即执行
# this 的指向
# New 关键字
# 如何理解 foreach
# 关于深浅拷贝
# 浅拷贝:
# 深拷贝:
JSON.parse(JSON.Stringify())
,优点是简单,缺点是不能拷贝 Function、undefined 会丢失,时间对象会变成字符串。- 深度递归遍历
Object.assign
(一层是深拷贝,嵌套二层以上为浅拷贝)
# JS 进阶
# ES6 新语法 / 特性
- 模板字符串
let
、const
关键字- 箭头函数(没有自己的
this
,不能使用new
命令,不能调用call
) class
类Promise
、async
/await
(es7 之后才支持)export
、import
模块化(ES Module)- 对象扩展(很常用,键值对同名简写,
Object.assign
拷贝或合并对象) - 展开运算符(很常用,
...
用于组装数组 / 对象) - 解构赋值(可简化提取数组 / 对象中的值,变量交换不用中间变量)
Map
(性能更好的对象)Set
(元素值是唯一的,常用于数组去重)
# Map 和普通对象的区别:
- 键值类型;
Map
有记录顺序,对象是无序的;Map
采用红黑树来存储键值,储存大量数据时性能更优,对象需要维护键值对映射关系,会受到内存上的一些限制。
由于这些差异,通常在需要存储大量数据且需要按照特定规则查找和排序时,使用 Map 对象更为合适;而在存储少量数据,并且知道属性名的情况下,使用对象更加方便。
# 特殊类型 WeakMap:
Map
对象的键可以是任何类型,但WeakMap
对象中的键只能是引用对象(如果对象不再被引用,则会自动 GC)WeakMap
对象是不可枚举的,无法获取集合的大小
WeakMap
由于无法遍历和清空,使用场景比较有限,通常可以用于避免循环引用造成内存泄漏
# 继承
JS 实现继承写法如下,JAVA 直呼内行 (bushi
class B extends A { | |
constructor() { | |
super(); | |
} | |
} |
# 高阶函数
高阶函数泛指那些操作其他函数的函数。简单来说,就是一个将函数作为 参数
或者 返回值
的函数。例如 Array.prototype.map
、 Array.prototype.filter
、 Array.prototype.reduce
这些都是 JavaScript 原生的高阶函数。