JavaScript面试深度解析:数据类型与拷贝

需积分: 0 0 下载量 164 浏览量 更新于2024-08-03 收藏 22KB DOCX 举报
"JavaScript面试题集,包含了24道关于JavaScript的基础及进阶问题,涉及数据类型、数据类型的判断以及浅拷贝与深拷贝的区别和实现方式等核心概念。" 在JavaScript中,数据类型是编程的基础,了解并熟练掌握它们至关重要。基本数据类型包括Undefined、Null、Boolean、Number、String和Symbol(ES6新增)。这些类型的值在内存中直接存储,且作为函数参数传递时,传递的是值的副本,因此对副本的修改不会影响原始值。例如,当一个基本类型的变量被传递到函数内部时,函数内部的修改不会影响到外部的变量。 引用数据类型仅有一种,即Object,它涵盖了对象、数组和函数。与基本数据类型不同,引用数据类型在内存中存储在堆中,而变量则保存对该对象的引用。这意味着当一个引用类型作为参数传递时,实际上是传递了对象的引用,而非实际值,因此函数内部对对象的修改会影响到外部的对象。 判断数据类型通常有以下几种方法: 1. `typeof` 操作符:可以用于判断除null之外的基本数据类型,对于null它会返回"object",需要注意的是`typeof null == "object"`。此外,`undefined`与`null`在逻辑比较中相等(`null == undefined`),但在严格相等比较中不等(`null !== undefined`)。 2. `A instanceof B`:用来检查A是否为B的实例,但这不适用于null和undefined。 3. `B.constructor === A`:判断A是否为B的构造函数,但这种方法对于基本数据类型和函数的构造器可能不准确,因为构造函数是可以被覆盖的。 4. `Object.prototype.toString.call()`:这是最准确的方法,通过调用对象的toString方法并传入call,可以获取到对象的[Class],从而判断其类型。 浅拷贝和深拷贝是JavaScript中处理复杂对象复制的重要概念。浅拷贝只复制对象的表面,即复制对象引用,而不是创建新的独立对象。这可能导致意外的副作用,因为原始对象和副本之间共享同一块内存。实现浅拷贝的方式包括: 1. `Object.assign()`:当目标对象只有一层时,它会进行深拷贝,但如果有嵌套的对象,那将是浅拷贝。 2. 扩展运算符(`...`):同样,它只进行一层的深拷贝。 深拷贝则创建了一个全新的对象,包括所有嵌套的对象和数组的完整副本。实现深拷贝的方法有: 1. 手动遍历和递归赋值:遍历对象的每个属性,如果属性是对象,则递归进行深拷贝。 2. 结合使用`JSON.parse()`和`JSON.stringify()`:将对象转换为JSON字符串,然后再解析成新对象,以此实现深拷贝。但这种方法有一些限制,如循环引用和函数、正则表达式、日期等非JSON格式的属性无法正确处理。 理解并熟练运用这些知识对于JavaScript开发者来说至关重要,特别是在处理复杂对象和数据结构时。在面试中,对这些概念的深入理解和应用能力常常是评估候选人技能的关键因素。