面试之JS篇
1:数据类型 以及存储上面的差别
6种基本数据类型 Number/String/Boolean/null/undefined/symbol
引用类型 Object/Array/Function 以及Map Set等等
基本数据类型存储在栈中,引用类型存储在堆里面
基本数据类型赋值 分别指向不同的地址 引用类型赋值指向同一引用地址
2:数据类型判断的方法
typeof---只能判断基本数据类型
instanceof---只能判断引用类型
constructor---不能判断null和undefined类型,并且可能会被修改
object.prototype.toString.call()--可以判断所有类型
3:深拷贝和浅拷贝的区别
浅拷贝的实现 hasOwnProperty浅拷贝的一些方法 Object.assign Array.prototype.slice() Array.prototype.contact() 拓展运算符的应用
深拷贝的实现 循环递归 lodash里面的_.deepclone Jquery.exend JSON.stringfy()
浅拷贝和深拷贝都是创建了一个新的对象,但是复制对象属性的行为不一样,浅拷贝是复制属性指向某个对象的指针,它们共享一个内存 深拷贝创造另一个一模一样的对象 不共享内存
4:闭包的理解和闭包使用场景
闭包的理解:简单来说就是,函数被引用包围 这个引用就是函数周围的词法环境的引用 JS里面,一个函数被创建的同时,闭包也被创建出来了 闭包可以让内层函数访问到外层函数的作用域
使用场景:创建私有变量,延迟变量的生命周期 因为闭包函数被返回时它的词法环境不会被销毁----柯里化函数等
5:作用域和作用域链的理解
作用域是变量和函数可以访问的区域 全局 函数 块级 词法(变量被创建时就被确定好了 静态作用域)
作用域链 当前作用域 沿着词法作用域一层一层 知道全局作用域
6:原型和原型链
原型:搜索一个对象的属性可以在对象的原型上查找
原型链:原型对象也有原型 这样一层一层就构成了原型链,如果在对象原型上找不到属性会沿着原型链查找 原型链都是通过_proto_相连
对象的_proto_都是指向构造该对象函数的prototype
7:this
普通函数 new 关键字>显示绑定(bind,call,apply)>隐式绑定>默认绑定(window)
箭头函数
8:执行上下文和执行栈
执行上下文-全局上下文 函数上下文
生命周期:
创建:词法环境(全局,函数) 变量环境(变量声明了但是为赋值 此时为undefined)
执行:代码执行 变量赋值
回收:函数返回后 除闭包外词法环境会被回收
执行栈---后进先出 用来存储执行上下文
9:事件循环
js是单线程 所以事件执行又顺序的 先执行队列中 的同步任务 再执行异步任务 而异步任务又分为宏任务和微任务 会先执行队列中所以的微任务(.then process.nexttick) 再执行宏任务(setTimeout/setInterval,setimmediate)
async函数 返回Promise await await 后面会返回一个Promise await会阻塞它后面的代码 把后面的会放在微任务中
10:DOM BOM
DOM文档对象模型 添加 查找 修改 删除 节点
BOM浏览器对象模型---提供内容和浏览器交互的对象
常见的BOM对象---window location navigator history screen
11:JS本地存储
sessionStorage:页面关闭 存储会被清除
localStorage:永久储存
cookie:根据过期时间判断
12:Promise
js解决异步编程的一直方案,应用于网络请求等场景
三种转态 pending fulfilled rejected
.then方法返回一个Promise对象
promise的手写实现
13:防抖和节流
都是js提升性能的方案
防抖:n秒之后执行某个事件,若在n秒内事件被重复触发,重新计时
节流:固定频率只执行一次事件,重复触发无效
防抖简单手写:定时器
节流简单手写:时间
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界