目录
一、变量提升
var
- 变量提升:var 声明的变量会被提升到当前作用域的顶部。这意味着即使你在变量声明之前就尝试访问它,也不会抛出引用错误,而是返回 undefined。
console.log(x); // undefined
var x = 5;
let 和 const
- 没有变量提升:使用 let 和 const 声明的变量不会被提升。尝试在声明之前访问这些变量会导致暂时性死区,从而抛出引用错误。
console.log(y); // 抛出 ReferenceError
let y = 10;
二、作用域
var
- 函数作用域:使用 var 声明的变量在整个函数内部都是可见的,无论声明的位置在哪里。
function example() {
if (true) {
var z = 5;
}
console.log(z); // 输出 5
}
example();
let 和 const
- 块级作用域:使用 let 和 const 声明的变量只在声明它们的代码块内可见。这意味着如果在一个 if 语句或循环中声明了一个变量,那么这个变量只在那个代码块内可用。
function example() {
if (true) {
let w = 10;
}
console.log(w); // 抛出 ReferenceError
}
example();
三、可变性
var 和 let
- 可重赋值:使用 var 和 let 声明的变量可以在之后被重新赋值。
let num = 5;
num = 10;
console.log(num); // 输出 10
const
- 不可重赋值:使用 const 声明的变量不能被重新赋值。这意味着一旦给 const 变量分配了一个值,就不能再给它分配一个新的值。
const pi = 3.14;
pi = 3.14159; // 抛出 TypeError
特殊情况 (简单类型和引用类型的区别)
- 对象或数组的可变性:尽管 const 变量本身不可改变,但对象或数组的属性或元素是可以改变的。
const person = { name: 'Alice' };
person.name = 'Bob'; // 修改对象属性
console.log(person.name); // 输出 Bob
const numbers = [1, 2, 3];
numbers.push(4); // 修改数组
console.log(numbers); // 输出 [1, 2, 3, 4]