Javascript 编程基础(2)基础知识 | 2.2、变量
文章目录
- 一、变量
- 1、变量声明方式
- 1.1、`var` (ES5 及之前)
- 1.2、`let` (ES6+)
- 1.3、`const` (ES6+)
- 2、变量作用域
- 2.1、全局作用域
- 2.2、函数作用域
- 2.3、块级作用域
- 3、变量提升
- 4、原始类型 vs 引用类型
- 4.1、原始类型(按值传递)
- 4.2、引用类型(按引用传递)
- 5、变量命名规范
- 6、最佳实践
一、变量
1、变量声明方式
JavaScript 提供了三种主要的变量声明方式:
1.1、var
(ES5 及之前)
var name = "John";
- 函数作用域
- 存在变量提升(hoisting)
- 可重复声明
- 全局声明会成为 window 对象的属性
1.2、let
(ES6+)
let age = 30;
- 块级作用域
- 不存在变量提升
- 不可重复声明
- 不会成为 window 对象的属性
1.3、const
(ES6+)
const PI = 3.14159;
- 块级作用域
- 声明时必须初始化
- 不可重新赋值(但对于对象和数组,内容可修改)
- 其他特性与 let 相同
2、变量作用域
2.1、全局作用域
在任何函数或代码块之外声明的变量拥有全局作用域。
var globalVar = "I'm global";
2.2、函数作用域
使用
var
在函数内声明的变量只在函数内可见。
function test() {var functionScoped = "Inside function";
}
2.3、块级作用域
使用
let
和const
在代码块({}
)中声明的变量只在该块内可见。
if (true) {let blockScoped = "Inside block";
}
3、变量提升
JavaScript 引擎在执行代码前会先处理变量声明:
console.log(x); // undefined
var x = 5;
等同于:
var x;
console.log(x); // undefined
x = 5;
注意:
let
和const
也存在提升,但存在"暂时性死区"(TDZ),在声明前访问会报错- 只有声明被提升,赋值不会被提升
4、原始类型 vs 引用类型
4.1、原始类型(按值传递)
- String, Number, Boolean, Null, Undefined, Symbol, BigInt
- 直接存储在栈内存中
- 赋值是值的拷贝
let a = 10;
let b = a; // b 是 a 的副本
a = 20;
console.log(b); // 仍然是 10
4.2、引用类型(按引用传递)
- Object, Array, Function
- 存储在堆内存中,变量保存的是引用地址
- 赋值是引用地址的拷贝
let obj1 = { name: "John" };
let obj2 = obj1; // obj2 和 obj1 指向同一个对象
obj1.name = "Jane";
console.log(obj2.name); // "Jane"
5、变量命名规范
- 区分大小写
- 可以包含字母、数字、下划线(_)和美元符号($)
- 不能以数字开头
- 不能使用保留字作为变量名
- 推荐使用驼峰命名法(camelCase)
- 常量通常使用全大写加下划线(SCREAMING_SNAKE_CASE)
6、最佳实践
- 优先使用
const
:默认使用const
,只有在需要重新赋值时才使用let
- 避免使用
var
:除非有特殊需求,否则使用let
和const
- 初始化变量:声明时尽量初始化变量
- 有意义的命名:变量名应清晰表达其用途
- 避免全局变量:减少全局变量的使用,防止命名冲突
- 使用严格模式:
"use strict"
可以帮助避免一些常见的错误