前端面试题目总结——持续更新

本文涵盖前端面试中的关键知识点,包括CSS盒子模型、页面加载优化、闭包原理、异步编程技巧、事件流与委托、跨域访问解决方案、Promise与async/await等,深入解析JavaScript特性与Web开发最佳实践。
1 面试题目
  1. css盒子模型
    答:页面中所有的元素都是盒子,盒子模型包括外边距+边框+内边距+元素宽度
  2. 页面加载如何优化
    1)尽量减少HTTP请求数, 如 合并文件,脚本,CSS,CSS Sprites,
    2)减少DOM元素的数量
    3)尽量少用iframe
    4)杜绝404
    5)把样式表放在顶部
    6)尽量减少DOM访问
    7)把脚本放在底部
    8)把JavaScript和CSS放到外面
    9)压缩JavaScript和CSS
  3. [ , , , , , ].length
  4. 顶级域名 一级域名 二级域名 三级域名
  5. Cookie SessionStorage LocalStorage
  6. bind(), on(), live(),delegate()
  7. ajax axios fetch
    1)ajax 基于 XMLHttpRequests
    2)axios 基于XMLHttpRequests
    3)fetch 基于Service Workers
  8. TypeScript
    1)TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准。
    2)TypeScript 设计目标是开发大型应用,它可以编译成纯 JavaScript,编译出来的 JavaScript 可以运行在任何浏览器上
    3)TypeScript 是一种给 JavaScript 添加特性的语言扩展
  9. PWA Hybrid flutter severless
    1)PWA(Progressive web apps,渐进式 Web 应用)运用现代的 Web API 以及传统的渐进式增强策略来创建跨平台 Web 应用程序
    2)Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面
  10. url-页面加载完成的整个流程
    https://blog.csdn.net/wlk2064819994/article/details/79756669
  11. HTTP 默认端口 80 HTTPS默认端口 443 通常采用非对称加密算法
  12. 闭包
    闭包的 原理 和 用处
function countFuns(){
   var funs = [];
   for(var i = 0; i < 10; i++){
       funs[i] = function(){ return i }
   }
   return funs;
}
var funs = countFuns();
console.log(funs[1]());
  1. 优雅降级与渐进增强
    https://blog.csdn.net/qq_41800366/article/details/102458967
  2. XMLHttpRequest().readyState的五种状态
    https://blog.csdn.net/alex8046/article/details/40587939
  3. h5的video标签支持的视频格式
    1) MP4 = MPEG 4文件使用 H264 视频编解码器和AAC音频编解码器
    2)WebM = WebM 文件使用 VP8 视频编解码器和 Vorbis 音频编解码器
    3) Ogg = Ogg 文件使用 Theora 视频编解码器和 Vorbis音频编解码器
  4. XHTML是什么
    XHTML 是更严谨更纯净的 HTML 版本。
    XHTML 元素必须被正确地嵌套。
    XHTML 元素必须被关闭。
    标签名必须用小写字母。
    XHTML 文档必须拥有根元素。
  5. Ajax的优缺点
    ajax的优势:单页面应用(SPA)
    1)无刷新更新数据(局部刷新)
      Ajax最大的优点就是能在不刷新整个页面的情况下维持与服务器通信
    2)异步与服务器通信
      使用异步的方式与服务器通信,不打断用户的操作
    3)前端与后端负载均衡
      将一些后端的工作移到前端,减少服务器与宽带的负担
    4)界面与应用分离
      ajax使得页面与应用分离,也就是数据与呈现相互分离
    ajax的劣势:
    1)ajax干掉了Back与History功能,即对浏览器机制的破坏
    2)安全问题
    3)对搜索引擎支持较弱
  6. EventEmitter()
    https://www.runoob.com/nodejs/nodejs-event.html
  7. border-radius
    将一个宽高都是100px的div变成圆形,如何设置border-radius;
    只要border-radius: 50% 及以上,都可以,100%,200%,高于50%显示的效果和50%一样!
  8. 那些方式可以实现POST请求
    1)script 标签
    2)img 标签 (待确认)
    3)form 标签
  9. 严格模式 ‘use strict’
    https://www.cnblogs.com/liaojie970/p/7154144.html
  10. setTimeout()
    其实这个方法有三个参数,如果不知道,下面这道题就会出错;
    setTimeout(function, milliseconds, param1, param2, …)
    1)function 必需。要调用一个代码串,也可以是一个函数。
    2)milliseconds 可选。执行或调用 code/function 需要等待的时间,以毫秒计。默认为 0。
    3)param1, param2, … 可选。 传给执行函数的其他参数(IE9 及其更早版本不支持该参数)。
 (function(){
    for( var i = 0; i < 5; i++){
         setTimeout(console.log, i, i)
     }
 })()
  1. js组成部分
    1)ECMAScript: (3/5/6/7)它是JS语言的标准,规定了JS的编程语法和基础核心知识
    2)DOM: document object model 文档对象模型,提供给JS很多操作页面中元素的属性和方法
    3)BOM: browser object model 浏览器对象模型 ,提供了很多操作浏览器 的属性方法,而这些方法都存放在window浏览器对象上
  2. 解释一下变量声明提前
  3. 如何跨域访问
    1) jsonp:对方网站必须提供一个JSON格式的接口:缺点,只能发送get请求
    2)cors:在服务端设置头信息
    如在php中:header(‘Access-Control-Allow-Origin:http://localhost’)或者header(‘Access-Control-Allow-Origin:*’)
    缺点:
    1.兼容性,因为它是ajax2出的,2007年,但是现在已经不存在了
    2.对方网站必须设置你的白名单,一般还是用于公司内部的多个网站之间通信。
    3)反向代理:在自己的服务器上,去获取对方服务器上的数据,然后再给自己的前端。
  4. js如何判断一个数组
    四种方法 https://blog.csdn.net/qq_41800366/article/details/100666487
  5. 阐述一下js严格模式
  6. 弹性盒模型
    http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html
  7. 负载均衡
  8. linux指令
    https://www.runoob.com/linux/linux-command-manual.html
  9. webpack了解吗?用过哪些功能
  10. 对css预编译器有所了解吗?
    1)sass
    2)less
  11. vue和react的区别
    https://cn.vuejs.org/v2/guide/comparison.html
  12. ajax跨域的几种方式
  13. 数组去重的四种方法
    https://blog.csdn.net/qq_41800366/article/details/100875986
  14. 一个不固定大小的元素,在一个容器中如何实现上下左右居中?
