持续更新中~
内容只是面试示例,问题及答案仅供参考提示~
基本面试前端涉及到的相关知识点都可能问道,尤其理论相关的~
本文偏注重应用,原理理论相关的东西较多,且每个人可能理解都不尽相同,我就不误人子弟了,故而不涉及;
opacity 设为 0;
visibility 设为 hidden;
display 设为 none;
position 设为 absolute,然后将位置设到不可见区域
盒子未固定宽高:transforms变形;弹性盒子;
盒子固定宽高:绝对定位+margin负间距/margin:auto
Position:absolute绝对定位,relative相对定位,fixed 固定定位,static 静态定位,stiky 粘性定位;
Undefined、Null、Boolean、Number、String、Symbol、Object
undefined 代表的含义是未定义,null 代表的含义是空对象。
Typeof, instanceof , sonstructor, object.prototype.toString.call
浅拷贝:Object.assign(),concat,slice,拓展运算符
深拷贝:JSON.parse(JSON.stringify()); 递归
事件冒泡:自下而上:event.stopPropagation( )
事件捕获:自上而下
回调函数(callback), 事件监听,Promise,Generator,async/await
普通函数中的 this 指向 window 对象, 严格模式下为
undefined;
箭头函数没有,继承父作用域的this;
构造函数指向实例对象;
绑定事件的函数:谁调用指向谁;
对象里调用:谁调用指向谁;
定时器(回调函数):window
DNS域名解析—找到ip发起请求—服务器返回数据—浏览器接受文件—资源语法解析—载入解析文件
强缓存,协商缓存
区别:架构,设备,开发语言,用户,兼容
兼容:媒体查询,vh,vw, %, em, rem; 等比缩放
1 rem
页面所有使用rem单位的长度都是相对于根元素元素的font-size大小。即1rem等于根元素元素的font-size大小。
1em
子元素字体大小的em是相对于父元素字体大小。
元素的width/height/padding/margin用em的话是相对于该元素的font-size。
1vh、1vw
全称是 Viewport Width 和 Viewport Height,视口的宽度和高度,1vh相当于 视口高度的 1%。
1px
px像素(Pixel),相对长度单位。像素px是相对于显示器屏幕分辨率而言的。
beforEach 路由守卫;路由传参打标,守卫中判断拦截
全局导航钩子,组件内钩子,单独路由独享组件
参数: to from next()
包含菜单、按钮、数据权限
路由后端返回权限路由列表数据,前端在menu处根据数据渲染; 按钮后端返回权限按钮列表数据,前端自定义指令;
数据权限由前端在请求头封装token等用户数据,后端接收判断当前用户;
Prop $emit $paraents ref vuex eventBus
stste action mutations modules getters
会,保存在运行内存中
做持久化存储,保存在session storage与local storage中
router link to
router push qurey params
用params传参的时候
页面跳转之后的页面路径为http://localhost:8080/#/index
这种传参方法:
用户看不到具体的参数值,相对安全
当页面刷新的时候传递的参数id在该页面中就不存在了。(存储本地或者改为query方式)
params传参的时候,只能用name引入路由,不能使用path引入
获取方式:this.$route.params
用query传参的时候
页面跳转之后的页面路径http://localhost:8080/#/index?id=1
这种传参方法:
传递的参数值会暴露在页面路径中,不安全。
当页面刷新的时候,传递的参数不会消失
query传参的时候,可以同时使用name和path引入路由
会,eventBus, 数据存储
可以用变量,例如($变量名称=值);
可以用混合器;
可以嵌套
组件中的 data 写成一个函数,数据以函数返回值形式定义,这样每复用一次组件,就会返回一份新的data,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据。而单纯的写成对象形式,就使得所有组件实例共用了一份data,就会造成一个变了全都会变的结果
① 项目使用 keep-alive 时,可搭配组件的 name 进行缓存过滤。
②DOM 做递归组件时需要调用自身 name
③vue-devtools 调试工具里显示的组件名称是由 vue 中组件 name 决定的
获取路由数据,跳转
方法一:将数据定义在data之外
方法二:Object.freeze()
减少性能消耗
Hash, history, abstract模式(严格模式);
vue-router的实现原理(核心):更新视图但不重新请求页面
大致有三个点,第一个是关于提出的新 API setup()函数,第二个说了对于 Typescript 的支持,最后说了关于替换
Object.defineProperty 为 Proxy 的支持。详细说了下关于 Proxy
代替带来的性能上的提升,因为传统的原型链拦截的方法,无法检测对象及数组的一些更新操作,但使用 Proxy 又带来了浏览器兼容问题
使用 npm i 【包名】 --save-dev 安装的包,会被写入到 devDependencies 对象里面去; 而使用 npm i【包名】 --save 安装的包,则被写入到 dependencies 对象里面去。
devDependencies 里面的插件(比如各种loader,babel全家桶及各种webpack的插件等)只用于开发环境,不用于生产环境,因此不需要打包;而dependencies 是需要发布到生产环境的,是要打包的。
当created时要请求一次数据,并且搜索值改变也要请求数据时,
推迟非关键资源的加载:异步加载的三种方式——async和defer、
动态脚本创建;
路由懒加载;
CDN;
gzip压缩;
浏览器缓存;
组件尽量不要全局引入
代码压缩层面,关键资源,浏览器缓存,CDN,图片优化,防抖节流,减少回流与重绘
JSONP;CORS跨域资源共享(Access-Control-Allow-Origin);Nginx反向代理;webpack(在vue.config.js文件中)中 配置webpack-dev-server(changeOrigin: true, //是否跨域)
入口,出口,plugins, loader, env
持续更新中~
内容只是面试示例,问题及答案仅供参考提示~
基本面试前端涉及到的相关知识点都可能问道,尤其理论相关的~
本文偏注重应用,原理理论相关的东西较多,且每个人可能理解都不尽相同,我就不误人子弟了,故而不涉及;
opacity 设为 0;
visibility 设为 hidden;
display 设为 none;
position 设为 absolute,然后将位置设到不可见区域
盒子未固定宽高:transforms变形;弹性盒子;
盒子固定宽高:绝对定位+margin负间距/margin:auto
Position:absolute绝对定位,relative相对定位,fixed 固定定位,static 静态定位,stiky 粘性定位;
Undefined、Null、Boolean、Number、String、Symbol、Object
undefined 代表的含义是未定义,null 代表的含义是空对象。
Typeof, instanceof , sonstructor, object.prototype.toString.call
浅拷贝:Object.assign(),concat,slice,拓展运算符
深拷贝:JSON.parse(JSON.stringify()); 递归
事件冒泡:自下而上:event.stopPropagation( )
事件捕获:自上而下
回调函数(callback), 事件监听,Promise,Generator,async/await
普通函数中的 this 指向 window 对象, 严格模式下为
undefined;
箭头函数没有,继承父作用域的this;
构造函数指向实例对象;
绑定事件的函数:谁调用指向谁;
对象里调用:谁调用指向谁;
定时器(回调函数):window
DNS域名解析—找到ip发起请求—服务器返回数据—浏览器接受文件—资源语法解析—载入解析文件
强缓存,协商缓存
区别:架构,设备,开发语言,用户,兼容
兼容:媒体查询,vh,vw, %, em, rem; 等比缩放
1 rem
页面所有使用rem单位的长度都是相对于根元素元素的font-size大小。即1rem等于根元素元素的font-size大小。
1em
子元素字体大小的em是相对于父元素字体大小。
元素的width/height/padding/margin用em的话是相对于该元素的font-size。
1vh、1vw
全称是 Viewport Width 和 Viewport Height,视口的宽度和高度,1vh相当于 视口高度的 1%。
1px
px像素(Pixel),相对长度单位。像素px是相对于显示器屏幕分辨率而言的。
beforEach 路由守卫;路由传参打标,守卫中判断拦截
全局导航钩子,组件内钩子,单独路由独享组件
参数: to from next()
包含菜单、按钮、数据权限
路由后端返回权限路由列表数据,前端在menu处根据数据渲染; 按钮后端返回权限按钮列表数据,前端自定义指令;
数据权限由前端在请求头封装token等用户数据,后端接收判断当前用户;
Prop $emit $paraents ref vuex eventBus
stste action mutations modules getters
会,保存在运行内存中
做持久化存储,保存在session storage与local storage中
router link to
router push qurey params
用params传参的时候
页面跳转之后的页面路径为http://localhost:8080/#/index
这种传参方法:
用户看不到具体的参数值,相对安全
当页面刷新的时候传递的参数id在该页面中就不存在了。(存储本地或者改为query方式)
params传参的时候,只能用name引入路由,不能使用path引入
获取方式:this.$route.params
用query传参的时候
页面跳转之后的页面路径http://localhost:8080/#/index?id=1
这种传参方法:
传递的参数值会暴露在页面路径中,不安全。
当页面刷新的时候,传递的参数不会消失
query传参的时候,可以同时使用name和path引入路由
会,eventBus, 数据存储
可以用变量,例如($变量名称=值);
可以用混合器;
可以嵌套
组件中的 data 写成一个函数,数据以函数返回值形式定义,这样每复用一次组件,就会返回一份新的data,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据。而单纯的写成对象形式,就使得所有组件实例共用了一份data,就会造成一个变了全都会变的结果
① 项目使用 keep-alive 时,可搭配组件的 name 进行缓存过滤。
②DOM 做递归组件时需要调用自身 name
③vue-devtools 调试工具里显示的组件名称是由 vue 中组件 name 决定的
获取路由数据,跳转
方法一:将数据定义在data之外
方法二:Object.freeze()
减少性能消耗
Hash, history, abstract模式(严格模式);
vue-router的实现原理(核心):更新视图但不重新请求页面
大致有三个点,第一个是关于提出的新 API setup()函数,第二个说了对于 Typescript 的支持,最后说了关于替换
Object.defineProperty 为 Proxy 的支持。详细说了下关于 Proxy
代替带来的性能上的提升,因为传统的原型链拦截的方法,无法检测对象及数组的一些更新操作,但使用 Proxy 又带来了浏览器兼容问题
使用 npm i 【包名】 --save-dev 安装的包,会被写入到 devDependencies 对象里面去; 而使用 npm i【包名】 --save 安装的包,则被写入到 dependencies 对象里面去。
devDependencies 里面的插件(比如各种loader,babel全家桶及各种webpack的插件等)只用于开发环境,不用于生产环境,因此不需要打包;而dependencies 是需要发布到生产环境的,是要打包的。
当created时要请求一次数据,并且搜索值改变也要请求数据时,
推迟非关键资源的加载:异步加载的三种方式——async和defer、
动态脚本创建;
路由懒加载;
CDN;
gzip压缩;
浏览器缓存;
组件尽量不要全局引入
代码压缩层面,关键资源,浏览器缓存,CDN,图片优化,防抖节流,减少回流与重绘
JSONP;CORS跨域资源共享(Access-Control-Allow-Origin);Nginx反向代理;webpack(在vue.config.js文件中)中 配置webpack-dev-server(changeOrigin: true, //是否跨域)
入口,出口,plugins, loader, env