一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
1. Promise函数的理解
Promise函数是解决回调地狱的一种解决方案。它通过改变状态来完成异步操作。Promise对象的状态改变,只有两种可能:从pending状态变为fulfilled;和从pending变为rejected。
2. 箭头函数和普通函数的区别
- this:普通函数this指向调用者,而箭头函数this指向是固定不变的,一直指向定义函数的环境
- 箭头函数不能作为构造函数
- 箭头函数没有原型属性
- 箭头函数不能当作Generator函数,不能使用yield关键字
- 箭头函数不支持变量提升
3.var、let和const的区别
- var是定义全局变量的、变量名可以重复,定义的常量也可也改变
- let和const是在块级作用域起作用的,let定义变量且变量不可以先使用再声明,const定义常量且不可变。
4. 防抖和节流
防抖:当事件被触发后,延迟N秒后再执行,如果在这N秒内事件又被触发,则重新计时。(王者的回城)
节流:当事件被频繁触发,减少一段时间内事件被频繁触发的频率(射击游戏)
//输入框防抖
//1.定义计数器id
var timer = null
//2.定义防抖函数
function debounce(kw){
timer = setTimeout(function(){
getData(kw)
},500)
}
//3.输入框事件
$("ipt").on("keyup",function(kw){
//点击就清除上一次计数器
clearTimeout(timer)
//重新开始计时
debounce(kw)
})
//鼠标跟随效果节流
//1.定义一个节流阀
var timer = null
//2.鼠标移动事件
$(document).on("mousemove",function(e){
//判断节流阀是否为空,不为空,则上次触发时间间隔不足15毫秒,不执行
if(timer) return
timer = setTimeout(function(){
$(".angle").css("left",e.pageX+"px").css("top",e.pageY+"px")
timer = null
},15)
})
5.JS有哪些垃圾回收机制?
- 标记清理
- 引用计数
6. 说说你对闭包的理解?
根据《JavaScript高级程序设计》提到的:闭包就是有权访问另一个函数作用域内变量的函数。
被访问的变量所在的函数——闭包函数
闭包实际上是延申了变量的作用范围。
7. 哪些操作会造成内存泄漏
- 意外的全局变量引起的内存泄露
- 闭包引起的内存泄露
- 没有清理的DOM元素引用
- 被遗忘的定时器或回调
- 子元素存在引起的内存泄露
- IE7/8引用计数使用循环引用产生的问题
8.使用indexOf去重
思路:
-
定义一个新数组
-
使用循环遍历旧数组的每一项,使用indexOf判断新数组中是否存在:如果不存在,indexOf会返回-1,我们就把它存入新数组中
var arr = [1,2,3,4,12,4,5,2] var newArr = [] for( var item = 0;item < arr.length; item++){ if(newArr.indexOf(arr[item]) === -1){ newArr.push(arr[item]) } }
9. 实现instanceof
思路:
-
instanceof无法判断基本数据类型和null,直接返回false
-
拿到target的原型,使用Object.getPrototypeOf(target)方法
-
沿着原型链查找,使用Object.getPrototypeOf(proto),如果proto不为null且没找到原型对象(proto = origin.prototype),继续查找;找到(proto = origin.prototype),则返回true
function myInstanceof(target, origin){ //基本数据类型,直接返回false if(typeof target !== "object" || target === null) return false //拿到target的__proto__ let proto = Object.getPrototypeOf(target) //proto不为null就继续
while(proto){ //找到相同的原型对象 if(proto == origin.prototype) return true //继续沿着原型链找 proto = Object.getPrototypeOf(proto) } return false }
10.判断数据类型
- typeof:对值类型、函数进行判断。但不能精确判断null、对象、数组,其结果都是Object
- instanceof:可以对引用类型进行判断。不能判断基本数据类型。运行原理:顺着原型链查找原型
- Object.prototype.toString.call(要判断的类型):所有原始类型都能判断
- Array.isArray(数组实例):数组特有方法