实习/初级前端开发面试题整理

354 阅读16分钟

这里是大喵,一个刚刚步入前端行业的萌新菜鸡,第一次尝试写文章,整理了一些我遇到过的初级的前端面试题,也是为了让自己养成好的知识整理和总结的习惯。如果我写的东西各位大佬看不上,给建议就好啦,麻烦不要喷我。不要喷我不要喷我不要喷我(重要的事说三遍)


我遇到过的面试题:

1.让一个元素垂直左右居中的方式

①: 让外层元素相对定位,内层元素绝对定位,设置top和left为50%,然后设置margin-top和margin-left为负数并且是内层元素宽高的一半。

②: 让外层元素相对定位,内层元素绝对定位,不用算什么百分比margin之类的,直接写margin:auto

③:让外层元素相对定位,内层元素绝对定位。设置top left为50%,再通过transition里的translate,给他设置-50% -50%,也可以实现。translate代表元素水平和垂直方向的偏移,当括号内为百分比的时候,将以自身元素的宽高为基准,来移位相应的宽度。

④:给外层元素设置flex,用justify-content:centeralign-items:center设置垂直水平居中

2.跨域的原理和解决办法

跨域是由浏览器的同源策略造成的。什么是同源策略?同源策略就是浏览器为了安全性考虑实施的非常重要的安全策略

所谓同源,有三个相同:协议相同,域名相同,端口相同。jsonP,cors,和 修改服务器端代码的响应头中的Access-Control-Allow-Origin属性为客户端网页所在地址。常用的是cors方式。

3.cs3和h5的新特新

① cs3: 颜色RGB模式,文字阴影text-shadow,边框border-radius,border-images,border-shadow,渐变linear-gradient,redial-gradient,背景background-clip(背景绘制区域),background-size,background-origin(定位背景图像),过渡transition,自定义动画animation,弹性布局,2D/3D转换,字体图标font-face......

② h5:表单控件number,search,tel,date,time,email,file,本地离线存储localStorage,语义化更好的标签header,footer...拖拽释放,自定义属性daya-id,音频audio 视频video,sessionStorage的数据再浏览器关闭后自动删除......

4.sessionStorage,localStorage,cookie的区别

①.Cookie: 一般由服务器生成,可设置失效时间,如果在浏览器端生成Cookie,默认是在浏览器关闭后失效。与服务器端通信每次都会携带在HTTP头中,如果使用cookie保存过多的数据会带来性能问题。场景:判断用户是否登录

②.localStorage:可以永久保存,除非被清除,它只在客户端中保存,不参与和服务器的通信。场景:用户的购物车信息

③.sessionStorage:仅在当前会话下有效,关闭页面或者浏览器后就被清除,也是一样的保存在客户端,不参与和服务器的通信。场景:遇到一些内容特别多的表单,为了优化用户体验,我们可能要把表单页面拆分成多个子页面,然后按步骤引导用户填写。这时候 sessionStorage 的作用就发挥出来了。

5.介绍vue,vue相比其他框架的优缺点

①.vue是第三方开发的基于MVVM设计者模式的一种前端渐进式框架,可以逐渐引入vue的相关功能,很容易和其他技术进行混搭,对模板很友好,可以用npm,bower等多种方式安装。

②.vue核心只关注视图层,相对于angular来说,vue提供的API更加简洁,更容易理解,vue尽可能通过简单的API实现数据绑定和组合的视图组件,在性能上,vue使用基于依赖追踪的观察,并且使用异步队列更新,所以它的性能比angular快一点

③.react和vue比起来,它对前端初学者来说,有一个学习曲线,react只是一个视图库,并不是一个完整的框架,vue适合精而小的项目,react适合偏大的项目,react的社区贡献比vue活跃,vue的组件相对来说质量没有react高。

6.vue常用指令

v-if v-show v-on v-bind v-model v-for v-pre

7.vue实现双向绑定的原理

vue数据双向绑定是通过数据劫持结合发布-订阅者模式来实现的

在new vue时,通过Object.defineProperty()来达到数据劫持,代理所有数据的getter和setter属性,在数据变动时发布消息给订阅者,触发相应的监听回调

