引言
在 JavaScript 中,变量是用于存储数据的容器。理解变量的声明和数据类型是学习 JavaScript 的基础。本篇文章将详细介绍变量的声明方式、命名规则以及各种数据类型。
变量声明
在 JavaScript 中,变量是用来存储数据的容器。JavaScript 提供了三种声明变量的方式:var
、let
和 const
。
var
var
是 JavaScript 最早引入的变量声明方式,作用域为函数作用域。它有变量提升的特性,即变量可以在声明之前使用,但其值为undefined
。console.log(name); // 输出:undefined var name = "Alice"; console.log(name); // 输出:Alice
这是因为
var
声明的变量会被提升到函数或全局作用域的顶部,但赋值不会提升。let
let
是 ES6(ECMAScript 2015)引入的变量声明方式,作用域为块级作用域。let
声明的变量在块级作用域内有效。if (true) { let age = 25; console.log(age); // 输出:25 } console.log(age); // 抛出错误:age is not defined
const
const
也是 ES6 引入的,用于声明常量,声明后不能再被重新赋值。const
具有块级作用域,与let
类似。const PI = 3.14; console.log(PI); // 输出:3.14 // PI = 3.15; // 抛出错误:TypeError: Assignment to constant variable.
let 与 const 的相同点和不同点
相同点:
块级作用域:
let
和const
声明的变量都具有块级作用域,即只在块级作用域内有效。if (true) { let x = 10; const y = 20; console.log(x); // 输出:10 console.log(y); // 输出:20 } console.log(x); // 抛出错误:x is not defined console.log(y); // 抛出错误:y is not defined
不存在变量提升:与
var
不同,let
和const
声明的变量不存在变量提升(hoisting),在声明之前使用会抛出错误。console.log(a); // 抛出错误:Cannot access 'a' before initialization let a = 5; console.log(b); // 抛出错误:Cannot access 'b' before initialization const b = 10;
暂时性死区(TDZ):
let
和const
在块级作用域内,从变量绑定到变量声明之间形成暂时性死区(Temporal Dead Zone, TDZ),在 TDZ 内访问变量会抛出错误。{ console.log(z); // 抛出错误:Cannot access 'z' before initialization let z = 5; }
不同点:
重新赋值:
let
声明的变量可以重新赋值。let age = 25; age = 26; console.log(age); // 输出:26
const
声明的变量不能重新赋值,再次赋值会抛出错误。const PI = 3.14; // PI = 3.1415; // 抛出错误:TypeError: Assignment to constant variable.
声明时必须初始化:
let
声明的变量可以不初始化,默认值为undefined
。let x; console.log(x); // 输出:undefined x = 10; console.log(x); // 输出:10
const
声明的变量必须在声明时初始化,否则会抛出错误。// const y; // 抛出错误:Missing initializer in const declaration const y = 20; console.log(y); // 输出:20
常量对象:
const
声明的对象的引用不能被修改,但对象的属性可以被修改。const person = { name: "Alice" }; person.name = "Bob"; console.log(person.name); // 输出:Bob // person = { name: "Charlie" }; // 抛出错误:TypeError: Assignment to constant variable.
变量命名规则
在 JavaScript 中,变量命名必须遵循以下规则:
- 变量名只能包含字母、数字、下划线(\_)和美元符号($)。
- 变量名不能以数字开头。
- 变量名区分大小写(例如,
myVar
和myvar
是两个不同的变量)。 - 变量名不能是保留字(例如,
let
、const
、function
等)。
数据类型分类
JavaScript 提供了两类数据类型:基本数据类型和引用类型。
基本数据类型:
- 字符串(String)
- 数字(Number)
- 布尔值(Boolean)
- null
- undefined
- Symbol
引用类型:
- 对象(Object)
- 数组(Array)
- 函数(Function)
基本数据类型和引用类型的主要区别:基本数据类型存储的是值本身,而引用类型存储的是对内存中对象的引用。
基本数据类型
字符串(String)
字符串用于表示文本数据。可以使用单引号、双引号或反引号(模板字符串)创建字符串。let greeting = 'Hello, World!'; let name = "Alice"; let message = `Hello, ${name}!`; console.log(greeting); // 输出:Hello, World! console.log(message); // 输出:Hello, Alice!
数字(Number)
数字类型用于表示整数和浮点数。JavaScript 中的所有数字都是 64 位浮点数。let age = 30; let temperature = 36.6; let hex = 0xff; // 十六进制表示 let bin = 0b1010; // 二进制表示 let oct = 0o12; // 八进制表示 console.log(age); // 输出:30 console.log(temperature); // 输出:36.6 console.log(hex); // 输出:255 console.log(bin); // 输出:10 console.log(oct); // 输出:10
布尔值(Boolean)
布尔值有两个取值:true
和false
。常用于条件判断。let isRaining = false; let isSunny = true; console.log(isRaining); // 输出:false console.log(isSunny); // 输出:true
null
null
表示一个空值,即一个不存在的对象。通常用于显式地表示“没有值”。let car = null; console.log(car); // 输出:null
undefined
undefined
表示变量已声明但未赋值。函数没有返回值时也会返回undefined
。let house; console.log(house); // 输出:undefined function doNothing() {} console.log(doNothing()); // 输出:undefined
Symbol
Symbol
是 ES6 引入的一种新的基本数据类型,表示独一无二的值。常用于对象属性的唯一标识符。let sym1 = Symbol("unique"); let sym2 = Symbol("unique"); console.log(sym1 === sym2); // 输出:false
null 和 undefined 的区别
尽管 null
和 undefined
都表示“无值”或“空值”,但它们之间有一些显著的区别:
定义:
undefined
表示变量已声明但尚未赋值,或者对象属性不存在。let x; console.log(x); // 输出:undefined let person = {}; console.log(person.name); // 输出:undefined
null
是一个表示“空值”或“无对象”的特殊值,通常用于显式地指示变量或属性为空。let y = null; console.log(y); // 输出:null let car = { make: null }; console.log(car.make); // 输出:null
类型:
undefined
的类型是undefined
。console.log(typeof undefined); // 输出:undefined
null
的类型是object
。console.log(typeof null); // 输出:object
使用场景:
undefined
通常在变量未赋值时自动出现。let z; console.log(z); // 输出:undefined
null
通常由开发者显式赋值,用于指示“无值”或“空对象”。let empty = null; console.log(empty); // 输出:null
相等性比较:
使用宽松相等(
==
)运算符时,null
和undefined
是相等的。console.log(null == undefined); // 输出:true
使用严格相等(
===
)运算符时,null
和undefined
不相等。console.log(null === undefined); // 输出:false
- 历史问题:
typeof null === "object"
是一个历史遗留问题。最初的 JavaScript 设计中,null
被认为是一个对象的占位符,但这个设计后来被发现是不理想的。尽管如此,为了保持向后兼容性,这个问题一直没有修复。
引用类型
除了基本数据类型,JavaScript 还有引用类型,包括对象、数组和函数。
对象(Object)
对象是键值对的集合,用于存储复杂的数据结构。可以通过点操作符或方括号操作符访问对象属性。let person = { name: "John", age: 30, job: "Developer", }; console.log(person.name); // 输出:John console.log(person["age"]); // 输出:30 // 动态添加属性 person.country = "USA"; console.log(person.country); // 输出:USA
数组(Array)
数组是一组按次序排列的值的集合,可以存储不同类型的值。数组的索引从 0 开始。let colors = ["red", "green", "blue"]; console.log(colors[0]); // 输出:red console.log(colors.length); // 输出:3 // 添加元素 colors.push("yellow"); console.log(colors); // 输出:["red", "green", "blue", "yellow"] // 迭代数组 colors.forEach(function (color) { console.log(color); });
函数(Function)
函数是可重复使用的代码块。可以通过函数声明或函数表达式创建函数。// 函数声明 function greet(name) { return "Hello, " + name; } console.log(greet("Alice")); // 输出:Hello, Alice // 函数表达式 let greet = function (name) { return "Hello, " + name; }; console.log(greet("Bob")); // 输出:Hello, Bob
结论
理解变量声明和数据类型是学习 JavaScript 的基础。var
、let
和 const
各有用途,而基本数据类型和引用类型在编程中有不同的应用场景。掌握这些概念可以帮助我们更好地进行代码编写和调试。