JS基础高频面试题及详细答案(实战版)_第1页
JS基础高频面试题及详细答案(实战版)_第2页
JS基础高频面试题及详细答案(实战版)_第3页
JS基础高频面试题及详细答案(实战版)_第4页
JS基础高频面试题及详细答案(实战版)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JS基础高频面试题及详细答案(实战版)一、变量、数据类型与作用域1.var、let、const的区别?参考答案:这三个都是JS声明变量的关键字,核心区别集中在作用域、变量提升、重复声明和赋值规则上,也是日常开发最常用的基础知识点:var:函数级作用域,存在变量提升,允许重复声明、重复赋值,声明的变量会挂载到window对象上。因为没有块级作用域,很容易造成变量污染,现在基本不推荐使用。let:块级作用域(大括号{}内有效),存在变量提升但有暂时性死区,不允许同作用域重复声明,支持重新赋值,不会挂载到window。适合值会变动的变量。const:块级作用域,规则和let基本一致,唯一区别是声明后不能直接重新赋值。如果是引用类型(数组、对象),可以修改内部属性/元素,因为const仅约束变量的内存地址,不约束地址内的数据。适合固定不变的常量。开发总结:日常开发优先用const,变量需要修改时改用let,彻底摒弃var。2.JS有哪些基础数据类型?如何区分基本类型和引用类型?参考答案:JS一共8种数据类型,分为基本类型和引用类型两类:基本类型(7种):String、Number、Boolean、Undefined、Null、Symbol、BigInt引用类型(1种):Object(包含普通对象、数组、函数、正则、日期等,本质都属于Object)核心区别:基本类型:值存储在栈内存,赋值是值拷贝,两个变量相互独立,修改一个不会影响另一个。引用类型:值存储在堆内存,变量仅存储内存地址,赋值是地址拷贝,多个变量指向同一个堆内存数据,修改一个会影响所有关联变量。3.null和undefined的区别?参考答案:undefined:表示未定义。变量声明后未赋值、函数无返回值、对象不存在的属性、函数缺失的形参,默认都是undefined。null:表示空对象,是主动赋值的空值。开发中常用null手动清空对象、变量,释放引用。经典特点:typeofnull结果是object(属于JS最初的bug,无法修复),typeofundefined结果是undefined。使用场景:未知初始值用undefined,主动置空数据用null。4.什么是暂时性死区?参考答案:ES6中,使用let、const声明的变量,在代码块开始到变量声明语句执行前的区间,就是暂时性死区。这个阶段变量已经完成变量提升,但无法被访问、使用,提前调用会直接报错Cannotaccess'xxx'beforeinitialization。暂时性死区解决了var变量提升带来的逻辑混乱问题,让代码执行顺序更严谨。示例:javascript

console.log(a);//报错