8..vue组件间传参

1.props和emit传参 父组件向子组件传递数据,可以使用props向子组件传递数据, 子组件向父组件传参,子组件通过$emit方法,触发父组件的v-on事件,从而实现子组件触发父组件方法。
2.vuex 传参

9.vue中data为什么需要使用return返回数据?

因为不使用包裹的数据会在项目的全局可见,造成变量污染,使用return包裹后数据中的变量只在当前组件中生效,不会影响其他组件

10.vue中获取元素

给元素绑定ref=xxx,通过this.$refs.xxx来获取

11.vuex的好处?他有哪些东西?

vuex的好处: 能够集中管理共享的数据,易于开发和后期维护,能够高效的实现组件间传参,提高开发效率,存储在vuex中的数据都是响应式的,能够实时保持数据的更新和页面同步。

①.state:提供唯一的共享资源,所有的共享资源都放在这里

②.mutation:专门修改state里的数据,可以集中监控所有数据的变化,但不能执行异步操作

③.action:专门用来处理异步任务,但是不能直接修改state,需要通过触发mutation的方式间接的修改数据

④.getter:对store里的数据加工处理后形成新的数据,简单来说,就是包装store里的数据,但是不会修改store里的数据

⑤.modules:模块化vuex,可以让每一个模块拥有自己的state、mutation、action、getters,使得结构非常清晰,方便管理。

12.说一下MVVM

MVVM是前端视图层的概念,主要关注于视图层分离,把前端的视图层分成了三部分:ModelViewViewModel

①视图(View):包括以前的css+html,增强了html的功能,添加了分支和循环,增加了变量的功能{{n}}

②模型对象(Model ):专门集中保存页面所需的变量和函数的对象

③视图模型(ViewModel):将data和methods中的函数送到界面的指定元素上,并能自动保持界面显示与data中变量值同步的一种特殊的对象

13.promise,多个异步任务怎么执行

promise专门解决回调地狱问题,使多个异步任务顺序执行

可以在原异步任务内return一个new promise,promise包含一个参数,原异步任务最后一句代码执行后调用参数。如果下一项任务也返回new promise对象,可以使用.then()相连,进行调用

14.数组去重的几种方法

①.使用包 undersore 或者是 lodash ,提高开发效率

②.使用ES6里的set,利用它元素不能重复的特点,再用Array.form方法将它转化成数组

③.使用ES6里的set,利用它元素不能重复的特点,再用展开运算符...转化为数组

④.使用ES6里的filter过滤,将indexOf返回的结果和filter里的index作对比,如果相同就返回true,就会被过滤掉。

⑤.创建新数组,使用forEach循环原数组,通过indexOf返回的的结果进行判断元素是否在新数组里已经存在,如果不存在会返回-1,那么就可以使用push添加该元素。

⑥.创建一个空对象,利用对象的key值不能重复的特点,将数组循环出来的元素作为对象的key值,再用Object.keys取出key值,用parseInt转化字符串为数组,再用map返回这个新数组。

⑦.使用sort进行数组排序,如果有重复的元素肯定是挨在一起的,那么就判断相邻的两个元素,如果不i相等,就用push添加。

15.状态码

1XX (指示信息)表示请求已接收,继续处理
2XX(成功)表示请求已被成功接收
3XX(重定向)要完成请求必须更进一步操作
4XX(客户端错误)带有请求语法错误或者请求 无法实现
5XX(服务器错误)服务器遇到错误,无法完成请求

16.get和post的区别

get的参数是可见的,post参数是不可见的

get通过拼接url进行传递参数,post通过body体传递参数

get请求时可以缓存的,post请求不可以缓存

get请求页面后退时不产生影响,post请求页面 后退时,会重新提交请求

post原则上来说安全性比get要好

17.深拷贝浅拷贝的区别

深拷贝:两个对象指向两个不同的地址,修改新对象,原对象不受改变

浅拷贝:两个对象指向同一个地址,修改新对象,原对象也会发生改变

