js面试考点
js 面试考点
1、什么是闭包?闭包的影响?如何规避?
闭包:子函数可以使用父函数中定义的局部变量
影响:子函数引用的变量可能发生变化
this 的指向问题,内部函数的函数在 window 作用域下执行,所以 this 指向 windows,(在外部用 that=this)
内存泄漏问题:如果内层函数执行 alert(变量),会导致外部函数的变量在外部函数执行完成之后不能自动释放(变量名=null 主动释放)
2、什么是原型链?
原型链,简单理解就是原型组成的链,对象的proto就是他的原型,原型也是一个对象,也有proto属性,原型的proto又是原型的原型,这样就可以一直通过proto向上找,这就是原型链,当向上找到 Object 的原型的时候,这条原型链就算到头了。
3、this指向?
情况 1:如果一个函数中有 this,但是它没有被上一级的对象所调用,那么 this 指向的就是 window,这里需要说明的是在 js 的严格版中 this 指向的不是 window,但是我们这里不探讨严格版的问题,你想了解可以自行上网查找。
情况 2:如果一个函数中有 this,这个函数有被上一级的对象所调用,那么 this 指向的就是上一级的对象。
情况 3:如果一个函数中有 this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this 指向的也只是它上一级的对象
情况 4:this 永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的
4、JS基本类型(7种)?基本包装类型?
基本包装类型:内部创建对象,可以调用他自己内部的特殊行为
JS基本类型(7种):number string boolean NaN undefined Symbol bigint
基本包装类型:String boolean number
5、垃圾回收机制?
垃圾:一般来说,没有被引用的对象就是垃圾,如果有几个对象引用形成一个环,但是从根上不能访问他们,那么这几个对象也是垃圾
怎么检垃圾:标记-清除算法
6、==和===的区别
有没有强求数据类型相同
7、Let var const 的区别?
var 定义变量,存在变量提升,可以声明同名变量
let 只在当前作用域有效,不存在变量提升,不能声明同名变量
const 只在当前作用域有效,只能进行一次赋值,即声明之后不能再修改,同上
8、事件循环机制
主任务 微任务 宏任务
9、数组的方法有哪些?
push()
pop()
unshift()
shift()
split()
sort()
reverse() –反转数组
slice()
foreach()
map()
filter()
every()
some()
reduce()
indexof()
lastindexof()
Array.from()
Array.of()
copyWithin()
find()
findindex
fill()
includes()
keys()
values()
extries()
10、Call、apply、bind的区别
call()第二个参数是传给函数的参数
apply() 第二个参数必须是数组
bind() 返回一个函数,随处调用随处执行
11.arr.splice()和arr.slice()的区别
参数不同,arr.splice(i,n)表示从 i 开始截取 n 个元素,返回删除的元素
arr.slice(start,end) 表示截取从 start 开始到 end(不包括 end)结束的元素,返回截取出来的值
12、深拷贝浅拷贝有哪些?
====
12、减少网页加载时间的方法/浏览器优化
- 采取 CDN 加速
- CSS 放头部、JavaScript 放尾部
- 减少 DOM 操作、添加事件委托
- 对于图片可以懒加载(vue中有懒加载,实现方式可百度)
- 合并 CSS 图片(精灵图/雪碧图)
- 减少使用 iframe
压缩 js 和 css 文件
13、解决跨域的方法?
配置 config 文件
jsonp
14、事件委托的理解
利用事件冒泡的原理,指定一个事件处理程序可以处理整个类型的所有事件
//处理兼容性个问题
var Event = e||windows.e
var Target = e.target||e.srcElement
//被触发的节点
target.nodeName
15、new操作符具体干了什么(换个问法:new关键字干了什么)
https://sunmenglei.blog.csdn.net/article/details/109766573
- 创建一个空对象
- 设置原型链
- 改变 this 的指向
- 返回新对象(判断 Func 的返回值类型,如果没有返回值或者返回一个非对象值,则将 obj 作为新对象,否则就将 result 返回)
16、setTimeout和setInterval的区别
setTimeOut()是延迟执行,只执行一次
setInterval()是间隔执行,不清楚计时器就会一直执行下去
17、js6种假值
null
undefined
“”
0
false
NaN
18、Promise有哪些方法
- Promise.all
Promise.all([]).then(res=>{}).catch(err=>{})
//接收一个 Promise 数据,返回一个 Promise,只有当这个数组中的所有 Promise 对象成功执行之后才会执行 then 里面的回调函数,若数组中的任意一个 promise 被拒绝,就会执行 catch
- Promise.any
Promise.any([]).then(res=>{}).catch(err=>{})
//同上,但是 promise 中只要有任意一个完成时就会终止
- Promise.race
Promise.race([]).then(res=>{}).catch(err=>{})
//当数组中的任意一个 promise 被拒绝或者成功,则会采用第一个 promise 作为他的返回值
- Promise.allSettled
Promise.allsettled([]).then(res=>{}).catch(err=>{})
//当 promise 中的所有 promise 被拒绝后返回被拒绝的数组
19、数组去重方法
- set
return Array.from(new Set(arr))
- for splice
for 循环到有重复的用 splice 切除
- indexof
用 indexof 找到不重复的就存到数组中
- sort
用 sort 排序后去重
- 对象属性不能相同
将数组的值作为属性,判断属性是否存在
- includes
判断下一个元素是否存在在型数组的元素中
- hasOwnProperType
- filter indexof
arr.filter((value,index)=>{
return arr.indexof(item,0)===index
})
- 递归
- map
- reduce+includes
arr.reduce((pre,cur)=>{
pre.includes(cur)?pre:[cur,…pre]
})
- […new Set(arr)]
19、null和undefined的区别
- null
- 表示一个无的对象,转为数值时为 0
- 表示此处不该有值
- undefined
- 表示一个无的原始值,转为数值时为 NaN
- 表示缺少值,此处应该有值,但是还没有定义
20、什么是箭头函数?箭头函数的特点(箭头函数工作中用得很多哈)
用箭头简化 function 写法的函数
特点:
- 没有自己的 this,不能用 call apply 改变 this 的指向
- 不存在 arguments,用 rest,…等方法代替
- 不能当构造函数使用,没有 prototype 属性
21、Set、Map的方法
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!