1、px、em、rem区别介绍
答:px像素单位
em的值不是固定的,会继承父级元素的字体大小,默认1em=16px
rem以根元素字体大小为基准,只修改根源上大小,就能成比例跳转所
有字体大小,只依赖html字体的大小
========================================================
2、什么是跨域?跨域请求资源的发那个发有哪些?
答:跨域产生在发送请求时,当浏览器和响应服务器不是同一台时,就会产生跨域。
协议、ip、端口三者相同时,就会同源,不会有跨域问题。
node.js解决:
第一种:引入cors插件
第二种:手动设置允许的请求ip和请求方式
vue解决:
在根目录新建vue.config.js
后端API只有一台的情况,直接设置proxy连接目标服务器地址
如果有多台,需要自定一个对应服务器的对象名,然后target设
置目标服务器地址,changeOrigin设置true,pathRewrite
把区分服务器的key删了
========================================================
3、Sass/Scss和less有什么区别?Sass有哪几大特性?
答:编译环境不一样、变量符不一样,Less是@,而Scss是$,
less没有输出设置,Sass支持条件语句,工具库不同
(https://www.cnblogs.com/wangpenghui522/p/5467560.html)
========================================================
4、::before和:after种双冒号和单冒号有什么区别?解释一下这个元素的作用
答::是伪类 向选择器添加特殊效果,::是伪元素 将特殊效果添加到选择器
after写一个清除浮动的css代码
答:.clearfix:after{
content: "";
display: block;
height: 0 ;
clear:both;
visibility: hidden;
}
========================================================
5、flexbox允许flex项多行排列/列排列,flexbox中的垂直居中
答:felx-wrap align-item
========================================================
6、let/var/const的区别?
答:ES5 var可以重新定义 可以重新赋值
ES6 let不可以重定义 可以重赋值
ES6 const不可以重定义 不可以重赋值
========================================================
7、用js实现防抖函数(短时间内多次出发同一事件,只执行最后一次),和节流函数
(指连续触发事件但是在n秒中只执行一次函数)
答:在一段时间内多次触发同一事件,但只会在规定时间内执行一次 节流
例:坦克大战,多次点击发炮弹,最终还是只会发送第一次点击的炮弹
触发事件后会延迟n秒执行,如果在这n秒内再次触发,则会重新计时 防抖
例:英雄联盟回城按钮,无论按多少次都是根据最后一次来执行
节流:
let isTf=false //定义标杆为假
if(isTf)return //判断标杆是否为真?如果为假往下执
行,如果为真打断
isTf=true //把标杆定义为真
setTimeout(()=>{ //倒计时3秒设置为假,在3秒内继续
点击也是为真,会被打断
isTf=false
},3000)
//下面可以写入要执行的请求
防抖:
let timer=null; //设置定时器为空
function fd(){
timer=setTimeout(()=>{
console.log("需要执行")
},3000)
}
btn.onclick=function(){
clearInterval(timer)
fd()
}
========================================================
8、vue.js中,v-show和v-if有什么区别?
答:v-show是在行内添加display:none;进行隐藏,而v-if是直接销毁
当组件需要频繁切换用v-show 否则v-if
========================================================
9、怎么定义vue-router的动态路由?怎么获取传过来的动态参数?
答:this.$router.push({path:"要跳转的地址",query:要传的参数})
this.$router.push({name:"要跳转的地址",params:要传的参数})
接收:this.$route.query
接收:this.$route.params
query模仿get,params模仿post
例:this.$router.push(hash=="跳转的地址"?{path:"要跳转的地址",query:参数}:hash)
做一个三目判断,hash如果是要跳转的地址就传入参数,否则就正常跳hash
========================================================
10、axios三层封装
答:
思想:
最底层 - 封装get和post请求,设置默认地址,请求拦截器,响应拦截器
中间层 - 各自的模块自己管理自己 方便后期维护
视图层 - 在组件中调用接口 渲染数据
========================================================
11、关于MVC
答:MVC是一个架构模式,他被分为三个核心部件:模型、视图、控制器
模型 应用程序核心(数据)
视图 用户界面
控制器 应用程序处理请求进行处理,改变model数据
========================================================
12、三次握手四次挥手
答:三次握手过程:
第一次握手:客户端发送网络包,服务端收到了。
这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是
正常的。
第二次握手:服务端发包,客户端收到了。
这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收
、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。
这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发
送、接收能力也正常。
//因此,需要三次握手才能确认双方的接收与发送能力是否正常。
四次挥手过程:
客户端向服务器发送FIN希望断开连接请求。
服务器向客户端发送ACK,表示同意释放连接。
服务器向客户端发送一个FIN表示希望断开连接。
客户端向服务器返回一个ACK表示同意释放连接。
FIN表示关闭连接,
ACK表示响应
========================================================
13、vue中怎么把框架单独打包?
答:
========================================================
14、css盒子模型
答:标准盒子:大小=内容+边框+内外边距
怪异盒子:大小=宽度(内容+边框+内边距)+外边距
========================================================
15、html中行内元素和块级元素
答:行内元素:a、span、img、input、b、textarea、lable、em、strong、select、button
块级元素:div、ul、h1-h6、li、p、dt、dd、form
========================================================
16、css中选择器的优先级以css权重如何计算?
答:!important>行内样式>ID选择器>类选择器>标签>通配符>继承>浏览器默认属性
内联 1000 ID 100 类 10 标签 1
========================================================
17、css中清除浮动有哪几种方式?
答:1.在子元素并级后面添加一个新元素clear:both 简单方便,空标签不方便维护
2.给父元素加overflow:hidden,代码少,简单,只是不能配合定位用
3..clearfix:after{
content:""; //设置内容为空
display:block; //转为块元素
height:0; //高度0
clear:both; //清除浮动
visibility:hidden //将元素隐藏
}
.clearfix:{zoom:1;} //为了兼容IE
========================================================
18、解释一下js中事件委托,一般在什么场景使用?
答:就是将子元素的事件写在一个父元素,让父元素代替处理,内部使用event.target,
event.target就是触发这个事件的子元素。
场景:当要给一组元素添加相同事件时,可以直接添加给父亲
========================================================
19、如何阻止事件冒泡和默认事件?
答:事件冒泡阻止:event.stopPropagation()
阻止默认事件:event.preventDefault()
========================================================
20、简单解释css的重绘与回流
答:重绘:当一个元素自身的宽高,布局,和显示隐藏没有改变,只改变了元素
外观风格的时候,就会产生重绘。
回流:渲染树的一部分必须要更新且节点的尺寸发生了变化,会触发回流操作.
每个页面至少在初始化的时候会有一次回流操作。
回流必将引起重绘,重绘不一定引起回流。
========================================================
21、箭头函数和普通函数的区别是什么?
答:1.箭头函数是匿名函数,不能作为构造函数,不能使用new
2.箭头函数不绑定arguments,取而代之用rest参数...解决
3.箭头函数不绑定this,会捕获其所在的上下文的this值,作为自己的this值
4.箭头函数通过call或apply方法调用一个函数时,只传入了一个参数,对this并没有影响
5。箭头函数没有原型属性
========================================================
22、解释bind、call与apply区别?作用
答:call 与 apply 的不同点:两者传入的列表形式不一样
call可以传入多个参数;
apply只能传入两个参数,所以其第二个参数往往是作为数组形式传入
---------------------------
共同点,都可以改变this
从执行结果上来说,bind得到新函数。call和apply是立即去调用
传参不同:bind、call传参数列表,apply是传参数组
变量类型检查:Objcet.prototype.toString.call()
========================================================
23、简述computed的实现原理?
答:当组件初始化computed和data会分别建立各自的响应系统,observer
遍历data中每个属性设置 get/set数据拦截
组件初始化computed会调用initComputed函数
当某属性发生变化,触发set拦截函数,完成响应
========================================================
24、computed和watch有什么区别?分别运用的场景?
答:computed是计算属性,用于简易计算处理,比如购物车商品结算
watch是侦听属性,用于侦听值的变化,比如 搜索数据
========================================================
25、html5常用标签结构
答:header、main、footer、aside、nav、section、article
========================================================
26、html常用的属性有哪些?
答:id class name style type value
========================================================
27、href和src的区别?
答:请求资源不同、作用的结果不同、浏览器的解析方式不同
========================================================
28、link和@import的区别
答:1.link是XHTML标签,除了可以加载css还可以定义rss,@import只能加载css
2.link引入css页面载入时同时加载,@import需要页面完全载入后再加载
3.link没有兼容问题,@import是css2.1提出,低版本不支持
4.link支持javascript控制DOM改变样式,而@import不支持
========================================================
29、vue父子组件通信的方法?
答:父传子:父组件上:<子组件 自定义属性="值"/>
子组件接收:props:["自定义属性1","自定义属性2"...],子组件{{自定义属性}}
复杂写法:可以设置默认参数
props:{
自定义属性1:{type:number,default:"默认参数值"},//type内写对应类型
自定义属性2:{type:string,default:"默认参数值2"},
}
子传父:子组件:通过$emit("事件名",值)
父组件:<Son @事件名="父组件定义的函数" />
父组件定义的函数(data){data就是子组件传递的参数}
例:子:created(){$emit("data","儿子给父亲")}
父:<Son @data="fn"/>
methods:{fn(data){//data就是传过来的值}}
========================================================
30、路由懒加载
答:const routes=[
{path:"/",component:()=>{import("组件地址")}}
]//component就是路由懒加载的写法
========================================================
31、vue响应式原理?
答:首先会在vue初始化将data内所有属性通过遍历,用Object.defineProperty
劫持到,劫持到就知道数据什么时候发生变化。
当数据发生变化后触发set,set在数据变化后通知watch更新视图。
watch是一个监听者,监听到变化后就会调用render函数更新视图
更新视图是通过虚拟DOM节点,做到最小粒度更新
--在更新视图过程中是需要编译template模板,编译的时候就会访问data
里的数据,就会触发get,get就会去做收集依赖的事情,当template中
用到的数据告诉watch,然后进行render最小粒度渲染。
========================================================
31、vue内,原理劫持(Objcet.defineProperty)发生在created内
========================================================
32、因为Objcet.defineProperty不支持IE8以下,所以vue也是不支持的,因为vue就是
Objcet.defineProperty写的
========================================================
33、vue响应式原理流程图
答:1、vue2--Object.defineProperty劫持所有的属性
vue3--proxy
========================================================
34、CSS hack
答:CSS hack是通过在CSS样式中加入一些特殊的符号,让不同的浏览器
识别不同的符号,以达到应用不同的CSS样式的目的
========================================================
35、能继承的属性
答:字体系列 font font-size font-style ...
文本系列 内联 color line-height...
块级 text-indent text-align
========================================================
36、你如何理解HTML结构的语义化?
答:1.提升搜索引擎优化SEO的效果
2.没有css也能很好呈现出内容结构、代码结构
3.便于团队开发和维护,语义化更具可读性
4.通常语义化会使代码变少,让页面加载更快
========================================================
37、Sprites精灵图
答:1.可以很好的简述网页http请求
2.减少图片字节
3.解决图片命名困扰
ps找到坐标,background-position进行对精灵图的定位使用
========================================================
38、居中一个div
答:1.设置宽高 2.设置绝对定位 left:50%;top:50%;
3.margin-top:-高一半;margin-left:-宽一半;
========================================================
39、this指向
答:1.全局window
2.普通函数谁调用指向谁
3.对象方法谁调用指向谁
4.构造函数指向创建出来的实例对象
5.事件指向事件源
6.定时器指向window
7.箭头函数指向上一级
========================================================
40、闭包
答:含义:函数跨作用域访问变量形成闭包,一般这个函数和变量的总和
就叫闭包。常见的闭包是父函数嵌套子函数,把子函数返回挂载在全局
作用:私有化变量,避免全局污染。把变量封装在内部,对外暴漏钥匙(访问的接口)
实现早期模块化
========================================================
41、ES6新特性
答:1.let const
2.箭头函数
3.模板字符串
4.Promise
========================================================
42、H5新特性
答:1、语义化标签
2、audio和video
3.form表单
4.local和session
5.自定义属性data-*等等
========================================================
43、ajax readyState有几种状态,请说明他们分别对应的意思
答:0 未初始化
1 准备发送
2 已经发送
3 正在接收
4 完成响应
========================================================
42、什么是闭包,如何使用它,为什么要使用它?优缺点,应用场景?
答:函数的标识符跨作用域形成闭包
写法1:function fn(){
var num=1; //函数内生成变量
function fn1(){num++ return num} //访问上一级变量,返回更改后的值
return fn1 //返回函数内的函数
}
var fc=fn() //函数返回出来的值用变量接收
console.log(fc())
写法2:function fn(){
var num=1;
function fn2(){
return num=num+1; //返回更改后的值
}
window.fn2=fn2 //把函数挂载在window
}
fn() //先调用外部函数
console.log(fn2()) //然后调用内部函数
闭包优点:避免全局变量污染
缺点:会增大内存的使用量,使用不当会造成内存泄漏
闭包应用场景:模块是闭包最强大的一个应用场景
========================================================
43、对WEB标准以及W3C的理解与认识?
答:web标准是将 结构 表现 行为三部分独立分开,w3c对web标准提出规范
要求:
1 结构要求:标签闭合,标签字母小写,标签不允许随意嵌套
2 对于css js来说尽量使用外链css和js。使结构表现行为分为三块
符合规范,同时提高页面渲染速度,提高用户体验
========================================================
44、使用XHTML的局限性有哪些?
答:必须有head、body每个dom必须要闭合,一些老浏览器不兼容
========================================================
45、描述reset css文件的作用和使用它的好处?
答:重置浏览器的css默认属性,不同浏览器有自己的默认样式,通过reset
可以达到显示一致的效果。
========================================================
46、在IE6中遇到的bug和解决方法?
答:ie6条件下有双倍的margin
解决:给浮动元素增加display:inline
图片底部有3像素问题
解决:dispkay:block
========================================================
47、简述路由的2种常见跳转方式?
答:<router-link to='/home'>
this.$router.push('/home')
========================================================
48、vue中如何使用自定义组件?
答:1、在view中创建自定义组件xxx.vue,并写入内容
2、在模块中引入improt Xxx from "@/components/Xxx.vue"
3、在模块中挂载,components:{Xxx}
4、在页面引入<Xxx/>
========================================================
49、vue中keep-alive的作用?使用场景?
答:缓存组件,应用在频繁切换,如tab切换,不重复渲染DOM,优化性能
自身是一个抽象组件,自身不会渲染一个DOM元素,不会出现在父组件链中
和v-show的区别是?
show是有DOM节点改为了none,keep-alive根本没有DOM节点
========================================================
50、restful API是什么?怎么用?
答:是一种互联网软件架构,后端用,和前端没什么关系
========================================================
51、ES6新特性
答:1、let const
2、箭头函数
3、模板字符串
4、Promise
5、Async/Await
6、模块化
7、解构赋值
8、拓展运算符
ES6优势:1.命名冲突2.职责分离 解决
========================================================
52、列举vue中组件的属性以及常用指令?
答:属性:computed、filters、methods、
指令:v-for、v-if v-else v-else-if、v-show、v-model、v-on和v-bind
========================================================
53、请简述SPA单页面应用的优缺点,如何优化缺点?
答:优点:1.局部渲染,有良好的交互体验
2.前后的职责分离,架构清晰
3.复合web2.0趋势
4.减轻服务器压力,服务器只需要提高数据
缺点:1.首屏渲染时间长=》优化:预渲染
2.不利于seo=》优化:服务端渲染SSR
========================================================
54、vuex的属性,怎么使用?哪些功能场景使用vuex?
答:
vuex 是一个管理交互状态的插件,只能和vue项目搭配使用
采用集中式存储数据,使用创建store.js 来统一管理数据
5大属性:state代表仓库数据本身
mutations修改仓库数据的唯一方式
getters仓库中的过滤
actions异步修改仓库数据
moudles合并仓库数据
使用:1收到数据后,把数据丢给状态机
this.$store.commit("LISI",{list:goodsList});
2页面接收仓库里的数据 //在computed内调用
this.$store.state.键名 //这里是对象存储在vuex
========================================================
55、$router和$route的区别?
答:$router这个对象中是一个全局对象,包含了所有路由包含了许多关键对象和属性
$route表示当前路由信息对象
========================================================
56、请求拦截器是什么?相应拦截器是什么?
答:请求拦截器:在发请求的时候统一发一些事情,比如 发请求的时候带token
响应拦截器:响应后,统一对响应做一些操作
========================================================
57、router原理
答:通过onhashchange监听地址栏hash值的改变通过配置的路由来跳转
========================================================
58、Promise、async和await分别是什么?
答:Promise解决回调地狱(一个场景)
async与await
作用:解决异步代码问题,可控制异步代码的执行顺序
用法:asunc写在函数前,await只能使用在async修饰的函数中,
用于等到异步操作结果
谈谈promise的理解?
异步操作(ajax/定时器)这些进行管理的
状态?
进行中:pending
已成功:fulfilled
已
========================================================
59、原型和原型链?
答:原型:
1 每个函数都有一个属性protottype(原型)
2 添加到原型上的属性和方法,被创建出来的实例对象共享
3 实例的_proto_上面等于构造函数的prototype
4 原型prototype上面还有一个属性constructor(构造器),指向构造函数本身
原型链:
每个构造函数的prototype也有自己的隐式原型,指向object,object向上找
指向null
========================================================
60、cookies sessionStorage和localstorage区别
答:cookies数据大小不能超过4K
session和local可以达到5M或更大
session会话存储:浏览器关闭就清除数据
local本地存储:只有不手动删除数据,就一直在
cookie设置的过期时间之前一直有效
数据与服务器之间的交互方式:
cookie的数据会自动传递到服务器,服务器也可以写cookie到客户端
session和local数据仅存在本地
========================================================
61、position的常用值
答:absolute 绝对定位 以父元素为准,脱离文本流
fiexd 绝对定位 以浏览器为准,脱离文本流
relative 相对定位 保留原有位置进行偏移
static 默认值
========================================================
62、如何进行网站性能优化?
答:1.减少http请求
2.使用浏览器缓存
3.启用压缩
4.精灵图sprites
5.减少cookies传输
========================================================
63、什么是优雅降级?渐进增强?
答:优雅降级:是一开始针对一个高版本浏览器构建页面完成功能,然后针对不同
浏览器测试,修复,保证低级浏览器也有基本功能
渐进增强:是针对低版本浏览器构建页面,满足基本要求,然后针对高级浏览器
进行追加
========================================================
64、socket连接过程三个步骤?
答:客户端向服务端发送SYN(连接请求)
服务器向客户端响应SYN
客户端向服务器发送ACK(确认请求)
========================================================
65、link和@import的区别?
答:1.link属性XHTML,除加载css外还用于定义RSS,@import只能加载css
2.link加载的文件,在页面加载的时候,link文件会同时加载,@import
是在页面加载完成再加载
3.@importIE5以下不能识别,link无兼容问题
========================================================
66、vue中scss是什么?安装步骤?几大特性?
答:scss是sass的一个升级版本,是css的预处理器
yarn add sass-loader -S //sass-loader依赖于node-sass
yarn add node-sass -S
在build文件夹下找到webpack.base.conf.js的rules里面添加配置
{
test:/\.scss$/,
loaders:['style','css','sass']
}
使用在style样式加上 lang="scss"
特性:1.嵌套
2.变量$开头
3.@mixin,通过@include引用
4.@extend .box 继承
5.@function send($a){@return $a*2}
调用:60+{send(50)}
6.引用父元素&
&::
7.计算功能,可以简单加减乘除
========================================================
67、vue-router导航钩子有哪些?有哪些参数?
答:全局钩子beforeEach(to,from.next)
to:从哪里来 from到哪里去 next放行
aftrEach(to,from)
路由独享导航钩子函数
beforeEnter
组件内部导航钩子函数
1.beforeRouteEnter //不能使用this
2.beforeRouteUpdate //只有路由发生改变才会触发
3.beforeRouteLeave
========================================================
68、什么是ajax?为什么要用ajax?如何原生使用ajax?
答:1ajax是与服务器交换数据并更新部分网页,而且不重新加载页面
2为什么yongajax
1,减轻服务器负担
2,无刷新更新页面
3,用户体验好
4,兼容性好
3.get 1.创建ajax引擎对象
2.设置请求方式和发生数据地址
3.监听请求和响应状态码
post的话在这里加上 设置请求头
4.发生数据 发送数据(设置参数)
========================================================
69、响应状态码status--http
答:200 成功
301 重定向
304 缓存
404 路径问题
403 没有权限后端
500 及以上 后端
========================================================
70、watchEffect与watch的区别
答:watch需要传入侦听的数据源,而watchEffect是自动收集数据源作为依赖
watch可以访问侦听状态变化前后的值,watchEffect只获取改变后的值
watch是数学改变的时候执行,watchEffect默认执行一次,属性改变也会执行
========================================================
71、常见的浏览器内核?
答:Trident //IE代表
Gecko //火狐
WebKit //苹果浏览器
Opera //欧朋
========================================================
72、MVVM和MVC的区别?
答:MVVM是模型、视图、视图模型
MVC是模型、视图、控制器
========================================================
73、vue中key的作用?
答:当相同标签名的标签名切换,需要通过key特性设置唯一的值来标记让vue
区分他们,否则vue为了效率会替换相同标签内部的内容
========================================================
74、vue的优点是什么?
答:双向数据绑定、组件化、数据结构分离、虚拟DOM、运行速度快
========================================================
75、css3兼容问题?
答:属性前加私有前缀
-webkit- 以webkit做内核的浏览器(chrome,safri)
-ms- IE
-moz- 火狐
-o- opera(手机)
========================================================
76、qs?
答:java写不用转,其它老的语言php、node.js写的需要用qs.stringify()转换一次,不然传不过去,不然拿不到参数。安装axios后自动就会有qs
========================================================
78、$nextTick
答:vue是异步渲染的,data改变后DOM不会立刻渲染。
$nextTick会在DOM渲染之后被触发,以获取最新DOM节点
========================================================
79、vue3
答:
========================================================
80、slot插槽、作用域插槽、具名插槽
答:slot:把父组件的内容插在子组件里,用slot接一下
父组件内的值会覆盖子组件内slot的值
作用域插槽:父组件里面取到子组件的数据,用template
具名插槽:父组件用template包裹要插入的值,v-slot:取个名
子组件name接收,如果没有定义接收,就对应到没有命名的slot里面
========================================================
81、动态组件
答:<component :is="组件变量"> </component>
在data里面写 组件变量:'要使用的组件名'
这就是动态组件,用于组件类型不确定的时候
========================================================
82、异步组件
答:import()函数,按需加载,异步加载大组件,不点不加载
组件最开始设置为v-if false,
组件加载里面写入:组件名:()=>import('组件地址')
========================================================
83、mixin vue如何实现组件的逻辑复用?
答:用mixin组件逻辑复用,但是有缺点
变量来源不明确,不利于阅读,多mixin可能会造成命名冲突
mixin和组件可能会出现多对多的关系,复杂度较高
Vue3的composition API解决这些问题
========================================================
84、vue-router路由模式
答:2种路由模式
hash模式 history模式
利用HTML5的history.pushState API来完成URL跳转而无需重新加载页面
需要服务器端支持,无论访问什么路径 服务器端都返回index.html这个文件
这种方案下前端要用路由配置404页面
========================================================
85、webpack和gulp的区别?
答:面向配置和面向过程
gulp:是面向文件处理过程的写法
webpack:主要就是配置好配置项:entry入口、output出口、配loaders(压缩。合并。混淆),devServer配置本地服务器
========================================================
86、数组的常用方法?
答:元素操作:push/shift/unshift/pop/splice
遍历方法:map/forEach/every/some/filter
查找方法:find/findIndex/indexOf/includes
排序方法:sort/reverse
拼接方法:concat
转字符串:join
----------------
for/forEach/map的区别?
forEach返回值
map返回新数组
for循环可以breadk调,forEach和map没法打断
========================================================
87、谈谈对作用域的理解?
答:标识符所能访问的范围
作用域有一个作用域链,他是用来帮助查找变量的,先找当前作用域找,找不到就往外层找,直到找到全局作用域window
========================================================
88、箭头函数和一般函数的区别?
答:this指向不同,箭头函数中的this指向定义它时所处的作用域(上一级)
详解: 1.全局:window
2.普通函数:谁调用,指向谁
3.对象方法:谁调用,指向谁
4.构造函数:创建出来的实例对象
5.事件:事件源
6.定时器:window
7.箭头函数:上一级。
========================================================
89、谈谈对闭包的理解?
答:跨作用域访问变量
如:父函数嵌套子函数,子函数访问父函数中的变量,就是跨作用域了,形成闭包
闭包是:【函数】+【(函数内部跨作用域访问的)变量】
闭包的作用:
1.保存变量不被释放
2.实现简单的模块化
3.私有化变量
闭包的缺点:不能滥用,避免内存泄漏
========================================================
90、原型与原型链?
答:原型的相关属性:
prototype:构造函数.prototype,是个对象,里面有被各个实例所共享的属性和方法
constructor:原型.constructor,指向构造函数
_proto_:实例上有_proto_,指向它所对应的原型
new 构造函数得到实例对象
原型的作用:原型上有可以被各个实例所共享的属性和方法
原型链的形成:
实例上的_proto_属性,指向他对应的原型,它的原型又可以是其他构造函数创建出来
的实例,(_proto_)它也有它对应的原型。这种关系层层递进,组成的链式结构就是原型链
原型链作用:查找属性和方法,先在对象自身上找,找不到就沿着原型链往上找,能找到Object.prototype
========================================================
91、对象的深浅拷贝
答:浅拷贝:只拷贝一层,遇到引用类型数据属性,拷贝地址
深拷贝:无线层级的拷贝,新旧对象互不影响
工作中常用:_.cloneDeep() Lodash工具库,处理数据结构
手写深拷贝:
1.进行类型判断
2.区分数组还是对象(for-in 遍历效率低,因为它能遍历原型链的属性)
如果是数组,用forEach(小点:for 和 while语句执行效率优于forEach)
如果是对象,用Objcet.keys()转成数组去遍历
========================================================
92、webpack打包
答:webpack进行文件的合并、压缩、混淆。本质上都是进行文件的处理(编译)
webpack和他的各自loader都是用node.js写的
Node.js提供了2种能力
1.处理文件(fs模块),进行文件读和写
2.处理网络请求(http模块)
========================================================
93、ts typescript了解 静态类型检测工具
答:更严谨,TS是js的超集,里面有类型系统,进行类型注解
function fn(num:number):boolean{
return Boolean(num)
}
TS的好处(价值)
1.提供了类型系统,更严谨,代码即是文档
2.提前发现问题(编译阶段就发现问题改正)
========================================================
94、babel
答:webpack里可以配,将ES6转ES5,是js的编译器
========================================================
95、
面试题 94题
于 2021-04-28 11:40:34 首次发布