高频前端面试题汇总

js中的继承

  1. 原型链继承
  2. 借用构造函数(经典继承)
  3. 组合继承
  4. 原型式继承
  5. 寄生式继承
  6. 寄生组合继承

1.1-事件委托面试点

  1. 什么是事件委托
    给父元素注册事件,委托给子元素处理

  2. 事件委托原理:
    事件冒泡

  3. 事件委托注意点
    this:指向父元素
    e.target:指向触发事件的子元素

  4. 事件委托场景 :
    给动态新增元素注册委托事件

1.2-localStorage与sessionStorage区别

  1. 相同点:
    作用一致:用于存储数据
    都是只能存储字符串类型数据(上限5MB)

  2. 不同点: 存储方式不同
    localStorage:硬盘存储(永久存储,页面关闭还在,存在硬盘)
    sessionStorage:内存存储(临时存储,页面关闭了就消失)

  3. localStorage与sessionStorage如何存储引用类型数据(数组和对象)
    转json存储

1.1-new关键字做了哪些事情

  1. 创建空对象
  2. this指向这个对象
  3. 给对象赋值
  4. 返回实例对象

1.2-原型链相关

  1. 原型链作用:面向对象继承
  2. 对象访问原型链规则:就近原则
    先访问自己,自己没有找原型,原型没有找原型的原型,直到原型链终点。 如果还找不到,属性则获取undefined,方法则报错xxx is not defined

当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去
它的__proto__隐式原型上查找,即它的构造函数的 prototype,如果还没有找到就会再在
构造函数的 prototype 的__proto__中查找,这样一层一层向上查找就会形成一个链式结
构,我们称为原型链。

1.3-如何判断this指向

this:谁调用我,我就指向谁
普通函数 函数名():window
对象方法 对象名.方法名():对象
构造函数 new 函数名():new创建的实例对象

1.4-call apply bind区别

  • 共同点:
    • 都可以修改this,第一个参数都是修改的this
  • 不同点
    • 传参方式不同: call是逐一传参, apply是数组/伪数组传参
      • 函数名.call(修改的this,参数1,参数2…)
      • 函数名.apply(修改的this,数组/伪数组)
    • 执行机制不同:call和apply会立即执行函数,bind不会立即执行
      • bind会得到一个修改this后的新函数

1.5-如何判断数据类型

    1. typeof有两种数据类型无法检测: null 、array
    1. Object.prototype.toString.call(数据)

1.6-闭包

  • 1.闭包是什么 :
    • 闭包 是 使用其他函数内部变量的 函数 (闭包 = 函数 + 其他函数内部变量)
    • 闭包 = 函数 + 上下文引用
  • 2.闭包作用 : 解决全局变量污染

我的理解是,闭包就是能够读取其他函数内部变量的函数。

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁

闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

1.7-递归及应用场景

  • 1.递归 : 在函数内部调用自己
  • 2.递归作用 :
    • 浅拷贝与深拷贝
    • 遍历dom树

1.8-浅拷贝与深拷贝

  • 1.浅拷贝:拷贝地址, 修改拷贝后的数据原数据也会变化
  • 2.深拷贝:拷贝数据, 修改拷贝后的数据原数据不会变化
    • 推荐 json : let obj = JSON.parse( JSON.stringify( 对象 ) )
    • 递归

1.9-数组常用迭代方法

1.数组map遍历:

  1. map方法作用: 根据某种规则映射数组,得到映射之后的新数组
    说人话: 按照某种规则,对数组每一个元素进行处理
    应用场景 : (1)数组中所有的元素 * 0.8 (2)将数组中的js对象 隐射成 html字符串

  2. map语法特点 :

       (1) 回调执行次数  ==  数组长度
       (2) 回调函数内部return
           return 新元素
           如果没有return, 新元素是undefined
       (3) 方法自身的返回值 
           映射后的新数组
    

2.数组filter遍历:

  1. filter方法作用: 根据条件,筛选数组
    应用场景 : (1)筛选数组中的偶数 (2)商品价格筛选

  2. filter语法特点 :

        (1) 回调执行次数  ==  数组长度
        (2) 回调函数内部return
            return true : 满足筛选条件,放入新数组中
            return false : 不满足筛选条件,不放入新数组中
        (3) 方法自身的返回值 
            筛选之后的新数组
    

3.数组forEach遍历

  1. forEach方法作用: 相当于 for循环另一种写法
    应用场景 : 遍历数组

  2. forEach语法特点 :

         (1) 回调执行次数  ==  数组长度
         (2) 回调函数内部return
             无
         (3) 方法自身的返回值 
             无
    

4.数组some遍历

  1. some方法作用: 判断 数组中是否有满足条件的元素 (逻辑或 ||, 有任意一个满足即可)
    应用场景 : (1)判断数组中有没有奇数
    (2)非空判断 : 判断表单数组中,有没有元素value为空

  2. some语法特点 :

         (1) 回调执行次数  !=  数组长度
         (2) 回调函数内部return
             return true 
                 * 循环结束。 找到满足条件的元素, some自身返回true
             return false : 
                 * 循环继续。没有找到满足条件的,如果所有的元素都是返回false,最终some默认返回false
         (3) 方法自身的返回值 
             true: 有满足条件的元素
             false: 没有满足条件的元素
    

