面试题(2021-12)
JavaScript
1.闭包的概念:什么是闭包,有什么优缺点,如何释放 在项目中拿闭包来干嘛:
Vue data是一个典型的闭包 return
函数内部定义函数,连接函数内部和外部的桥梁,内层函数引用着外层函数的变量 无法释放 形成闭包,闭包就是能够读取其他函数内部变量的函数
优点:防止全局污染 缺点:消耗内存
释放:javaScript闭包变量对象中未用到的属性,js引擎会释放其占用的内存空间
参考答案:js闭包实例汇总 - front-gl - 博客园
2.面向对象开发有哪些主要特征
封装 继承 多态 面向对象的特征是什么-常见问题-PHP中文网
3.什么是原型链,原型对象
原型对象:每一个对象上,都有一个属性,叫__proto__,它指向了一个对象,这个对象我们叫原型对象。
原型链:原型链指查找对象上某个属性的查找机制,查找一个对象上的私有属性,先在自己的私有属性中找,找不到,就沿着__proto__去原型对象上找
原型对象和原型链_小召小召的博客-CSDN博客_原型对象和原型链
4.什么是作用域,作用域链
作用域:一个变量可以访问的范围 全局作用域 局部作用域 块级作用
作用域链:调用某个函数或属性时,先在当前作用域寻找,如果找不到的情况下去父级寻找,如果父级找不到继续向上级寻找,直到找到全局作用域为止,这就是作用域链
5.数组常用API
1.push()从数组的尾部插入一个或多个元素,会修改原数组,返回新数组长度
2.pop()从数组的尾部删除一个元素,会修改原数组,返回被删除的元素
3.unshift() 从数组的头部插入一个或多个元素,会修改原数组, 返回新数组长度
4.shift() 从数组的头部删除一个元素
5.slice(start, end) start:开始下标, end:结束下标(end切不到) ,不会修改原数组,返回裁切出来的数组
6.splice(start, length, [可选参数列表]) start:开始裁切的下标, length:要裁切多少个
7.concat([多个参数]) 连接一个或多个数组, 不会修改原数组,返回连接过后的数组
8.join("连接符"); 以特定的连接符, 把数组连接成字符串
9.reverse() 反转数组, 把数组的顺序进行颠倒
10.filter() 过滤数组方法, 里面接受一个回调函数, 不修改原数组,会创建新数组, 接收过滤出来的满足条件的元素, 并且返回这个数组
11.map() map数组方法, 里面接受一个回调函数,不修改原数组,返回一个新数组, (为原数组的每一项经过函数处理后的返回值)
12.forEach(function(ele, i, array)){ //业务逻辑 } 把forEach当成for循环来使用, forEach就是用来遍历数组的
13.lastIndexOf(要查找的元素, 指定下标)
6.什么是事件冒泡/事件捕获
事件冒泡:事件被触发时一层一层往上传递到window对象
事件捕获:与事件冒泡相反,由外到里
解决方法:
(1)通过返回false来取消默认的行为并阻止事件起泡。
(2)通过使用 preventDefault() 方法只取消默认的行为
(3)通过使用 stopPropagation() 方法只阻止一个事件起泡。
7.什么是构造函数
Function Aaa(name){
This.name = name;
}
通过 new 函数名 来实例化对象的函数叫构造函数
8.es6有哪些新特性
ES6:let const; 箭头函数;模板字符串;promise;解构赋值;数组新增的法:forEach,map,filter,some,every,indexOf;参数默认值,模块的导入和导出。
9.var、let和const 的区别是什么
(1)块级作用域:let和const具有块级作用域,var不存在块级作用域。
(2)变量提升:var存在变量提升,let和const不存在变量提升,即在变量只能在声明之后使用,否则会报错。
(3)给全局添加属性:浏览器的全局对象是window,Node的全局对象是global。var声明的变量为全局变量,但是let和const不会。
(4)重复声明:var声明变量时,可以重复声明变量,const和let不允许重复声明变量。
(5)暂时性死区:在使用let、const命令声明变量之前,该变量都是不可用的。这在语法上,称为暂时性死区。
(6)初始值设置:在变量声明时,var 和 let 可以不用设置初始值。而const声明变量必须设置初始值。
(7)指针指向:let和const都是ES6新增的用于创建变量的语法。 let创建的变量是可以更改指针指向(可以重新赋值)。但const声明的变量是不允许改变指针的指向。
10.普通函数和箭头函数的区别
(1)箭头函数比普通函数更加简洁
(2)箭头函数没有自己的this
(3)箭头函数继承来的this指向永远不会改变
(4)call()、apply()、bind()等方法不能改变箭头函数中this的指向
(5)箭头函数不能作为构造函数使用
(6)箭头函数没有自己的arguments
(7)箭头函数没有prototype
(8)箭头函数不能用作Generator函数,不能使用yeild关键字
11.不同场景下,this指向有哪些
(1)在全局中this指向window
(2)在函数中(普通函数),this永远指向调用他的那个对象
(3)在箭头函数中,箭头函数中没有this,使用的this就是箭头函数父级的this。
(4)在构造函数中,this指向构造出来的实例。
12.什么时候用that
Let that = this;
原因:this指向的对象发生了变化,故需要在函数前将this指向的对象提前保存一下为了避免这种问题,我们可以用that来指向,就是把this指向that,把this复制一份,给that,这样的话下面的that所表示的就一直是原先第一次指定的那个对象了
getList(){
Let that = this;
that
}
13.如何判断一个变量是否为数组/对象
(1)用Object.toString()方法判断
(2)通过Array.isArray()可以判断一个对象是否为数组
(3)判断原型
(4)判断构造函数
14.什么是跨域?为什么会导致跨域?在实际开发过程中,有哪些方法解决
什么是跨域,为什么浏览器会禁止跨域,以及实现跨域的几种方式_weixin_30536513的博客-CSDN博客
浏览器出于安全考虑 要求前后端 协议 域名 端口 一定要一致 只要有一个不一样就会违反同源策略 造成跨域问题
跨域:浏览器的一个安全策略 同源策略 约定 域名 主机 端口号一致 不然就会触发同源策略 导致跨域
解决跨域的手段: JSONP (vue里面安装一个jsonp插件) Cors跨域
Proxy 代理跨域 正向代理 接口转发 vue.config.js Nginx 反向代理
15.常见的http状态码有哪些?代表什么
(1)信息代码:1xx:信息,请求收到,继续处理;
(2)成功代码:2xx:成功,行为被成功地接受、理解和采纳;
(3)重定向:3xx:重定向,为了完成请求,必须进一步执行的动作;
(4)客户端错误:4xx:客户端错误,请求包含语法错误或者请求无法实现;
(5)服务器错误:5xx:服务器错误,服务器不能实现一种明显无效的请求;
16.防抖和节流的概念,应用场景
函数防抖(debounce):指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间
函数节流(throttle):就是指连续触发事件但是在 n 秒中只执行一次函数
17.js中的事件队列
Js事件循环 eventLoop 什么是宏任务 微任务
在JavaScript中,任务被分为两种,一种宏任务(MacroTask),一种叫微任务(MicroTask)
常见的宏任务:script全部代码、setTimeout、setInterval
常见的微任务:Promise中then的回调函数、MutationObserver、Process.nextTick
18.数组去重有哪些方法