变量是一种用于存储数据的基本工具。它允许我们在代码中给某个数据赋予一个名字,便于在后续的代码中引用、更新、甚至重新赋值。
一、什么是变量?
变量本质上是一个“容器”,它存储特定的信息或数据。你可以把变量想象成一个标签,标签上写着名字,贴在一个容器上,而容器内装着数据。你可以通过这个标签随时找到并引用这个数据,甚至在代码执行的过程中改变它的值。
变量的作用:
- 存储数据:变量可以存储用户输入的值、API 调用返回的数据、计算的结果等等。
- 提高可读性:通过给数据起一个清晰的名字,变量能让代码变得更加易于理解。
- 便于维护:一旦需要修改某个值,只需要更新一次定义该变量的地方,而不需要在代码的每一个引用位置都修改。
二、声明变量
在 JavaScript 中,声明变量的方式有多种,最常见的是使用 var
、let
和 const
。不同的声明方式会带来不同的作用域和行为,尤其是在处理变量的生命周期时差别明显。
var age; // 声明一个变量,但未赋值
let name; // 使用 let 声明一个变量
const pi; // 使用 const 声明一个常量(注意:const 必须在声明时赋值)
三、初始化变量
在声明变量之后,可以给它赋值,这个过程称为初始化。初始化的意思就是给变量一个初始值,让它具有意义。如果我们声明了变量但没有赋值,变量的值会默认为 undefined
。
var age = 25; // 初始化 age 变量为 25
let name = "Alice"; // 初始化 name 变量为字符串 "Alice"
const pi = 3.14; // 初始化常量 pi 为 3.14
注意,const
声明的变量在初始化后不能再被重新赋值,如果尝试更新它的值,代码会报错。
pi = 3.1415; // 会抛出一个错误,因为 pi 是常量
四、var 与 let 的区别
作用域不同
var
的作用域是函数级别的,而 let
的作用域是块级别的。
if (true) {
var a = 10; // var 在整个函数或全局范围内有效
let b = 20; // let 只在代码块 { } 中有效
}
console.log(a); // 输出 10
console.log(b); // 报错:b 没有定义
由于 var
的作用域是函数级别的,所以它会忽略代码块 {}
,而 let
则严格遵守块作用域,仅在代码块内部有效。
变量提升
var
声明的变量会被“提升”,即声明会被提升到当前作用域的顶部,而 let
声明的变量不会。
console.log(x); // 输出 undefined
var x = 5;
console.log(y); // 报错:y 不能在声明前使用
let y = 10;
在这个例子中,var
声明的变量 x
虽然在使用前未被赋值,但声明本身已经“被提升”到了顶部,因此不会抛出错误。而 let
声明的变量 y
则必须在声明之后才能使用。
五、更新变量(关于变量命名的规则)
变量名在编程中至关重要,它不仅要简洁易懂,还要遵循一些基本规则:
- 只能包含字母、数字、下划线(_)和美元符号($)。
- 不能以数字开头,比如
123name
是非法的变量名。 - 区分大小写,
name
和 Name
是两个不同的变量。 - 不能是保留字,如
function
、return
等 JavaScript 保留字不能作为变量名。
六、更新变量
一旦声明了变量,我们可以随时更新它的值(const
除外)。更新变量的过程也很简单,直接赋予它新的值即可:
let age = 25;
age = 30; // 更新 age 变量为 30
console.log(age); // 输出 30
不过,需要注意的是,常量(const
)是无法重新赋值的,这也是它的特性。
七、变量类型
JavaScript 中有多种数据类型,每个变量都可以存储不同类型的数据。在 JavaScript 中,最常见的变量类型包括:
- Number:用于存储数字,包括整数和浮点数。
- String:用于存储文本或字符串。
- Boolean:用于存储布尔值,即
true
或 false
。 - Array:一种特殊类型的对象,用于存储多个值。
- Object:用于存储键值对。
Number(数字)
Number
类型可以存储整数和浮点数:你可以在变量中存储数字,不论这些数字是像 42(也叫整数)这样,或者像 3.14 这样的小数(也叫做浮点数)。与其他编程语言不同,在 JavaScript 中你不需要声明一个变量的类型。当你给一个变量数字赋值时,不需要用引号括起来。
let a = 42; // 整数
let b = 3.14; // 浮点数
String(字符串)
字符串用于存储文本,它可以由单引号、双引号或反引号包围:字符串是文本的一部分。当你给一个变量赋值为字符串时,你需要用单引号或者双引号把值给包起来,否则 JavaScript 将会把这个字符串值理解成别的变量名。
let str1 = "Hello"; // 双引号
let str2 = 'World'; // 单引号
let str3 = `JavaScript`; // 反引号(模板字符串)
Boolean(布尔值)
布尔值只有两个可能的取值:true
和 false
。它们通常用于条件判断:它们通常被用于在适当的代码之后,测试条件是否成立。
let isAdult = true;
let hasLicense = false;
Array(数组)
数组是一种特殊的对象,它用于存储有序的值列表。每个值都有一个对应的索引,索引从 0 开始:
let fruits = ["Apple", "Banana", "Orange"];
console.log(fruits[0]); // 输出 "Apple"
Object(对象)
对象是键值对的集合,每个键都有一个对应的值。对象可以用于存储复杂的数据结构:对象是现实生活中的模型的一种代码结构。你可以有一个简单的对象,代表一个停车场,并包含有关其宽度和长度的信息,或者你可以有一个代表一个人的对象,并包含有关他们的名字,身高,体重,他们说什么语言,如何说“你好”等等。
let person = {
name: "John",
age: 30,
isMarried: false
};
console.log(person.name); // 输出 "John"
八、动态类型
JavaScript 是一种动态类型语言,这意味着变量的类型可以在运行时动态改变。换句话说,变量在声明时不需要指定类型,后续可以存储任何类型的数据。
let data = 10; // data 是一个数字
data = "Hello"; // data 现在是一个字符串
data = true; // data 现在是一个布尔值
这种灵活性使得 JavaScript 非常强大,但也带来了一定的潜在问题,特别是在调试时,变量类型的频繁变化可能导致不可预见的错误。因此,虽然动态类型很方便,但在实际编程中要谨慎使用。