JS
-
防抖、节流
- 防抖:防止用户在设定的时间间隔里重复点击(一直点只有最后一次执行,除非过1s再点),实现细节:先清空上一个timer,再创建一个新timer
- 节流:一直点,隔1s执行一次,实现细节:设置一个canRun变量,进入timer执行方法前设置成false,每个timer最后设置成true
-
this的4条规则
-
原则:判断一个运行中函数的this绑定,要找到这个函数直接调用位置,找到之后顺序用下面4条原则判断this绑定对象:
-
new
-
显式绑定:call/apply/bind
-
隐式绑定:上下文 xxx.fn(),this指向fn
-
默认:window或undefined
-
箭头函数:词法作用域
-
手写bind:内部用apply 实现
-
-
词法作用域和this的区别
- 词法作用域:作用域由函数声明位置决定,编译器能够预测运行时在哪里能找到它们
- this:4种绑定机制
- 混合词法作用域(var self = this)和this不是一个好的方式,应该使用bind配合this,或者完全使用词法作用域。
-
浏览器事件
- dom0 :xxx.onclick= function () {} 没有兼容性问题
- dom2:xxx.addEventListener('click', () => {}, false) // true=捕获阶段处理回调,false=冒泡阶段处理回调
-
new的过程
- 创建一个新对象obj
- 对obj执行prototype连接
- obj绑定到函数调用的this
- 返回obj
-
实现深拷贝、浅拷贝,loadsh深拷贝实现原理
- 浅拷贝:Object.assign
- 深拷贝:
- JSON.parse(JSON.Stringify(...))
- 递归拷贝每一层对象
-
使用原型的最大好处
-
单例、工厂、观察者项目中实际场景
-
实现js继承 - function A () {},想让function B继承A
- 继承属性:B构造方法中 A.call(B)
- 继承方法:B.ptorotype = Object.create(A) // 这里不要B.ptorotype = new A(),防止A的构造函数副作用对B产生影响
- Object.create(obj)原理:创建一个对象并把这个对象的[[Prototype]]关联到指定对象上
- 修正constructor:Object.defineProperty(B, 'constructor', ...)
-
Array是Object类型吗 是,判断Array类型:
Object.prototype.toString.call(arr) === '[object Array]' -
parseInt的第二个参数代表什么
进制
-
手写数组去重函数
map实现
-
手写jsonp的实现
本地定义全局函数,jsonp接口返回内容作为一个