JS 对象高频面试题(附详细真实面试风答案)_第1页
JS 对象高频面试题(附详细真实面试风答案)_第2页
JS 对象高频面试题(附详细真实面试风答案)_第3页
JS 对象高频面试题(附详细真实面试风答案)_第4页
JS 对象高频面试题(附详细真实面试风答案)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

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

文档简介

JS对象高频面试题(附详细真实面试风答案)整套试题覆盖:对象基础、属性特性、原型、深浅拷贝、遍历、解构、高频坑点、手写代码,全部为前端面试高频原题,答案贴合真实面试口述逻辑,无套话、无模板感。一、基础概念题1.JS对象的本质是什么?对象和普通变量的区别?答案:JS对象是键值对的无序集合,属于引用数据类型。简单说就是一组属性和方法的封装体,用来存储多个相关的数据和功能。区别主要有两点:1.基本变量(字符串、数字、布尔等)是值类型,赋值是值拷贝,两个变量互不影响;对象是引用类型,赋值是地址拷贝,多个变量指向同一个堆内存,修改一个会影响另一个。2.基本变量只能存单一值,对象可以批量存储多个不同类型的数据、函数。2.创建JS对象有哪几种方式?各自优缺点?答案:常见四种创建方式:(1)字面量创建{}最常用、最简单,语法简洁,适合创建单个对象。缺点是批量创建多个相似对象时,代码冗余,方法会重复创建,浪费内存。(2)newObject()创建原生内置构造函数,和字面量效果一致,语法繁琐,实际开发几乎不用。(3)自定义构造函数创建适合批量创建同类对象,统一属性和结构。缺点是每个实例都会单独创建方法,内存占用高。(4)ES6class类创建语法更规范、面向对象风格清晰,方法挂载在原型上,所有实例共享方法,节省内存,是目前项目主流写法。本质是构造函数的语法糖。3.对象的属性名有哪些规则?可以用哪些类型做属性名?答案:1.对象属性名默认会自动转为字符串或Symbol类型,数字、布尔、字符串都可以当属性名;2.普通标识符可以直接写(不用引号),含空格、特殊字符、数字开头的属性名,必须用[]包裹;3.Symbol作为属性名,属性是唯一、不可重复、不会被常规遍历遍历到的;4.属性名不区分变量,直接写的键名都是字面量,变量作为键必须用中括号[]。示例:PlainText

letkey='name'

letobj={

name:'张三',//普通键

123:'数字键',

'userage':'含空格键',

[key]:'变量键'

}

二、对象属性与特性高频题4.说说对象的四大属性描述符分别是什么?作用?答案:每个对象属性都有内置特性,通过Object.getOwnPropertyDescriptor获取,四个描述符:1.value:属性对应的值,默认undefined。2.writable:是否可修改,布尔值,默认true。设为false后,属性无法重新赋值。3.enumerable:是否可枚举(可被for...in、Object.keys遍历),默认true。设为false后,遍历取不到该属性。4.configurable:是否可删除、可修改描述符,默认true。设为false后,无法删除属性,也无法修改其他三个描述符,且不可逆。日常用途:做属性只读、隐藏私有属性、锁定对象属性配置。5.Object.freeze、Object.seal、Object.assign的区别?答案:1.Object.freeze(冻结对象)冻结后:属性不可修改、不可新增、不可删除,writable、configurable全部置为false。注意:浅冻结,如果属性值是对象,内层对象依然可以修改。2.Object.seal(密封对象)密封后:不能新增、不能删除属性,但可以修改原有属性值。仅把configurable置为false。3.Object.assign(对象合并)用于合并对象、拷贝对象,属于浅拷贝,只会拷贝自身可枚举属性,不会拷贝原型属性、不可枚举属性。6.如何判断一个属性是对象自身属性还是原型属性?答案:1.hasOwnProperty():最常用,只判断自身属性,原型上的属性返回false;2.in关键字:只要对象或原型链上存在该属性,就返回true,无法区分自身和原型;3.Object.hasOwn():ES2022新方法,替代hasOwnProperty,更安全,不受原型污染影响。示例:PlainText

letobj={name:'张三'}

console.log(obj.hasOwnProperty('name'))//true自身属性

