版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JS基础高频面试题(超详细真实面试版答案)一、变量、作用域与变量提升1.var/let/const的区别?参考答案:日常开发里,我基本不用var,优先let/const,三者核心区别集中在作用域、变量提升、重复声明、赋值这几点:1.作用域不同:var是函数作用域,let、const是块级作用域({}、if、for内部都能锁住变量);2.变量提升不同:var声明的变量会提升,默认赋值为undefined;let、const也会提升,但存在暂时性死区,声明前不能访问,直接报错;3.重复声明:var允许重复声明同一个变量;let、const同一作用域内不允许重复声明;4.赋值特性:var、let可以修改值;const声明后不能重新赋值(注意:如果是对象/数组,属性/内部元素可以改,因为const锁的是内存地址);开发规范:默认用const,需要修改变量时用let,彻底废弃var。2.什么是暂时性死区?参考答案:在代码块中,用let、const声明的变量,在声明语句执行之前,无法被访问,这段区间就是暂时性死区。很多人误以为let/const没有变量提升,其实是提升了,但引擎为了规避var的缺陷,锁住了变量,声明前读取直接报Cannotaccessbeforeinitialization。简单说:提升了但不能用,直到代码执行到声明行。3.什么是变量提升?函数提升和变量提升的优先级?参考答案:JS代码执行前,引擎会先扫描一遍代码,把变量、函数的声明提到当前作用域顶部,这就是提升,赋值逻辑不会提升。优先级:函数提升>var变量提升举个真实执行逻辑:同一作用域内,先提升函数声明,再提升var变量。变量名和函数名重名时,函数会覆盖变量。二、数据类型与判断1.JS有哪些数据类型?怎么分类?参考答案:一共8种数据类型,分为基本类型和引用类型:基本类型(7种):String、Number、Boolean、Undefined、Null、Symbol、BigInt引用类型(1种):Object(包含普通对象、数组、函数、正则、日期等,本质都是Object)核心区别:基本类型存栈内存,值独立互不影响;引用类型栈内存存地址,堆内存存真实值,多个变量共用同一个地址,改一个会互相影响。2.typeof、instanceof、Ototype.toString的区别和使用场景?参考答案:这三个是开发中最常用的类型判断方法,各有优劣:1.typeof:只能精准判断基本类型(除了null),判断引用类型除了function都返回object。坑:typeofnull==='object'(历史bug),typeof[]==='object'。适用场景:快速判断字符串、数字、布尔、undefined、函数。2.instanceof:通过原型链判断引用类型,只能判断对象、数组、自定义实例,不能判断基本类型。坑:跨窗口、跨框架判断会失效,原型链可手动修改,结果不准。适用场景:判断自定义类实例、区分复杂引用类型。3.Ototype.toString.call():JS最精准的类型判断方法,能区分所有内置类型。返回格式固定:[object类型名],开发中写工具类类型判断基本都用这个。3.null和undefined的区别?参考答案:两者都代表“空”,但语义和使用场景完全不同:1.undefined:代表未定义、缺少值常见场景:变量声明未赋值、函数无返回值、对象不存在的属性、形参未传实参。2.null:代表手动置空、主动清空是开发者主动赋值的空值,用来释放对象引用、清空变量。开发规范:主动清空变量用null,不要手动赋值undefined。三、运算符与隐式转换1.==和===的区别?参考答案:1.==是宽松相等,会先隐式转换类型,再比较值;2.===是严格相等,不转换类型,类型不同直接false,类型相同再比值。开发原则:全程优先用===,只在判断null/undefined时可以用obj==null(等价于obj===null||obj===undefined)。2.JS隐式转换规则了解吗?参考答案:日常最常见的是加减运算、==比较的转换,核心规则很简单:1.字符串+任意值:全部转字符串,做拼接;2.减法/乘除/比较运算:全部转数字,再计算;转数字失败会变成NaN;3.布尔转换:假值只有6个:0、''、null、undefined、NaN、false,其余全是真值;4.对象转换:优先调用valueOf(),再调用toString()。四、原型与原型链(核心基础)1.说说原型、原型链的理解?参考答案:JS是基于原型的面向对象语言,没有类的真正继承,靠原型实现属性方法共享。1.prototype(显式原型):每个构造函数都有,用来存放实例共享的方法和属性,节省内存;2.__proto__(隐式原型):每个实例对象都有,指向自己构造函数的prototype;3.原型链:实例的__proto__层层向上查找,直到Ototype,最后指向null,这条链式结构就是原型链。属性查找规则:先找自身属性,没有就顺着原型链往上找,找到为止,找到顶层没有就返回undefined。2.constructor属性了解吗?参考答案:每个原型prototype都有constructor,默认指向当前构造函数。作用:可以通过实例找到自己的构造函数。注意:手动修改原型prototype时,会丢失constructor指向,开发中如果需要用到该属性,要手动修正。五、执行上下文、作用域与闭包1.什么是执行上下文?有几种?参考答案:JS代码执行时,引擎创建的一个运行环境,用来存放变量、函数、this、作用域等信息,就是执行上下文。分为三种:1.全局执行上下文:页面加载就创建,全局唯一;2.函数执行上下文:函数调用时创建,执行结束销毁;3.eval执行上下文:基本不用。代码执行遵循调用栈规则:后进先出。2.什么是闭包?闭包的用途和弊端?参考答案:通俗定义:内层函数访问外层函数的变量,并且外层函数执行结束后,内层函数依然可以使用外层的变量,这就形成了闭包。核心原理:函数执行结束后,正常变量会销毁,但因为闭包保留了对外部作用域的引用,变量不会被回收。用途:1.实现私有变量,避免全局变量污染;2.缓存数据、保存状态(比如防抖节流、定时器、循环绑定事件);3.模块化开发。弊端:1.变量常驻内存,不会自动销毁,容易造成内存泄漏;2.滥用闭包会导致页面性能变差。解决方式:使用完手动置空变量,解除引用。六、this指向(面试高频)1.各种场景下的this指向?参考答案:this指向调用时的环境,和定义位置无关,所有场景可以总结为5条:1.全局调用:普通函数直接调用,this指向window(浏览器)/global(node),严格模式下是undefined;2.对象方法调用:谁调用指向谁,指向调用的对象;3.构造函数调用:this指向new出来的实例对象;4.箭头函数:没有自己的this,继承外层作用域的this,且this绑定后不可修改;5.call/apply/bind:强制修改this指向,指向传入的第一个参数。2.call、apply、bind的区别?参考答案:三者都是修改函数this指向,核心区别在传参方式和执行时机:1.call:立即执行函数,参数一个个依次传递;2.apply:立即执行函数,第二个参数是数组/类数组;3.bind:不立即执行,返回一个绑定好this的新函数,需要手动调用,参数可分批传递。七、数组常用方法与深浅拷贝1.数组哪些方法会改变原数组?哪些不会?参考答案:改变原数组(变异方法):push、pop、unshift、shift、splice、sort、reverse不改变原数组(非变异方法):map、filter、reduce、forEach、find、findIndex、slice、concat、join、every、some开发注意:日常处理数组数据,优先用非变异方法,避免修改原数据引发副作用。2.深拷贝和浅拷贝的区别?手写简单深浅拷贝?参考答案:浅拷贝:只拷贝一层属性,基本类型拷贝值,引用类型只拷贝内存地址,新旧对象引用同一个堆数据,改引用属性会互相影响。常见浅拷贝:Object.assign、扩展运算符...、slice、concat。深拷贝:层层递归拷贝,完全开辟新的内存空间,新旧对象彻底独立,修改任意属性互不影响。常用实现方式:1.简单场景:JSON.parse(JSON.stringify(obj))(缺点:无法拷贝函数、undefined、Symbol,会丢失属性);2.复杂场景:手写递归深拷贝、使用lodash的cloneDeep。八、异步与事件循环1.JS为什么是单线程?参考答案:JS最初是为了浏览器交互设计的,主要操作DOM、处理用户交互,如果多线程会出现同时修改同一个DOM的冲突问题,所以设计为单线程。为了解决单线程阻塞问题,才有了异步、事件循环机制。2.宏任务和微任务的区别?执行顺序?参考答案:JS异步任务分为宏任务、微任务,微任务优先级高于宏任务。宏任务:script整体代码、setTimeout、setInterval、AJAX、DOM事件微任务:Promise.then/catch/finally、async/await、queueMicrotask完整执行顺序:1.先执行一轮同步代码;2.清空当前所有微任务队列;3.执行一个宏任务;4.循环往复(事件循环)。3.async/await的理解?和Promise的关系?参考答案:async/await是Promise的语法糖,本质还是Promise,只是把异步代码改成同步写法,解决了Promise链式调用嵌套过多的问题。规则:1.async修饰的函数,返回值一定是Promise对象;2.await只能在async函数内部使用,会阻塞后续代码,等待Promise状态完成;3.await后面Promise失败会报错,需要用try/catch捕获异常。九、垃圾回收与内存机制1.JS垃圾
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 采购员岗中考核试卷含答案
- 污水处理工岗中工艺控制考核试卷含答案
- 表面活性剂制造工岗中进度管理考核试卷含答案
- 2025年直播商务笔试题库及答案
- 2025年中国传统文化知识竞赛题库(附答案)
- 2025年中级注安《安全生产法律法规》考试真题及答案解析
- 2025年注册城乡规划师《城乡规划实务》真题(附答案)
- 2025年装配式建筑设计(结构原理与施工)试卷及答案
- 2025三基三严考试题题库(含答案)
- 2025下半年教资笔试《幼儿综合素质》真题及答案
- 山东省菏泽市菏泽经济技术开发区2026-2027学年七年级上学期10月阶段检测语文试题(含答案)
- 2026年广东省公需课《加快培育发展新质生产力》考试答案
- 2026年农田废弃物的资源化利用路径
- 江西新华发行集团有限公司赣州市分公司2026年公开招聘工作人员笔试参考题库及答案解析
- 2026年公路水运工程助理试验检测师练习题附答案
- 2026年成人高考专升本政治真题试卷及完整答案解析(官方标准)
- 2026年江苏盐城市中考物理试题(含解析)
- 2026年大学试题(管理类)-港口规划与布置历年参考题库含答案解析
- 2026年道德与法治四年级上册第5课《生命最宝贵》教案设计(2课时)
- 中远海运集团招聘笔试题目及答案
- 2026中国电信历年考试笔试题库及答案
评论
0/150
提交评论