前端面试问题总结:

346 阅读4分钟

1、js基础问题

   const promise =(params)=>{
    let {url,data={},methods,async=true,timeout=0} = params
    console.log('url,data,methods,async:',url,data,methods,async)
    const isUrlParams = url.indexOf('?')>-1
    let paramsStr = ''
    if( methods.toLowerCase()=='get'){
        if((typeof data == 'object')&&JSON.stringify(data)!='{}'){
            for(let key in data){
                paramsStr+=`&${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`
            }
            if(!isUrlParams){
                paramsStr=paramsStr.slice(1)
                paramsStr="?" +paramsStr
            }
            data=paramsStr
        }
    }
    console.log('参数:',data)
    let xhr =new XMLHttpRequest()
    xhr.timeout=timeout>0?timeout:10000
    xhr.open(methods,url,async)
    xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded')
    xhr.send(data)
   return new Promise((resove,reject)=>{
       console.log('promise-start')
        xhr.ontimeout=()=>{
            reject({stat:0,msg:'网络超时'})
        }
        xhr.onreadystatechang=()=>{
            if(xhr.readyState==0){
                console.log('尚未调用 open 方法')
                console.log('statusText:',xhr.statusText)
            }
            if(xhr.readyState==1){
                console.log('已调用 open 但还未发送请求(未调用 send)')
                console.log('statusText:',xhr.statusText)
    
            }
            if(xhr.readyState==2){
                console.log('已发送请求(已调用 send)')
                console.log('statusText:',xhr.statusText)
    
            }
            if(xhr.readyState==3){
                console.log('已接收到请求返回的数据')
                console.log('statusText:',xhr.statusText)
            }
            if(xhr.readyState==4){
                console.log('ajax请求完成!')
                console.log('statusText:',xhr.statusText)
                if(xhr.status>=200&&xhr.status<300 || xhr.status==304){ // 304表示请求内容未改变,从缓存中读取
                    resove(xhr.responseText)
                }else{
                    reject({stat:0,msg:'请求出错,请重试!'})
                }
            }
        }
        xhr.onerror=error=>{
            reject(error)
        }
    })
} 
  • Async await promise generator 之间的关系:Async await promise generator 之间的关系
  • Number有哪些方法
  • let var const 的区别
  • script的defer 和async的区别
  • 什么是变量对象
  • 谈谈作用域链
  • 谈谈原型链
  • 继承有哪几种方式
  • 设计模式:- 设计模式:设计模式
  • 谈谈对eventloop的理解
  • 跨域(原因,解决方案)
  • 怎么区分简单请求和复杂请求
  • 模块化规范:commonjs amd cmd 以及es6模块的区别,es6模块实现的原理,是同步还是异步:www.cnblogs.com/shirly77/p/…

blog.csdn.net/weixin_4310… www.jianshu.com/p/da97ec65d…

模块化规范:模块化规范

  • 从输入URL到页面加载发生了什么

  • sessionStorage、localStorage、cookie有什么区别

  • post、get有什么区别

  • 什么是预检请求

  • mvc mvvm的区别

  • 事件委托

  • 事件冒泡

  • async awit

  • 迭代协议的几种方式和优缺点

  • 数组方法:数组方法:设计模式

  • 对象方法

  • 字符串方法

  • 判断原型方法

  • 数据劫持如何实现

  • 闭包(手写闭包)

  • this指向问题(顺带考察call apply bind 箭头函数几种使用方法)

  • bable 解决了什么问题

  • set和map的区别

  • 设计模式

  • scheame url 协议实现原理(吊起端能力如何实现)

  • 基本数据类型有哪些

2、 css基础问题

  • flex布局:整体属性和使用方法,手写布局(两边定宽,中间自适应,flex:1)

  • position 除了四种常用属性,还要了解粘连布局

  • translate 和 position那个会引起回流重绘,原因是什么

  • c3新属性有哪些

  • 手写三角形

  • 移动端适配方案

  • rem 实现原理和vw vh的区别

  • 1像素问题

  • 回流重绘是什么,区别和关系是什么

  • bfc 是什么,引起bfc有哪些因素,解决方案是什么

  • 双边距问题

  • css选择器有哪些、权重分别是什么

  • 距离解决过移动端哪些兼容问题

  • 手写抖动动画

  • 实现一个简单的c3动画

  • 语义话标签有哪些

  • 布局方式有哪些

  • Lottie动画如何实现

  • 浏览器背后故事:呈现html页面到用户这个过程发生了什么

3、http

  • 状态码(常问:301、302 303、304):状态码:状态码
  • 缓存策略有哪几种,具体是怎么实现的:缓存策略:缓存策略
  • keep-alive
  • http2解决了什么问题,优缺点分别是什么
  • 返回报文由哪几部分组成
  • http和https的区别是什么

4、vue

  • 响应式原理:响应式原理:响应式原理
  • $set实现原理:实现原理:实现原理
  • 路由按需加载是如何实现的
  • keep-alive
  • dom更新方式
  • vuex如何使用,使用场景
  • 组件通信方式
  • 路由守卫
  • v-model实现原理
  • v-for key的作用:key的作用:nextTick实现原理
  • 生命周期有哪些,分别实现了什么
  • $nextTick实现原理 : nextTick实现原理:nextTick实现原理
  • watch和computed的区别: watch和computed的区别:watch和computed的区别

5、 优化

6、前端安全

7、算法+手写面试题

  • 手写实现斐波那契数列:手写实现斐波那契数列:手写实现斐波那契数列
  • 手写去重
  • 实现快排
  • 冒泡排序
  • 二叉树
  • 手写promise处理接口并发
  • 手写实现数组降纬
  • 手写实现数组排序
  • 手写ajax
  • 手写防抖节流函数:手写防抖节流函数:手写防抖节流函数
  • 手写实现evenBus

8、 WEBPACK

  • 常用插件有哪些
  • 实现原理

9、 小程序

  • 小程序的实现原理
  • 如何实现下拉刷新
  • 页面跳转的几种方式
  • 小程序增强框架如何选型

10、 一面面试题

 1、实现
  Class EventEmitter {}
  Const ee = new EventEmitter()
  ee.on(‘aaa’, () => {})
  ee.emit(‘aaa’, 123)
2.输出
  var a = {fa: () => {console.log(this)},fb: function(){console.log(this)}}
  a.fa()
  a.fb()
3.写一个闭包
4. 实现
  var arr = [1,2,[3,4,[5,6,[7,8]]]] 
  function flatArr (arr, level) {} 
  example output: [1,2,3,4,[5,6,[7,8]]]
  • 头条面试题:
 Js线程和进程的问题
 
  线程与进程之间的关系
  
  浅拷贝与深复制
  
  Js事件循环
  
  Promise链式调用的写法
  
  catch之后还会进行then的调用吗
  
  304缓存读取涉及到相应头与请求头有哪些
  
  http 响应结果又哪几部分组成
  • event loop经典面试题:
//请写出输出内容
async function async1() {
   console.log('async1 start');
   await async2();
   console.log('async1 end');
}

async function async2() {
   console.log('async2');
}

console.log('script start');

setTimeout(function() {
   console.log('setTimeout');
}, 0)

async1();

new Promise(function(resolve) {
   console.log('promise1');
   resolve();
}).then(function() {
   console.log('promise2');
});

console.log('script end');

/*
输出结果:

script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout
*/