现代 JavaScript 教程:使用变量(let 声明、值拷贝与 alert 输出实战)
现代 JavaScript 教程:使用变量(let 声明、值拷贝与 alert 输出实战)
本篇基于现代 JavaScript 教程中文版「变量」章节中的经典练习任务「使用变量」(task.md)展开,它位于教程 1-js/02-first-steps 的「起步」阶段,是理解 JavaScript 数据存储与引用传递的第一道关卡。读完本文,你将掌握用 let 声明变量、用赋值运算符 = 写入数据、在变量之间拷贝值,以及用 alert 将结果显示到浏览器的完整流程,并顺带吃透变量的命名规范、const 常量与 var 的历史渊源,为后续所有章节打下基础。
任务目标:把 "John" 从 name 搬到 admin
这是教程「变量」章节的第一个练习,难度标记为 importance: 2,属于入门必做的基础题。任务原文要求按顺序完成四步:
- 声明两个变量:
admin和name; - 将值
"John"赋给name; - 从
name变量中拷贝其值给admin; - 使用
alert显示admin的值(必须输出"John")。
这道题表面上是写四行代码,实际上覆盖了 JavaScript 变量体系中最核心的三个动作:声明(declaration)、赋值(assignment) 与 拷贝(copy),最后用浏览器原生弹窗验证结果,形成一个可立即运行的完整闭环。
参考解法(逐行对应任务)
仓库中随任务一同提供的官方解答见 1-hello-variables/solution.md,每一行都与任务列表中的对应项一一呼应:
let admin, name; // 一次声明两个变量。
name = "John";
admin = name;
alert( admin ); // "John"
- 第 1 行用一条
let语句同时声明admin与name两个变量(用逗号分隔); - 第 2 行把字符串
"John"赋值给name; - 第 3 行把
name的值拷贝到admin; - 第 4 行调用
alert(admin)弹出提示框,显示"John"。
逐步拆解:声明、赋值与拷贝的本质
第一步:用 let 声明变量
在 JavaScript 中创建变量需要使用 let 关键字,这一步称为声明或定义变量。教程正文 article.md 中的示例:
let message;
执行后,名为 message 的变量就诞生了。变量可以理解为数据的"命名存储"——像一只贴了名字标签的盒子,标签写的是变量名,盒子里装的是数据。下面的示意图直观展示了这种类比:
本例中我们把两条声明合并成一行:let admin, name;。这在语法上完全合法,教程也展示了这种一行多变量的写法(如 let user = 'John', age = 25, message = 'Hello';)。不过为了可读性,教程明确建议一行只声明一个变量,多行声明虽然稍长,但更容易阅读,例如:
let user = 'John';
let age = 25;
let message = 'Hello';
第二步:用赋值运算符 = 写入数据
声明之后,通过赋值运算符 = 把数据存入变量:
name = "John";
此时字符串 "John" 被保存到与该变量相关联的内存区域。也可以在声明的同时完成初始化,合并成一行:
let message = 'Hello!'; // 定义变量,并且赋值
alert(message); // Hello!
第三步:从 name 拷贝值给 admin
admin = name;
这一步值得特别注意:赋值语句右侧先取出 name 中保存的字符串 "John",再把它拷贝一份写入 admin。拷贝之后,两个变量保存着完全相同的数据,互不干扰。教程正文给出了同构的示例:
let hello = 'Hello world!';
let message;
// 将字符串 'Hello world' 从变量 hello 拷贝到 message
message = hello;
// 现在两个变量保存着相同的数据
alert(hello); // Hello world!
alert(message); // Hello world!
在这个阶段,变量装的都是字符串这类原始值(primitive),拷贝是彻底的"复制一份"。未来学到对象(Object)时,拷贝将变成"复制引用"的浅拷贝,语义完全不同——这一点将在后续的 对象拷贝章节 中详细展开。
第四步:用 alert 验证结果
alert( admin ); // "John"
alert 是浏览器内置函数,会在页面顶部弹出一个模态提示框并显示参数内容。执行这行代码时,屏幕上会弹出显示 John 的对话框,证明 admin 确实拿到了拷贝过来的值。你也可以把任意步骤的输出打印出来验证中间状态,比如分别 alert(name) 和 alert(admin),两者都会显示 "John"。
变量值可以随时改变
变量之所以叫"变量",是因为它的值可以反复修改。同一个变量,想改多少次就改多少次:
let message;
message = 'Hello!';
message = 'World!'; // 值改变了
alert(message);
当值被重新赋值时,之前的数据就从变量中删除了,盒子里的旧内容被新内容替换:
常见误区与边界:重复声明、命名与严格模式
同一个变量只能声明一次
对同一个变量重复使用 let 声明会触发语法错误:
let message = "This";
// 重复 'let' 会导致 error
let message = "That"; // SyntaxError: 'message' has already been declared
正确的做法是:只声明一次,之后不再带 let 直接引用变量。
变量命名规则
JavaScript 的变量命名有两条硬性限制(详见 article.md 的 #variable-naming 小节):
- 变量名称只能包含字母、数字、符号
$和_; - 首字符不能是数字。
let userName; // 有效
let test123; // 有效
let $ = 1; // "$" 是合法的普通符号,无特殊含义
let _ = 2; // "_" 同理
let 1a; // 无效:不能以数字开头
let my-name; // 无效:连字符 '-' 不允许
多单词命名遵循驼峰式(camelCase):除第一个单词外,其余单词首字母大写,如 myVeryLongName。变量名区分大小写,apple 与 APPLE 是两个不同的变量。技术上也允许使用非英文字母(如 let 我 = '...';),但用英文命名是国际惯例,教程明确推荐使用英文。
保留字与严格模式
let、class、return、function 等关键字被语言本身保留,不能用作变量名:
let let = 5; // 错误!
let return = 5; // 错误!
另外,在非严格模式下,可以不给变量加 let 直接赋值来"隐式创建"变量:
// 注意:这个例子中没有 "use strict"
num = 5; // 如果变量 "num" 不存在,就会被创建
alert(num); // 5
这是历史遗留的糟糕做法;一旦启用 "use strict"; 严格模式,这种方式会直接报错 num is not defined。
扩展练习:变量命名与常量命名规范
同一个「变量」章节还配套了另外两个练习,可以与本任务串联练习:
- 给出正确的名字(2-declare-variables/task.md):要求为"我们星球的名字"和"当前浏览者的名字"设计变量名。官方答案(solution.md)分别给出
let ourPlanetName = "Earth";与let currentUserName = "John";,强调名字要清晰、自解释,不要用a、b、data、value这类没有信息量的缩写。 - 大写的常量?(3-uppercast-constant/task.md):对比
const birthday = '18.04.1982';与运行时计算出的const age = someCode(birthday);。官方解答(solution.md)指出:只在"硬编码(hard-coded)"值(写入代码时值就已知,如十六进制颜色COLOR_RED = "#F00")时使用大写命名;而age这类在运行时计算、未来可能变化的值,应采用普通小写命名。
总结:这道题教会你什么
「使用变量」任务虽小,却完整覆盖了 JavaScript 变量机制的最小闭环:
| 步骤 | 代码 | 含义 |
|---|---|---|
| 声明 | let admin, name; |
用 let 创建变量,可一次声明多个 |
| 赋值 | name = "John"; |
用 = 把值存入变量 |
| 拷贝 | admin = name; |
把 name 的值复制一份给 admin |
| 输出 | alert(admin); |
用浏览器弹窗显示变量内容 |
在此基础上,教程还系统介绍了变量命名的两条硬规则与驼峰式惯例、const 常量(值不可修改)与大写常量命名、var 与 let 的历史关系(详见教程 var 章节),以及"为不同值使用不同变量"的良好习惯——现代 JavaScript 压缩器和浏览器都能很好地对代码进行优化,额外声明变量不会带来性能问题。掌握了这些,你就拥有了阅读和编写一切 JavaScript 代码的基础词汇表。