前端面试题及答案记录Day1

68 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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. 哪些操作会造成内存泄漏

  1. 意外的全局变量引起的内存泄露
  2. 闭包引起的内存泄露
  3. 没有清理的DOM元素引用
  4. 被遗忘的定时器或回调
  5. 子元素存在引起的内存泄露
  6. 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(数组实例):数组特有方法