轻松解决前端算法面试

86 阅读2分钟
  1. 链表:遍历链表、删除链表节点
  2. 树、图:深度/广度优先遍历
  3. 数组:冒泡/选择/插入/归并/快速排序、顺序/二分搜索

  1. 一个后进先出的数据结构
  2. JavaScript中没有栈,但可以用Array实现栈的所有功能

栈的应用场景

  1. 十进制转二进制
  2. 判断字符串的括号是否有效
  3. 函数调用堆栈

队列

  1. 一个先进先出的数据结构

队列的应用场景

  1. 需要先进先出的场景
  2. 比如:食堂排队打饭、JS异步中的任务队列、计算最近请求次数

JS异步中的任务队列

  1. JS是单线程,无法同时处理异步中的并发任务
  2. 使用任务队列先后处理异步任务

计算最近请求次数

  1. 有新请求就入队,3000ms前发出的请求出队
  2. 队列的长度就是最近请求次数

链表

  1. 多个元素组成的列表
  2. 元素存储不连续,用next指针连在一起

数组VS链表

  1. 数组:增删非首尾元素时往往需要移动元素
  2. 链表:增删非首尾元素,不需要移动元素,只需要更改next的志向

JS中的链表

  1. Javascript中没有链表
  2. 可以用Object模拟链表

前端与链表:JS中的原型链

  1. 原型链的本质是链表
  2. 原型链上的节点是各种原型对象,比如Function.prototype、Object.prototype......
  3. 原型链通过_proto_属性连接各种原型对象
  4. obj -> Object.prototype -> null
  5. func -> Function.prototype -> Object.prototype -> null
  6. arr -> Array.prototype -> Object.prototype -> null
  7. 如果A沿着原型链能找到B.prototype,那么A instanceof B为true
  8. 如果在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);//value a
console.log(foo.b);//undefined
console.log(F.a);//value a 
console.log(F.b);//value b

集合

  1. 一种无序且唯一的数据结构
  2. ES6中有集合,名为Set
  3. 集合的常用操作:去重、判断某元素是否在集合中,求交集

前端与集合:使用ES6的Set

字典

  1. 与集合类似,字典也是一种存储唯一值的数据结构,但它是以键值对的形式来存储
  2. ES6中有字典,名为Map
  3. 字典的常用操作:键值对的增删改查