- 链表:遍历链表、删除链表节点
- 树、图:深度/广度优先遍历
- 数组:冒泡/选择/插入/归并/快速排序、顺序/二分搜索
栈
- 一个后进先出的数据结构
- JavaScript中没有栈,但可以用Array实现栈的所有功能
栈的应用场景
- 十进制转二进制
- 判断字符串的括号是否有效
- 函数调用堆栈
队列
- 一个先进先出的数据结构
队列的应用场景
- 需要先进先出的场景
- 比如:食堂排队打饭、JS异步中的任务队列、计算最近请求次数
JS异步中的任务队列
- JS是单线程,无法同时处理异步中的并发任务
- 使用任务队列先后处理异步任务
计算最近请求次数
- 有新请求就入队,3000ms前发出的请求出队
- 队列的长度就是最近请求次数
链表
- 多个元素组成的列表
- 元素存储不连续,用next指针连在一起
数组VS链表
- 数组:增删非首尾元素时往往需要移动元素
- 链表:增删非首尾元素,不需要移动元素,只需要更改next的志向
JS中的链表
- Javascript中没有链表
- 可以用Object模拟链表
前端与链表:JS中的原型链
- 原型链的本质是链表
- 原型链上的节点是各种原型对象,比如Function.prototype、Object.prototype......
- 原型链通过_proto_属性连接各种原型对象
- obj -> Object.prototype -> null
- func -> Function.prototype -> Object.prototype -> null
- arr -> Array.prototype -> Object.prototype -> null
- 如果A沿着原型链能找到B.prototype,那么A instanceof B为true
- 如果在A对象上没有找到x属性,那么会沿着原型链找x属性
面试题一:instanceof的原理,并用代码实现
知识点:如果A沿着原型链能找到B.prototype,那么A instanceof B为true
解法:遍历A的原型链,如果找到B.prototype,返回true,否则返回false
const instanceOf = (A, B) => {
let p = A
while (p) {
if (p === B.prototype) {
return true
}
p = p.__proto__
}
return false
}
面试题二:
var foo = {}, F = function () { };
Object.prototype.a = 'value a';
Function.prototype.b = 'value b';
console.log(foo.a);
console.log(foo.b);
console.log(F.a);
console.log(F.b);
集合
- 一种无序且唯一的数据结构
- ES6中有集合,名为Set
- 集合的常用操作:去重、判断某元素是否在集合中,求交集
前端与集合:使用ES6的Set
字典
- 与集合类似,字典也是一种存储唯一值的数据结构,但它是以键值对的形式来存储
- ES6中有字典,名为Map
- 字典的常用操作:键值对的增删改查