console.log(obj.hasOwnProperty('toString'))//false原型属性三、对象遍历面试题7.JS对象遍历的5种方式及区别?答案:1.for...in遍历自身+原型链上所有可枚举属性,会遍历原型属性,一般需要搭配hasOwnProperty判断,项目少用。2.Object.keys()返回数组,只遍历自身可枚举属性,最常用。3.Object.values()返回数组,获取自身可枚举属性的属性值。4.Object.entries()返回键值对数组,自身可枚举属性,适合解构遍历。5.Reflect.ownKeys()遍历自身所有属性(可枚举+不可枚举+Symbol属性),不包含原型属性。四、深浅拷贝核心面试题(必考)8.什么是浅拷贝、深拷贝?区别是什么?答案:浅拷贝:只拷贝对象的第一层属性。如果第一层属性是基本类型,拷贝值;如果是引用类型,拷贝内存地址。修改新对象内层对象,会影响原对象。深拷贝:递归拷贝对象所有层级属性,完全开辟新内存,新旧对象彻底独立,修改互不影响。核心区别:只针对多层级引用对象,单层对象深浅拷贝无差异。9.浅拷贝的实现方式有哪些?答案:1.对象扩展运算符...:letnewObj={...obj}2.Object.assign({},obj)3.手动循环遍历赋值以上全部为浅拷贝,只能复制第一层可枚举属性。10.深拷贝的实现方式?手写简易深拷贝答案:常用三种方式:1.JSON.parse(JSON.stringify(obj)):简单粗暴,适合纯数据对象,缺点:无法拷贝函数、undefined、Symbol、正则、日期,会丢失或出错;2.递归手写深拷贝:兼容性强,支持所有类型;3.第三方库lodash.cloneDeep:项目常用,稳定全面。手写简易深拷贝代码(面试必背):PlainText

functiondeepClone(obj){

//基础类型直接返回

if(obj===null||typeofobj!=='object')returnobj

//区分数组和对象

letnewObj=Array.isArray(obj)?[]:{}

//递归遍历赋值

for(letkeyinobj){

if(obj.hasOwnProperty(key)){

newObj[key]=deepClone(obj[key])

}

}

returnnewObj

}

五、对象解构高频面试题11.对象解构的特点、默认值、重命名规则?答案:1.对象解构无序,根据键名匹配,和顺序无关;数组解构有序,按位置匹配。2.重命名:原键名:新变量名,解决变量名冲突。3.默认值:当对象无对应属性、属性值为undefined时生效,null、0、空字符串不会触发默认值。示例:PlainText

letobj={name:'李四',age:20}

//重命名+默认值

let{name:username,sex='男'}=obj

console.log(username,sex)//李四男

12.函数参数对象解构的优势?项目常用写法答案:传统传参如果参数过多,顺序容易乱、可读性差。对象解构传参无需关注顺序,可设置默认值,代码更清晰,是项目接口请求、组件传参主流写法。示例:PlainText

//解构传参+默认值

functiongetUserInfo({name='默认用户',age=18}={}){

console.log(name,age)

}

//必须加={}防止不传参数时报错

六、原型与对象核心坑点(面试压轴)13.对象的__proto__、prototype、constructor区别?答案:1.prototype:函数专属(构造函数、class),是函数的原型对象,存放所有实例共享的方法和属性。2.__proto__:对象专属(所有实例对象),指向所属构造函数的prototype,是原型链查找的核心。3.constructor:原型对象上的属性,指向对应的构造函数,可用来判断对象的构造类型。核心关系:实例.__proto__===构造函数.prototype14.原型链的属性查找规则?答案:1.访问对象属性时,先在自身属性中查找,找到直接返回;2.自身没有,就通过__proto__向上查找原型对象;3.原型没有,继续向上找原型的原型,直到找到Ototype;4.Ototype没有则返回undefined。15.为什么修改原型属性,所有实例都会生效?修改实例不会影响原型?答案:所有实例的__proto__都指向同一个原型对象,原型是所有实例的共享空间。修改原型的属性和方法,所有实例访问时都会读取到最新值。而修改实例属性,只是给当前实例自身新增/修改属性,不会改动原型,所以不影响其他实例和原型。如果实例自身属性和原型重名,会自身属性优先,覆盖原型属性。七、高频错题/坑点题16.说说对象中undefined和删除属性的区别?答案:1.给属性赋值为undefined:属性依然存在对象中,可枚举、可遍历,只是值为空;2.delete删除属性:直接移除该属性,对象中彻底不存在,遍历、

温馨提示

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

最新文档

评论

0/150

提交评论