前端面试题整理
前言
本人并不是技术大牛(但是会一直朝着那个方向前进),本文会分享一些本人在面试过程中遇到的一些比较有意思的前端面试题目,如有不对之处还请各位巨牛批评指正!
Javascript
Q: 使用promise封装一个readfile函数 ?
1 | const fs = require('fs') |
Q:去除连续重复字符串?例:abcdaaabcd 输出abcdabcd ?
1 | function str_ (str) { |
Q: 正则将电话号码中间四位变成#号 ?
1 | // 方式 1: 正则分组 |
Q: 查看下列代码运行结果 ?
1 | try { |
Q: 写出下列代码运行打印结果 ?
1 | let foo = function() { console.log(1) }; |
Q: 数组拆解: flat: [1,[{a:1},3]] –> [1, {a: 1}, 3] ?
- 方式 1,缺陷如果元素是对象会报错
1 | Array.prototype.flat = function() { |
- 方式 2,es6数组新扩展,参数是维度,可填写无穷大
1 | [1,[2,3]].flat(1) ==> [1,2,3] |
- 方式 3,reduce 和 concat
1 | var arr1 = [1,{sas: '222'},3,[1,2,3,4, [2,3,4]]]; |
Q: 写一个函数输出: [‘a’, ‘b’, ‘c’, ‘d’] => { a: { b: { c: ‘d’ } } } ?
1 | function to_(arr) { |
Q: 封装一个Array.filter方法 ?
- 1.使用Array.reduce方法封装,还有其他方法,希望大家帮忙补充!
1 | function Filter(arr, callback) { |
Q: 什么是防抖和节流?有什么区别?如何实现 ?
- 防抖
1 | // 触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间 |
- 节流
1 | // 高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率 |
Q: 创建一个从1——5数组 ?
- 字面量
1 | const arr = [1,2,3,4,5]; |
- 方法
1 | const arr = Array.of(1,2,3,4,5) |
Q: 给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标 ?
- 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
1 | // 给定 nums = [2, 7, 11, 15], target = 9 |
- 附leetcode地址:leetcode
Q: [4,3,2,7,8,2,3,1,2,3,4,5,3,8] ==> [2,3,4,8] ?
1 | function handlerData (arr) { |
Q: let、const、var区别 ?
1 | // 查看下列输出 |
Q: 实现一个new、bind、apply、call方法 ?
- 实现new关键字
1 |
|
- 实现call和apply方法
1 | // call |
- 实现bind方法
1 | Function.prototype.bind2 = function (...args) { |
Q: 实现一下 element.js ?
1 | const el = new require('./element.js'); |
Q: 请写出格式化以下字符串的函数?
1 | // 将字符串"I'm?$$$driving$??$to$?beijing$?$$after$breakfast"格式化为"I'm driving to Beijing after breakfast" |
Q: 实现一下$on/$off/$emit ?
- 就是让我们实现下vue的订阅者模式,其实双向绑定也是这样实现的!
- 这三个函数主要依赖的是一个大的依赖收集器来做的!(PS:具体实现请看下边!)
1 | class dep { |
Q: 数据结构(栈和堆)和数据类型 ?
- 基本数据类型
- js基本数据类型包括:undefined,null,number,boolean,string.基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值
- 基本数据类型的值是不可变的
- 基本数据类型不可以添加属性和方法
- 基本数据类型的赋值是简单赋值
- 基本数据类型的比较是值的比较
- 基本数据类型是存放在栈区的
- 引用类型
- 引用类型的值是可以改变的
- 引用类型可以添加属性和方法
- 引用类型的赋值是对象引用
- 引用类型的比较是引用的比较
- 引用类型是同时保存在栈区和堆区中的
- 基本包装类型(包装对象)
- 参考资料: 基本数据类型和引用类型的区别详解
CSS
Q:弹性盒子中 flex: 0 1 auto
表示什么意思?
1 | 三个参数分别对应的是 flex-grow, flex-shrink 和 flex-basis,默认值为0 1 auto。 |
webpack
Q: webpack
中 loader
和 plugin
的区别是什么 ?
- 这里引用官方文档原文:
1 | While loaders are used to transform certain types of modules, plugins can be leveraged to perform a wider range of tasks like bundle optimization, asset management and injection of environment variables. |
- 网友解释
1 | # loader:让webpack能够处理非js文件(自身职能理解js),然后你就可以利用 webpack 的打包能力,对它们进行处理。 |
网络请求方面
Q: 谈谈 cookie、localStorage 以及 sessionStorage 区别,以及cookie 为什么不建议用
- 三者的异同:上面的使用方式说好了,下面就唠唠三者之间的区别,这个问题其实很多大厂面试的时候也都会问到,所以可以注意一下这几个之间的区别。生命周期:cookie:可设置失效时间,没有设置的话,默认是关闭浏览器后失效localStorage:除非被手动清除,否则将会永久保存。
- sessionStorage: 仅在当前网页会话下有效,关闭页面或浏览器后就会被清除。
- 存放数据大小:cookie:4KB左右
- localStorage和sessionStorage:可以保存5MB的信息。
- http请求:cookie:每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题
- localStorage和sessionStorage:仅在客户端(即浏览器)中保存,不参与和服务器的通信
- 易用性:cookie:需要程序员自己封装,源生的Cookie接口不友好
- localStorage和sessionStorage:源生接口可以接受,亦可再次封装来对Object和Array有更好的支持
- 应用场景:从安全性来说,因为每次http请求都会携带cookie信息,这样无形中浪费了带宽,所以cookie应该尽可能少的使用,另外cookie还需要指定作用域,不可以跨域调用,限制比较多。但是用来识别用户登录来说,cookie还是比storage更好用的。其他情况下,可以使用storage,就用storage。
- storage在存储数据的大小上面秒杀了cookie,现在基本上很少使用cookie了,因为更大总是更好的,哈哈哈你们懂得。
- localStorage和sessionStorage唯一的差别一个是永久保存在浏览器里面,一个是关闭网页就清除了信息。localStorage可以用来夸页面传递参数,sessionStorage用来保存一些临时的数据,防止用户刷新页面之后丢失了一些参数。