18.如何对网站文件和资源进行优化

1.文件合并,减少http请求
2.压缩文件,减少文件的下载体积
3.使用CDN托管,是内容传输的更快更稳定
4.GZIP压缩css和js文件

19.判断数据类型

Typeof,instanceof,Object.prototype.tostring.call(array)

20.清除浮动的几种方式

1.结尾处加空div标签,clear:both
2.父级div也浮动,需要定义宽度
3.父级div定义display:table
4.结尾处加br标签,clear:both

21.call apply bind 区别

都是改变this指向

call(),第一个参数是this要指向的对象,可以传递多个参数,并且立即执行。

apply(),第一个参数是this要指向的对象,第二个参数必须是数组,并且立即执行。

bind(),第一个参数是this要指向的对象,可传递多个参数,返回一个新函数,不是立即执行。

22.js的数据类型

基本类型(null number boolean string undefined )和引用类型(function object array):

①基本类型保存在栈内存中,引用类型保存在堆内存中
②基本类型是按值访问,操作的是实际值,引用类型是先找到内存地址再找到值
③基本类型是把自己的值复制一份,再操作复制后的值,不会影响原值。引用类型是多个变量访问同一个内存地址,再操作值后会影响值

23.闭包

什么是闭包:专门重用一个变量,又保护变量不被篡改的一种编程方法

闭包3步:
1.外层函数包裹要保护的变量和内层函数
2.外层函数用retrun将内层函数返回到外部
3.调用外层函数,获得return出的内层函数,并将内层函数保存在一个变量中重复使用

闭包形成原因:
外层函数的作用域对象被内层函数引用着,无法释放,从而形成了闭包

24..作用域和作用域链

作用域是一个变量的可用范围,是保存变量的特殊对象
js中包含2种作用域,一个是全局作用域,一个是函数作用域

作用域链:是由多级作用域,逐级引用,形成的链式结构,保存着一个函数可用的所有作用域和变量

25..浏览器兼容问题

1.CSS hack
为了让页面形成统一的效果,要针对不同浏览器或不同版本写出对应可解析的CSS样式,我们把这个针对不同浏览器或不同版本而写css的过程叫做CSS hack
①:IE条件注释法
②:CSS属性前缀法
③:选择器前缀法
2.浏览器私有属性 -moz代表firefox浏览器私有属性 -ms代表IE浏览器私有属性 -webkit代表Chrome,safari私有属性 -o代表opera私有属性 3.CSS样式初始化:reset

25.数据交互axios

1.准备
安装,直接script标签引用 如果要全局使用,就在main.js中设置为全局的,再在组件中通过this调用
2.使用
axios返回的是一个promise对象,所以通过.then的方式,里面用回调函数,去接受reslove的值,resolve是promise的参数,表示成功时候的状态。
3.一次合并发送多个请求
分别写两个请求函数,利用axios的all方法接收由每个请求方法组成的数组,可以一次性发送多个请求,如果全部请求成功,在axios.spread方法接收一个回调函数,该函数的参数就是每个请求返回的结果。
4.axios配置默认值
可以通过axios.defaults设置全局默认值,在所有请求中都生效

26.Ajax

1. Ajax四步:

  1. 创建Ajax对象
  2. 连接到服务器
  3. 发送请求
  4. 接收返回值

2.Ajax优缺点:
优点:页面无需刷新,由非常好的用户体验 使用异步和服务器通信,不用中断操作 可以把以前服务器负担的工作转移给客户端,减轻服务器压力
缺点:对浏览器机制的破坏,在动态更新页面的情况下,用户无法回到前一个页面状态。 对搜索引擎的支持比较弱,如果使用不当,Ajax会增加网络数据的流量,从而降低整个系统的性能
3. 应用场景
数据验证,按需取数据,自动更新页面

27.webpack

webpack 是一种前端资源构建工具,一个静态模块打包器
在 webpack 看来,前端的所有资源文件(js/json/css/img/less/...)都会作为模块处理,它将根据模块的依赖关系进行分析,打包生成对应的静态资源(bundle)。

webpack 五个核心概念:

1.Entry

入口(Entry) 指示 webpack 以哪个文件作为入口起点开始打包,分析构建内部依赖图

2.Output

输出(Output) 指示 webpack 打包后的资源 bundles 输出到哪里去,以及如何命名

3.Loader

Loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解JavaScript)
【相当于一个翻译官,将 img,less等东西翻译成 webpack 能识别能看懂的资源】

4.Plugins

插件(plugins) 可以用于执行范围更广的任务。插件的范围包括,从打包优化到压缩,一直到重新定义环境中的变量等

5.Mode

模式(Mode) 指示 webpack 使用相应模式的配置。分为 development 和 production

5-1.development

开发模式 能让代码在本地调试运行的环境

5-2.production

生产模式 能让代码上线运行的环境

28.position的值,relative和absolute分别是相对于谁定位的?

①relative:相对定位,相对于自己本身在正常文档流中的位置进行定位

②absolute:生成绝对定位,相对于最近一级定位不为static的父元素进行定位

(static:默认值,没有定位,元素出现在正常的文档流中)

29.ES5和ES6的新特性

ES6:let 和 const命令,模板字符串,解构表达式,map和reduce,箭头函数,展开运算符,promise,set,class类,for...of循环

ES5:声明变量只有var,声明函数只有function,严格模式 use strict

30.面向对象三大特征

封装、继承和多态

1、封装是指将某事物的属性和行为包装到对象中,这个对象只对外公布需要公开的属性和行为,而这个公布也是可以有选择性的公布给其它对象。

2、继承是子对象可以继承父对象的属性和行为,亦即父对象拥有的属性和行为,其子对象也就拥有了这些属性和行为。

3、多态性是指允许不同类的对象对同一消息作出响应。

31.javascript 对象的几种创建方式

  1. 使用字面量方法,通过大括号{}创建对象
  2. 使用构造函数方法对象 (构造函数:首字母大写,用来创建对象,里面的this指新创建的对象)
  3. 使用原型对象的方式 ( prototype关键字创建)
  4. 使用工厂方式创建(object关键字)
  5. 混合模式(原型+构造函数)

32.怎么理解内存泄漏和内存溢出

1.内存泄露:指程序在申请内存后,被某个对象一直持有,无法释放已申请的内存空间,一次内存泄露可以忽略,但内存泄漏堆积后果很严重,无论多少内存,迟早会被占光

2.内存溢出:指程序在申请内存时,没有足够的内存空间供其使用

33.堆和栈的区别

栈主要存储的是基本变量和对象的引用
堆主要存储的是实例对象

栈存取速度比较快
堆存取速度比较慢

栈每个线程都有一个栈
堆所有线程共享一个堆

栈垃圾回收比较频繁
堆垃圾回收不是那么频繁

34.css中link和@import的区别

link是XHTML标签,除了加载css之外,还可以定义RSS等其他事务.
@import属于css范畴,只能加载css

link引用css时,在页面加载时同时加载
而@import需要在页面加载完毕后加载

link无兼容问题,@import低版本的浏览器不支持

35.js延迟加载的方式有哪些?

  1. 使用defer属性
  2. 使用async属性
  3. 使用setTimeout延迟方法
  4. 把JS放在最后

36.虚拟DOM

虚拟DOM就是为了解决浏览器性能问题而被设计出来的
虚拟DOM树的优点:

  1. 它很小,只包含可能变化的元素
  2. 遍历查找快
  3. 修改效率高:只修改受影响的元素
  4. 避免重复编码

37..json

是为了使数据格式成为一种标准,很简单的被javascript解析
优缺点
轻量级的数据交换格式,读写更容易,易于解析和生成,支持多种语言
json的片段创建和验证稍显复杂,学习成本比较高。

38。箭头函数需要注意的地方

不可以当成构造函数使用new命令,需要注意this指向,this指向的是定义时所在的对象,而不是使用时所在的对象。


暂时就写这么多啦。这些很多都是我自己遇见过的笔试题,下面的回答是我自己总结的回答,可能不太完善,希望大家指正(勿喷)

dd