一、变量的基本概念

变量就像一个带标签的盒子,你可以把数据(数字、文字、对象等)放进盒子里,之后通过标签(变量名)就能找到并使用这些数据。在 JavaScript 中,变量是弱类型的(动态类型),意味着你不用提前声明盒子里装的是什么类型的数据,赋值时会自动确定。

二、变量的 3 种声明方式

JavaScript 有 3 种声明变量的关键字:varletconst,其中letconst是 ES6(2015)新增的,也是现在的主流用法。

1. 完整代码示例(对比三种声明)

javascript

运行

// 1. var声明(ES5,存在作用域和提升问题,现在不推荐)
var age = 18;
var age = 20; // 可以重复声明,不会报错
console.log(age); // 输出:20

// 2. let声明(ES6,块级作用域,推荐用于需要修改的变量)
let name = "张三";
// let name = "李四"; // 重复声明会报错:Identifier 'name' has already been declared
name = "李四"; // 可以修改值,输出:李四
console.log(name);

// 3. const声明(ES6,块级作用域,用于不需要修改的常量)
const PI = 3.14159;
// PI = 3.14; // 修改值会报错:Assignment to constant variable.
// const PI; // 必须立即赋值,否则报错:Missing initializer in const declaration
console.log(PI); // 输出:3.14159

// 块级作用域示例(let/const生效,var不生效)
if (true) {
  let a = 10;
  var b = 20;
}
// console.log(a); // 报错:a is not defined(let的块级作用域)
console.log(b); // 输出:20(var是函数/全局作用域)
2. 关键区别总结
声明方式 作用域 重复声明 重新赋值 变量提升 必须初始化
var 函数 / 全局 允许 允许 完整提升
let 块级 不允许 允许 暂存死区
const 块级 不允许 不允许 暂存死区

三、变量命名规则(必须遵守)

  1. 合法字符:只能以字母、下划线_、美元符号$开头,后续可以加数字(不能以数字开头)。
  2. 大小写敏感nameName是两个不同的变量。
  3. 不能用关键字:比如letconstiffunction等保留字不能作为变量名。
  4. 规范建议
    • 普通变量用小驼峰命名userNameageList
    • 常量用全大写 + 下划线MAX_SIZEBASE_URL
命名示例(正确 vs 错误)

javascript

运行

// 正确命名
let $price = 99;
let _count = 0;
let userAge = 25;
const MAX_NUM = 100;

// 错误命名
// let 123name = "test"; // 以数字开头
// let let = "abc"; // 使用关键字
// let user-name = "李四"; // 包含非法字符(-)

四、变量提升(新手易踩坑)

  • var声明的变量会 “提升” 到当前作用域顶部,但赋值不会提升:

    javascript

    运行

    console.log(num); // 输出:undefined(不是报错)
    var num = 10;
    // 等价于:
    // var num;
    // console.log(num);
    // num = 10;
    
  • let/const不存在 “完整提升”,在声明前使用会触发 “暂存死区”,直接报错:

    javascript

    运行

    // console.log(num2); // 报错:Cannot access 'num2' before initialization
    let num2 = 20;
    

总结

  1. 声明优先选let/constlet用于可变变量,const用于常量(推荐优先用const,避免意外修改),尽量不用var
  2. 命名要合规:小驼峰 / 全大写规范,避开关键字和非法字符。
  3. 注意作用域let/const是块级作用域({}内生效),var是函数 / 全局作用域,新手容易因作用域出错。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