[面试题]js、简单算法 - (极简版)

467 阅读2分钟

JS

  1. 防抖、节流

    1. 防抖:防止用户在设定的时间间隔里重复点击(一直点只有最后一次执行,除非过1s再点),实现细节:先清空上一个timer,再创建一个新timer
    2. 节流:一直点,隔1s执行一次,实现细节:设置一个canRun变量,进入timer执行方法前设置成false,每个timer最后设置成true
  2. this的4条规则

    1. 原则:判断一个运行中函数的this绑定,要找到这个函数直接调用位置,找到之后顺序用下面4条原则判断this绑定对象:

    2. new

    3. 显式绑定:call/apply/bind

    4. 隐式绑定:上下文 xxx.fn(),this指向fn

    5. 默认:window或undefined

    6. 箭头函数:词法作用域

    7. 手写bind:内部用apply 实现

  3. 词法作用域和this的区别

    1. 词法作用域:作用域由函数声明位置决定,编译器能够预测运行时在哪里能找到它们
    2. this:4种绑定机制
    3. 混合词法作用域(var self = this)和this不是一个好的方式,应该使用bind配合this,或者完全使用词法作用域。
  4. 浏览器事件

    1. dom0 :xxx.onclick= function () {} 没有兼容性问题
    2. dom2:xxx.addEventListener('click', () => {}, false) // true=捕获阶段处理回调,false=冒泡阶段处理回调
  5. new的过程

    1. 创建一个新对象obj
    2. 对obj执行prototype连接
    3. obj绑定到函数调用的this
    4. 返回obj
  6. 实现深拷贝、浅拷贝,loadsh深拷贝实现原理

    1. 浅拷贝:Object.assign
    2. 深拷贝:
      1. JSON.parse(JSON.Stringify(...))
      2. 递归拷贝每一层对象
  7. 使用原型的最大好处

  8. 单例、工厂、观察者项目中实际场景

  9. 实现js继承 - function A () {},想让function B继承A

    1. 继承属性:B构造方法中 A.call(B)
    2. 继承方法:B.ptorotype = Object.create(A) // 这里不要B.ptorotype = new A(),防止A的构造函数副作用对B产生影响
      1. Object.create(obj)原理:创建一个对象并把这个对象的[[Prototype]]关联到指定对象上
    3. 修正constructor:Object.defineProperty(B, 'constructor', ...)
  10. Array是Object类型吗 是,判断Array类型:

    Object.prototype.toString.call(arr) === '[object Array]'
    
  11. parseInt的第二个参数代表什么

    进制

  12. 手写数组去重函数

    map实现

  13. 手写jsonp的实现

    本地定义全局函数,jsonp接口返回内容作为一个