5.数组every遍历

  1. every 方法作用: 判断 数组中是否 所有元素 都满足条件 (逻辑&&, 全部满足)
    应用场景 : (1)判断数组中是否所有元素都是 偶数
    (2)开关思想 : 购物车是否全选

  2. every语法特点 :

         (1) 回调执行次数  !=  数组长度
         (2) 回调函数内部return
             return true 
                 * 循环继续。满足条件,如果所有元素都满足,最终every默认返回值true
             return false : 
                 * 循环结束。不满足条件,此时every返回值false
         (3) 方法自身的返回值 
             true: 所有满足都满足条件
             false: 有元素不满足条件
    

6.数组 findIndex方法

  1. findIndex方法作用: 找元素下标
    应用场景 :
    (1)如果数组中是值类型,找元素下标用: arr.indexOf( 元素 )
    (2)如果数组中是引用类型,找元素下标: arr.findIndex( )

  2. findIndex语法特点 :

        (1) 回调执行次数  !=  数组长度
        (2) 回调函数内部return
            return true 
                * 循环结束。 找到元素,返回当前元素下标
            return false : 
                * 循环继续。没找到。 如果全部都是false,最终返回固定值-1
        (3) 方法自身的返回值 
            -1 : 没有
            下标 : 有
    

7.数组reduce方法

  1. 数组reduce遍历 : 为每一个元素执行一次回调,返回最后一次回调的结果

  2. reduce场景 : 求数组累加和

reduce的使用格式

reduce可以返回任意值,功能就是将一个数组的内容聚合成单个值。这个值可以是数字、字符串、甚至可以是对象或新数组

数组常用api

常用数组API汇总

什么是回调地狱,如何解决

  • 什么是回调地狱(函数作为参数层层嵌套

如何解决

  • 保持你的代码简短(给函数取有意义的名字,见名知意,而非匿名函数,写成一大坨)
  • 模块化(函数封装,打包,每个功能独立,可以单独的定义一个js文件Vue,Creact中通过import导入就是一种体现)
  • 处理每一个错误
  • 创建模块时的一些经验法则
  • Promise承诺、2F生成器、ES6等

for in和for of的区别

  1. 推荐在循环对象属性的时候,使用for…in,在遍历数组的时候的时候使用for…of。
  2. for…in循环出的是key,for…of循环出的是value
  3. 注意,for…of是ES6新引入的特性。修复了ES5引入的for…in的不足
  4. for…of不能循环普通的对象,需要通过和Object.keys()搭配使用

递归及应用场景

递归:如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。
简单理解:函数内部自己调用自己,这个函数就是递归函数
应用场景:树形组件

https和http的区别:

HTTP是明文传输,HTTPS通过SSL\TLS+进行了加密

  • HTTP 的端口号是80,HTTPS 是443
  • HTTPS需要到CA+申请证书,一般免费证书很少,需要交费
  • HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全

js延迟加载的方式

defer属性
async属性
动态创建DOM方式
使用jQuery的getScript方法
使用setTimeout延迟方法
让JS最后加载

get请求和post请求的区别:

GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符
POST:一般用于修改服务器上的资源,对所发送的信息没有限制。
GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值,也就是说Get是通过地址栏来传值,而Post是通过提交表单来传值。

哈希路由和history路由的区别:

Hash模式:

  1. url路径会出现#字符
  2. Hash值不包括在HTTP请求中,它是交由前端路由处理,所以改变hash值时不会刷新页面,也不会向服务器发送请求
  3. Hash值的改变会触发hashchange事件

History模式:

  1. 整个地址重新加载,可以保存历史记录,方便前进后退
  2. 使用HTML5+API(旧浏览器不支持)和HTTP服务端配置,没有后台配置的话,页面刷新时会出现404

父子组件的生命周期钩子:

父子组件的生命周期钩子

v-mode和.sync的对比

两者本质都是一样,并没有任何区别:“监听一个触发事件” =“(val)=> value = val”。

  1. 只不过v-model默认对应的是input或者textarea等组件的input事件,如果在子组件替换这个input事件,其本质和.sync修饰符一模一样。比较单一,不能有多个。
  2. 一个组件可以多个属性用.sync修饰符,可以同时"双向绑定多个“prop”,而并不像v-model那样,一个组件只能有一个。

vue路由钩子beforeEach的参数

to:Route:即将要进入的目标路由对象
from:Route:当前导航正要离开的路由
next:Function:一定要调用该方法来resolve这个钩子。执行效果依赖next方法的调用参数。

计算属性和watcher的使用区别

计算属性和watcher的使用区别

v-if和v-show的区别:

v-if是动态添加,当值为false时,是完全移除该元素,即dom树中不存在该元素。
v-show仅是隐藏 / 显示,值为+false+时,该元素依旧存在于dom树中。若其原有样式设置了+display:none则会导致其无法正常显示。

key的作用:

key的作用主要是为了高效的更新虚拟DOM,其原理是vue在patch过程中通过key可以精准判断两个节点是否是同一个,从而避免频繁更新不同元素,减少DOM操作量,提高性能。

vue2中$nextTick:

在下次DOM更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的DOM。

vue2中响应式的原理

主要做了这么几件事:数据劫持、收集依赖、派发更新

  1. 数据劫持:new+Vue的时候遍历data对象,用Object.defineProperty给所有属性加上了getter和setter
  2. 依赖的收集:render的过程,会触发数据的getter+,在getter的时候把当前的watcher对象收集起来
  3. 派发更新:setter的时候,遍历这个数据的依赖对象(watcher对象),进行更新
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值