leta=10;二、运算符与类型转换1.==和===的区别?参考答案:==(宽松相等):比较前会自动隐式类型转换,只对比数值是否相等。比如1=='1'结果为true,null==undefined结果为true。===(严格相等):不做类型转换,必须类型和数值完全一致才返回true。1==='1'结果为false,null===undefined结果为false。开发规范:实际开发一律使用===,避免隐式转换带来的诡异bug,仅在判断null/undefined时可以用==。2.JS隐式类型转换规则有哪些?参考答案:隐式转换是JS自动触发的类型转换,常见场景如下:字符串拼接(+):只要有一个操作数是字符串,其余值都会转为字符串拼接。1+'2'='12'。数学运算(-、*、/):非数字值统一转为数字。'5'-2=3,true转为1,false、null转为0,undefined转为NaN。布尔判断:if、!、||、&&场景下,会转为布尔值。假值:0、''、null、undefined、NaN、false,其余全为真值。3.NaN的特点是什么?如何判断NaN?参考答案:NaN代表非数字,是Number类型的特殊值。核心特点:NaN不等于任何值,包括它自己,所以不能用==、===判断NaN。正确判断方式:ES5:isNaN(),会先做类型转换,存在误判ES6:Number.isNaN(),精准判断,只有纯NaN才返回true(开发推荐)三、作用域、闭包与变量提升1.讲讲JS的作用域类型参考答案:作用域就是变量的可访问范围,JS主要有3种作用域:全局作用域:页面加载后一直存在,全局变量任何位置都能访问,过多全局变量会造成变量污染。函数作用域:函数执行时创建,函数内部变量仅函数内可访问,执行结束后销毁。块级作用域:ES6新增,由{}包裹(if、for、while、代码块),let/const生效,解决了var的作用域混乱问题。2.什么是变量提升?函数提升和变量提升的区别?参考答案:JS代码执行前,解析器会先扫描代码,将var声明的变量和函数声明提升到当前作用域顶部,这就是提升。区别:var变量提升:只提升声明,不提升赋值,提升后默认值为undefined。函数声明提升:声明和函数体整体提升,提升后可以直接调用,不会报错。函数表达式不存在提升,和普通变量规则一致。3.什么是闭包?闭包的用途和弊端?参考答案:闭包定义:内层函数访问外层函数的变量,并且内层函数被外层函数返回、在外部执行,就形成闭包。简单说:函数嵌套,内部函数引用外部函数变量,外部函数执行完毕后,变量不销毁。核心用途:保存私有变量,实现数据私有化,避免全局污染缓存数据,保留函数执行后的状态实现防抖、节流、柯里化等常用工具函数弊端:闭包会让变量长期驻留内存,无法被垃圾回收,容易造成内存泄漏。解决方案:使用完毕后手动置空变量,解除引用。四、函数相关1.普通函数和箭头函数的区别?参考答案:箭头函数是ES6简化函数写法,和普通函数核心区别有5点:this指向不同:普通函数this指向调用者;箭头函数没有自己的this,继承外层作用域的this。arguments:箭头函数没有arguments对象,需要用剩余参数...args接收参数。构造函数:箭头函数不能作为构造函数,不能使用new关键字。prototype:箭头函数没有原型属性prototype。yield:箭头函数不能使用yield关键字,不能作为生成器函数。使用场景:回调函数、简短逻辑用箭头函数;需要this、构造函数、arguments的场景用普通函数。2.函数的this指向规则(最全基础版)参考答案:this的指向在函数调用时确定,和定义位置无关,基础场景如下:普通函数直接调用:this指向window(浏览器)/global(node),严格模式下为undefined对象方法调用:this指向调用该方法的对象构造函数new调用:this指向new创建的实例对象定时器回调:普通函数定时器this默认指向windowcall/apply/bind:this被强制绑定为指定对象箭头函数:this继承外层上下文,永远不改变3.call、apply、bind的区别?参考答案:三个方法都是用来修改函数this指向,核心区别在参数和执行时机:call:立即执行函数,参数逐个传递(fn.call(thisObj,1,2,3))apply:立即执行函数,参数以数组形式传递(fn.apply(thisObj,[1,2,3])),适合不确定参数个数的场景bind:不立即执行,返回一个修改完this的新函数,需要手动调用,支持参数预设五、数组常用方法1.数组遍历方法forEach、map、filter的区别?参考答案:forEach:单纯遍历数组,无返回值,不能中断遍历,仅用于执行批量逻辑操作。map:遍历并返回新数组,新数组长度和原数组一致,用于数据映射、批量修改数组元素。filter:遍历筛选元素,返回符合条件的新数组,数组长度小于等于原数组,用于数据过滤。2.数组哪些方法会改变原数组?哪些不会?参考答案:改变原数组(变异方法):push、pop、unshift、shift、splice、sort、reverse不改变原数组(非变异方法):map、filter、forEach、reduce、slice、concat、join、find、every、some,这些方法都会返回新数据,原数组保持不变。六、异步与事件循环基础1.同步和异步的区别?参考答案:同步:代码从上到下依次执行,上一行代码执行完毕,才会执行下一行,会阻塞后续代码执行。比如变量定义、循环、同步判断。异步:代码执行不会阻塞主线程,异步任务放入任务队列,等待同步代码执行完毕后再执行。比如定时器、ajax请求、Promise、事件监听。JS是单线程语言,依靠同步+异步机制,实现不阻塞页面渲染和交互。2.简单说说JS事件循环机制参考答案:事件循环是JS异步代码的执行机制,核心流程:先执行主线程同步代码,清空执行栈;执行所有微任务(Promise.then、async/await、queueMicrotask),清空微任务队列;执行宏任务(setTimeout、setInterval、ajax、DOM事件),每次执行一个宏任务后,再次清空微任务队列,循环往复。优先级:同步代码>微任务>宏任务七、原型与原型链1.什么是原型、原型链?参考答案:原型(prototype):每个函数都有prototype属性,是一个对象,用来存放公共方法和属性,供实例对象共享,节省内存。__proto__:每个实例对象都有__proto__属性,指向所属构造函数的prototype原型。原型链:对象通过__proto__向上层层查找原型,最终指向Ototype,终点为null,这条查找链路就是原型链。访问对象属性/方法时,先在自身查找,找不到就顺着原型链向上查找,直到顶层null。2.instanceof的原理?参考答案:instanceof用来判断构造函数的prototype是否出现在实例对象的原型链上。底层原理:循环遍历实例的__proto__原型链,逐层对比,找到对应prototype返回true,遍历到null未找到则返回false。可以精准判断引用类型,无法判断基本类型。八、垃圾回收与内存问题1.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论