JavaScript中的变量声明是开发过程中最基础的操作,不同的声明方式对应不同的作用域、提升特性和修改规则,同时变量声明的类型也会和数据类型紧密相关,直接影响代码的运行逻辑。

JS变量声明的三种方式
JavaScript目前主流的变量声明方式有三种,分别是var、let、const,三者的特性和使用场景有明显差异。
1. var声明
var是ES5及之前版本使用的变量声明方式,它的作用域是函数作用域,存在变量提升的特性,并且可以重复声明同一个变量。
// var变量提升示例 console.log(a); // 输出undefined,不会报错 var a = 10; console.log(a); // 输出10 // var重复声明示例 var b = 20; var b = 30; // 不会报错,b的值被覆盖为30 console.log(b); // 输出30
2. let声明
let是ES6引入的变量声明方式,作用域是块级作用域,不存在变量提升,且不允许在同一作用域内重复声明变量。
// let块级作用域示例
{
let c = 40;
console.log(c); // 输出40
}
// console.log(c); // 报错,c在块外无法访问
// let重复声明示例
let d = 50;
// let d = 60; // 报错,不允许重复声明
3. const声明
const同样是ES6引入的声明方式,声明的是常量,一旦赋值后不能再重新赋值,作用域也是块级作用域,不存在变量提升,不允许重复声明。
// const声明基本类型数据
const e = 70;
// e = 80; // 报错,不能修改const声明的常量
// const声明引用类型数据
const obj = { name: "test" };
obj.name = "newTest"; // 允许修改引用类型的属性
console.log(obj.name); // 输出newTest
// obj = {}; // 报错,不能重新赋值给obj
JS常见数据类型
JavaScript的数据类型分为基本数据类型和引用数据类型两大类,变量声明后可以存储对应类型的数据。
基本数据类型
基本数据类型包括Number、String、Boolean、Undefined、Null、Symbol、BigInt,存储在栈内存中,赋值时传递的是值本身。
- Number:表示数字,包括整数和浮点数,还有NaN、Infinity等特殊值
- String:表示字符串,用单引号、双引号或反引号包裹
- Boolean:表示布尔值,只有true和false两个值
- Undefined:表示变量已声明但未赋值时的默认值
- Null:表示空值,一般用于主动清空变量
- Symbol:ES6引入的唯一值类型,每个Symbol实例都是唯一的
- BigInt:ES2020引入的大整数类型,用于表示超过Number安全范围的整数
引用数据类型
引用数据类型主要包括Object、Array、Function等,存储在堆内存中,赋值时传递的是引用地址。
// 引用数据类型示例
const arr = [1, 2, 3]; // 数组
const func = function() { // 函数
return "hello";
};
const person = { // 对象
age: 20,
sayHi: function() {
console.log("hi");
}
};
变量声明与数据类型的使用建议
在实际开发中,建议优先使用const声明变量,当确定变量需要后续修改时再使用let,尽量避免使用var,减少变量提升和作用域混乱带来的问题。
声明变量时可以根据数据的特性选择对应的数据类型,比如固定配置项用const声明为对象或基本类型,循环中变化的计数器用let声明为Number类型,字符串拼接可以用反引号包裹的模板字符串提升可读性。
// 实际开发示例
const MAX_COUNT = 100; // 固定常量用const
let currentCount = 0; // 变化的计数用let
function addCount() {
if (currentCount < MAX_COUNT) {
currentCount++;
const tip = `当前计数为${currentCount}`; // 模板字符串
console.log(tip);
}
}
注意:使用typeof操作符可以判断大部分数据的类型,但typeof null会返回object,判断null需要用严格相等符===,判断引用数据类型可以用instanceof操作符。