// 方法1  假设元素id为test
#test{
     position: absolute;
     left: 0;
     right: 0;
     top: 0;
     bottom: 0;
     }

// 方法2 transform:translate()
// 原理是translate是相对于元素本身移动的
#test{
     position: absolute;
     left: 50%;
     top: 50%;
     transform: translate(-50%,-50%);
     }
// 方法3 弹性盒模型 
// 假设父容器id为parent
#parent{
     display: flex;
     }
#test{
    margin: auto;
     }
  1. call apply bind 的区别?
// 相同点: 都是修改this的指向
// 不同点:
function foo(n1,n2,n3){
    console.log(this);
    console.log(n1,n2,n3);   
}

foo(1,2,3);

// call: 参数是不限制的
foo.call(document,1,2,3);

// apply: 两个参数
foo.apply(document,[1,2,3]);

// bind:它只是修改指向,但是不执行函数
// call和apply在修改指向的同时,还要把函数也执行了
 foo.bind(document,1,2,3);
 foo.bind(document)(1,2,3); // 这样才执行了 或者
 foo.bind(document,1)(2,3); //这三种传1,2,3的方法都是正确的
  1. saync/await:异步问题,基于promise操作
  2. promise:解决异步问题,很多框架都是基于promise实现的
  3. set、map数据结构
  4. … 扩展运算符 | 剩余参数
  5. 箭头函数
  6. 模板字符串
  7. 解构赋值
  8. for …of
  9. 对象简写
  10. symbol
  11. import from (ES6 模块化写法)
  12. fetch
  13. axios
  14. class 类{}
  15. let const
  16. es6->es5 工具 babel
  17. XSS攻击
  18. CSRF攻击
  19. 事件流
  20. 事件委托
  21. ajax 中 的所有参数 readyState, status
  22. js 中的原型继承
  23. 计算机网络知识 DNS CDN HTTP TCP
  24. 常见攻击,加密算法,排序算法
  25. 怎么能让前端模块化开发
    1)require.js
    2) webpack
  26. webpack 的作用
    1)解析浏览器不认识的文件,如.less,.sass,.vue文件
    2)使得前端可以模块化开发
  27. 前端路由和后端路由的异同
    同:路由都是通过不同的url展示不同的效果
    异:
    1)前端路由是不同的url展示不同的板块(着重是在单页面上,SPA,如Vue就是,单页面开发,不同的路由有不同的效,但其实都是在一个页面上展示的)
    2)后端路由是不同的url展示不同的页面或者功能(着重是在不同页面上);
  28. 前端路由实现原理:在一个页面中进行切换
    1)hash+onhashchange (vue中mode:“hash”)
    2)history+onpopstate+pushState() (vue中mode:“history”)
  29. 在vuex中,为什么mutations里的任务建议不使用异步函数
    其实在mutations里的任务里,异步函数是可以执行的。但是因为调试工具无法跟踪数据,所以建议不使用!所以vue中提供了Actions和dispatch,使用actions来实现异步处理数据。
  30. jsonp实现跨域的原理
    利用script标签,因为script是不存在跨域限制的。
    详见
  31. jsonp数据格式是怎样的?
    外面是一个函数包着,里面是一个json格式的,就叫做jsonp格式,如foo({“name”:“xiaoming”})
  32. Promise对象及其对应的函数
  1. promise 的优势
    1 功能更加强大,all(), race()
    2 可以解决回调地狱问题
    promise 存在三种状态:
    1 初始状态 pending (等待状态)
    2 fulfilled ( 完成状态 )
    3 rejected ( 未完成状态 )
    状态改变是单向的,并且是不能再次改变状态的。
    pending -> fulfilled ( 触发这个改变: resolve() ) -> then() (成功的回调)
    pending -> rejected ( 触发这个改变: reject() ) -> catch() (失败的回调)
