第
看看这些前端面试题,带你搞定高频知识点(六)
每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么?想过之后再与答案比对,是不是会更好一点,当然如果你有比我更好的答案,欢迎评论区留言,一起探讨技术之美。
面试官:请你简述var、let、const三者之间的区别?
我:呃~,好的,三者的作用区别总结如下:
var:最常用的变量;允许重复声明,但会导致数据被覆盖;会产生变量提升;局部变量挂载到全局对象上,会造成全局对象的污染。
console.log(a)//因变量提升,vara;提到前面但是没有赋值,所以值为undefined
vara=1
vara=你好//var声明的变量会被重新赋值
console.log(a)//a会打印被重新赋值的值
console.log(window.a)//var声明的局部变量会被挂载到全局变量上,造成全局变量的污染。
let:es6新增命令,用法类似var;不允许重复声明;不存在变量提升;常作用于块级作用域而避免局部变量造成全局变量的污染。
leta=10;
console.log(a)//不存在变量提升,所以值为:10
console.log(window.a)//不会造成全局污染,所以值为undefined
for(leti=0;ii++){//会生成块级作用域,i的值只能在块级作用域中使用
console.log(i)
console.log(i)//因为拿不到块级作用域中的值,所以报错。
const:es6新增命令,用于声明常量且值无法被修改;声明常量必须立刻初始化,否则后期赋值报错;不能重复声明;const指向变量的地址,只要变量名所引用的地址不变就不会报错
constarr=[小张,小王,小李,小赵]
arr[0]=小明
console.log(arr)//[小明,小王,小李,小赵]
constarr=[]//报错
面试官:请你谈谈对深拷贝与浅拷贝的理解
我:呃~,好的,对两者的理解总结如下:
深拷贝:新数据与原数据互不打扰。
//扩展运算符在一维数组中是属于深拷贝,在多维数组中属于浅拷贝
letarr=[1,2,3]
letnewArr=[...arr]
newArr.push(4)
console.log(arr,newArr)//[1,2,3],[1,2,3,4]
//深拷贝用法
letlist=[
{id:1,name:张三,age:18},
{id:2,name:李四,age:28},
{id:3,name:王五,age:38},
letnewList=JSON.parse(JSON.stringify(list))
newList.pop()
console.log(list.length,newList.length)//32
当然,深拷贝也有一种标准写法,如下:
//标准的深拷贝=引用数据类型(数组,对象)
functiondeepClone(source){
consttargetObj=source.constructor===Array[]:{}
for(letkeysinsource){
if(source.hasOwnProperty(keys)){
//引用数据类型
if(source[keys]typeofsource[keys]===object){
targetObj[keys]=source[keys].constructor===Array[]:{}
//递归
targetObj[keys]=deepClone(source[keys])
}else{
//基本数据类型,直接赋值
targetObj[keys]=source[keys]
returntargetObj
letobj={
name:张三,
age:18,
hobby:[抽烟,喝酒,烫头],
action:{
am:敲代码,
pm:睡觉
letnewObj=deepClone(obj)
newO=李四
console.log(,newO)//张三李四
浅拷贝:新数据会影响原数据。