JavaScript面试重点:变量声明、数据类型与闭包解析

需积分: 0 0 下载量 22 浏览量 更新于2024-08-03 收藏 26KB MD 举报
"JavaScript面试题,包括变量声明、数据类型判断、闭包、原型链、数组排序及循环方式的差异" 在JavaScript中,理解和掌握这些基本概念对于成为一名优秀的开发者至关重要。 ### 一、var、const和let的区别 1. **作用域**:var声明的变量在函数或全局范围内有效,称为变量提升;let和const则遵循块级作用域,它们的作用范围限制在声明所在的代码块内。 2. **变量提升**:var声明的变量会提升到其所在作用域的顶部,而let和const则不会出现这种情况,即它们在声明之前不可用。 3. **重复声明**:var允许在同一作用域内重复声明同名变量,let和const则不允许。 ### 二、常见的数据类型 JavaScript中的数据类型分为两大类: - **基本数据类型**:包括String、Number、Boolean、Undefined、Null、Symbol和BigInt。 - **引用数据类型**:主要为Object,它包含Array、Function、Date、Math、RegExp等子类型。 ### 三、判断JS数据类型的方法 - `typeof`:返回一个表示变量数据类型的字符串,但对于对象,除了null返回"object",其他引用类型都返回"object"。 - `instanceof`:检查对象的原型链中是否存在指定构造函数的原型,只适用于引用数据类型。 - `Object.prototype.toString.call()`:返回表示对象类型的字符串,如"[object Array]",可用于识别所有类型。 ### 四、闭包的概念 闭包是一种特性,使得内部函数可以访问并操作外部函数的变量,即使外部函数已经执行完毕。成立的条件包括: - 访问外部作用域。 - 函数嵌套。 - 在外部作用域中调用内部函数。 闭包常用于实现私有变量和封装。 ### 五、原型和原型链 - **原型**:每个对象都有一个隐式属性`__proto__`,指向创建它的函数的`prototype`属性,用于实现对象间的继承。 - **原型链**:通过`__proto__`链接的多个原型对象形成一条链,使得子类可以访问父类的属性和方法,直到链的终点是`Object.prototype`。 ### 六、数组排序方式 一种简单的排序算法是冒泡排序,如示例所示,通过两层循环不断比较并交换元素位置来达到排序目的。实际开发中,JavaScript的数组提供了内置的`sort()`方法,可以更方便地进行排序。 ### 七、for循环与forEach的区别 1. **跳出循环**:for循环可以用`break`语句中断,而forEach不支持`break`,但可以使用`return`跳出整个回调函数。 2. **循环起点**:for循环可自定义起始值,而forEach从索引0开始。 3. **修改索引**:for循环可以修改循环变量,影响后续迭代,forEach则不允许直接修改索引。 理解并熟练运用这些基础概念,将有助于你解决实际的JavaScript编程问题并在面试中表现出色。