前端面试题100道(第一部分)

前端面试题100道

强烈推荐仔细阅读阮一峰的ES6网站阮一峰ES6

1.VUE状态管理器是什么?有什么作用?

状态管理器:Vuex
作用:vuex的作用就是作为一个数据仓库(store),把多个组件的背后的数据都放到store中,然后所有组件通过约定的方式去读取数据和修改数据。

2.Vue权限管理,如何实现?

登录时保存登录状态,一般保存在localstorage中,以做到首次登录后,下次登录不需要账号密码而直接登录,但后台系统不建议直接保存在localstorage中.

3.深复制(后期增加)

3.1深浅复制的区别
浅拷贝指向同一个地址,新旧对象还是共享同一快内存,而深拷贝是另外创造一个一模一样的对象跟地址,即指向一个新的地址,新对象跟原对象不共享内存,因为修改新对象也就不会影响到源对象。

4.VUE中如何使用递归(模板)实现多级菜单?

5.插槽的理解

自定义组件中,写的内容是否显示,在哪里显示,如何显示 – 内容分发机制
插槽的分类:具名插槽,默认插槽

6.对闭包的理解,作用域

1.闭包是什么?

闭包是有权限访问 其他函数作用域的局部变量 的一个函数

这是《 JavaScript高级程序设计 》中给出的定义, 如果你想用一句话就把面试官搞定几乎是不可能的。

因为这句话还存在下面几个深入的问题:

  • 为什么其他非闭包的函数,没有权限访问另一个函数的内部作用域
  • 为什么闭包有这个权限
  • 什么是函数作用域
    面试官更想知道的是你是否知道上面的内容

** 更周全的解释方法**
由于在JS中,变量的作用域属于函数作用域,在函数执行后作用域就会被清理、内存也随之被收回,但是由于闭包是建立在一个函数内部的子函数,由于其可访问上级作用域的原因,即使上级函数执行完,作用域也不会随之销毁,这时的子函数—也就是闭包,便拥有了访问上级作用域中的变量的权限,即使上级函数执行完后,作用域内的值也不会被销毁。

稍微有些啰嗦,但是一分钟以内应该足够了。这样一来,面试官基本上了解了你对于上面三个知识点的是掌握的。

2.闭包解决了什么?

请放心,就凭上面那段话,面试官是不会善罢甘休的。他一定会继续追问,一般来说会问—闭包解决了什么问题。

阮一峰在他的博客中写到:在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

务实一点的说法应该是下面这样:
由于闭包可以缓存上级作用域,那么就使得函数外部打破了“函数作用域”的束缚,可以访问函数内部的变量。以平时使用的 AJAX 成功回调为例,这里其实就是个闭包,由于上述的特性,回调就拥有了整个上级作用域的访问和操作能力,提高了极大的便利。开发者不用去学钩子函数来操作上级函数作用域内部的变量了

	闭包最大的用处有两个 : 1)可以读取函数内部的变量;
								2)让这些变量的值始终保存在内存中。
3.闭包有哪些应用场景

闭包随处可见,一个 Ajax 请求的成功回调,一个事件绑定的回调方法,一个 setTimeout 的延时回调,或者一个函数内部返回另一个匿名函数,这些都是闭包。简而言之,无论使用何种方式对函数类型的值进行传递,当函数在别处被调用时,都有闭包的身影

4.使用闭包应该注意什么

代码难以维护:闭包内部是可以上级作用域,而如果闭包又是异步执行的话,一定要清楚上级作用域都发生了什么,而这样就需要对代码的运行逻辑和JS运行机制相当了解才能弄明白究竟发生了什么。

使用闭包的注意点:1)由于闭包会使得函数中的变量都保存在内存中,从而使得内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄漏。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2) 内存泄漏:程序的运行需要内存。对于持续运行的服务进程,必须及时释放不再用到的内存,否则占用越来越高,轻则影响系统性能,重则导致进程崩溃。不再用到的内存,没有及时释放,就叫做内存泄漏。

总结:
原理比较深奥:想要完全掌握闭包,一定要弄清楚 函数作用域内存回收机制作用域继承 等,然而闭包时随处可见的,很可能开发者在不经意间就写出了一个闭包,理解不够深入的话,很可能造成运行结果与预期不符

7.ajax的兼容以及简书ajax的过程

ajax兼容写法

function createXHR(){
  if(typeof XMLHttpRequest != "undefined"){
    return new XMLHttpRequest();
  }else if(typeof ActiveXObject != "undefined"){
    var version = [
      "MSXML2.XMLHttp.6.0",
      "MSXML2.XMLHttp.2.0",
      "MSXML2.XMLHttp"
    ];
    for(var i = 0;i<3;i++){
      /*return new ActiveXObject(version[i]);*/
      //使用try{}catch{}防止在创建对象时出错
      try{
        return new ActiveXObject(version[i]);
      }catch(e){
        //TODO handle the exception
      }
    }
  }else{
    //如果都不支持,则抛出异常
    throw new Error("您老的浏览器实在是不行了")
    //alert("您老的浏览器实在是不行了");
  }
}

简述ajax的过程

  • 1.创建XMLHttpRequest对象,也就是创建一个异步调用对象
  • 2.创建一个新的HTTP请求,并指定该HTTP请求的方法、URL以及验证信息
  • 3.设置HTTP请求状态变化的函数
  • 4.发送HTTP请求
  • 5.获取异步调用返回的数据
  • 6.使用JavaScript和DOM实现刷新
    . a j a x / .ajax / .ajax/.get / . p o s t / .post / .post/.getJson() / . g e t S c r i p t ( ) / .getScript() / .getScript()/().load()
    Fetch

Axios

8.ES5的继承和ES6继承的区别?

ES5继承的实质是将父类添加到子类的原型链上去, 而ES6继承是利用extend关键字继承父类,然后继承父类的属性和方法。

详解

ES5继承

  • 基本思想:利用原型链让一个引用类型继承另一个引用类型的属性和方法(即通过prototype和构造函数实现)
  • 实质:将父类添加到子类的原型链上去

ES6继承

  • 基本思想:通过extend关键字实现继承,子类可以继承父类中所有的方法和属性,子类必须在construc()方法中调用super()方法,因为新建的子类没有自己的this对象,而是继承了父类的this对象;
  • 实质:利用extend关键字继承父类,然后继承父类的属性和方法

9.react中的redux,为什么一开始可以拿到初始化数据?

redux创建完状态管理器后,会自动调用一次ditpatch实现数据的初始化渲染,从而拥有

10.VUE中,使用VUEX的话,当页面刷新时,仓库中的数据为什么会消失?如果希望数据在刷新后仍然保存,你是怎么处理的?

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值