let promise = new Promise((resolve, reject)=>{
     setTimeout(()=>{
         console.log(11);
         resolve('data from peomise');
     },1000)
 }).then((data)=>{
     console.log(data)
     console.log("success!")
 }).catch(()=>{
     console.log("失败!")
 })
  1. xhtml的特点
  2. this指向问题
    1)普通的函数this的指向是,谁调用的,那么这个this就是指向谁;也就是说,普通的this是在执行过程中绑定的,如下代码
  var a=10;
  var obj={
      a:20,
      show:function(){
          console.log(this.a)
      }
  }
  obj.show()

打印结果为:20,因为这时候的函数是obj进行调用的,那么这时候的this就指向obj,那么this.a=20
再比如:

var a=10;
var obj={
    a:20,
    show:function(){
        console.log(this.a)
    }
}
function foo(fn){
    fn()
}
foo(obj.show) 

这时候,函数是被谁调用的呢?明显是fn()来调用的 ,fn()前面没有任何的对象,那么就是window,那么这时候this.a=10.
2)箭头函数中的this
箭头函数的this是在定义函数时绑定的,不是在执行过程中绑定的。简单的说,函数在定义时,this就继承了定义函数的对象。

  1. 那些可以解决异步问题?
    回调函数,事件,发布订阅,Promise,generator, async / await
2 笔试题目
  1. 请写出a的结果
var a=[]
  a.push(1,2)
  a.shift(3,4);
  a.concat([5,6]);
  a.splice(0,1,2)

答案是:a=[2];
解析:
1)arr.push(),将元素压入数组中,此时a=[1,2];
2)arr.shift(),取出数组的第一个元素值,改变原数组,**注意,里面的参数对函数无效,**此时a=[2];
3)arr.concat(),将元素拼接到数组后面,但是不改变原数组,因此,此时a=[2];
4)arr.splice(),从0位置开始,删除一个元素,添加元素2,因此,此时a=[2];

3 编程题
  1. 一个猜数游戏,妞妞把两个数的和y告诉小牛,妞妞声称这两个数都不会超过x,让小牛猜这两个数。小牛每猜一次,妞妞告诉他是对是错,直到猜对为止。
    但是妞妞有时会误报x大小,如果小牛判断出x是错误的,可以直接询问答案。
    猜小牛最坏情况下猜多少次才能猜到答案。
    实例:输入:7,10
    输出:2
  2. 嘟嘟熊有一个N个数的数组,他想将数组升序排列,但是萌萌的嘟嘟熊只会下面这个操作:
    任意取一个数将它放在数组的最后一个位置,问最少操作多少次才能完成升序排列。
    首先输入一个正整数N,然后分别输入N个整数,0<=N<50。每个数的绝对值小于等于1000。
    做法1:
  var N=parseInt(prompt("请输入数组的长度!"));
   var arr=prompt("请输入数组,用空格隔开!").split(" ").map(item=>parseInt(item));
   var arrIndex={}

   arr.forEach((item,index)=>{
       arrIndex[item]=index;
   })
   console.log(arrIndex);
   var temp;
   for(var i=1;i<arr.length;i++){
       for(var j=0;j<arr.length-i;j++){
           if(arr[j]>arr[j+1]){
               arr[j]=[arr[j+1],arr[j+1]=arr[j]][0];
           }
       }
   }

   for(var i=0;i<arr.length-1;i++){
       if(arrIndex[arr[i]]>arrIndex[arr[i+1]]){
           console.log(arr.length-i-1);
           break;
       }
   }

做法2:

var N=parseInt(prompt("请输入数组的长度!"));
var arr=prompt("请输入数组,用空格隔开!").split(" ").map(item=>parseInt(item));
var arrIndex={}

arr.forEach((item,index)=>{
    arrIndex[item]=index;
})
var result=[];
for(var key in arrIndex){
    result.push(arrIndex[key]);
}
for(var i=0;i<result.length-1;i++){
    if(result[i]>result[i+1]){
        console.log(result.length-i-1);
        break;
    }
}

但是这两种做法都存在一点点问题,是因为这里使用的是哈希数组来保存数组的下标,但是因为哈希数组会间接去重!
3. 给m,n。n为两数的和,m表示两个数均不大于m,求出可能的情况。

  1. 实现彩色打字效果,打印一串字符串,\n换行,空格<>不处理
4 问答题
  1. 实现 enentEmitter类,包括on、emit/off/once方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangpaopao0609

看星空看日落不如看我的眼眸

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值