变量与解构

JavaScript 变量与解构

分为变量声明解构赋值两部分,结合语法、区别、示例讲解。

一、变量声明:var / let / const

1. 核心区别汇总

特性 var let const
作用域 函数作用域/全局作用域 块级作用域 {} 块级作用域 {}
变量提升 存在,可先使用后声明 存在提升,暂时性死区 存在提升,暂时性死区
重复声明 允许 不允许 不允许
重新赋值 允许 允许 不允许(常量)

2. 语法与示例

var
js 复制代码
// 函数/全局作用域,无块级限制
if (true) {
  var a = 10;
}
console.log(a); // 10,块外仍可访问

// 允许重复声明
var b = 1;
var b = 2;
console.log(b); // 2
let

块级作用域,暂时性死区 :代码块内,let 声明前无法访问该变量。

js 复制代码
if (true) {
  let c = 20;
}
console.log(c); // 报错:c 未定义

// 暂时性死区
console.log(d); // 报错
let d = 30;

// 禁止重复声明
let e = 1;
let e = 2; // 报错
const

声明后不可重新赋值,必须初始化;同样具备块级作用域、暂时性死区。

js 复制代码
// 必须赋值
const f; // 报错

const num = 100;
num = 200; // 报错,常量不能重赋值

// 引用类型(数组/对象):允许修改内部属性,只是地址不变
const arr = [1,2];
arr.push(3);
console.log(arr); // [1,2,3] 正常修改

3. 使用建议

  • 优先使用 const(默认常量,更安全)
  • 变量需要重新赋值时,用 let
  • 彻底摒弃 var

二、解构赋值

ES6 语法,快速从数组、对象中提取值,赋值给变量,简化代码。

(一)数组解构

索引顺序一一对应。

1. 基础用法
js 复制代码
const arr = [10, 20, 30];
// 解构
const [x, y, z] = arr;
console.log(x, y, z); // 10 20 30
2. 跳过元素

空位跳过对应位置的值

js 复制代码
const [, m, n] = [1,2,3];
console.log(m, n); // 2 3
3. 默认值

解构值为 undefined 时,启用默认值

js 复制代码
const [a = 100, b = 200] = [1];
console.log(a, b); // 1 200
4. 剩余运算符 ...

收集剩余所有元素,只能放在最后一位

js 复制代码
const [first, ...rest] = [1,2,3,4];
console.log(first); // 1
console.log(rest); // [2,3,4]
5. 快速交换变量(经典用法)
js 复制代码
let p = 1, q = 2;
[p, q] = [q, p];
console.log(p, q); // 2 1

(二)对象解构

属性名匹配,和顺序无关,使用频率最高。

1. 基础用法
js 复制代码
const obj = { name: "张三", age: 22 };
// 变量名和属性名一致
const { name, age } = obj;
console.log(name, age); // 张三 22
2. 重命名

当变量名冲突/想自定义变量名时,原属性名: 新变量名

js 复制代码
const { name: username, age: userAge } = obj;
console.log(username, userAge); // 张三 22
3. 默认值

属性不存在时启用默认值

js 复制代码
const { name, gender = "男" } = obj;
console.log(gender); // 男
4. 剩余运算符 ...

收集对象剩余属性

js 复制代码
const { name, ...other } = obj;
console.log(other); // { age: 22 }
5. 嵌套对象解构

多层对象逐层解构

js 复制代码
const info = {
  user: { nick: "小李" },
  addr: "北京"
};
const { user: { nick }, addr } = info;
console.log(nick, addr); // 小李 北京

(三)字符串解构

字符串可当作类数组解构

js 复制代码
const str = "abc";
const [s1, s2] = str;
console.log(s1, s2); // a b

三、拓展:函数参数解构

实际开发高频场景,简化传参接收

js 复制代码
// 1. 数组参数解构
function fn([a, b]) {
  console.log(a + b);
}
fn([1, 2]); // 3

// 2. 对象参数解构(最常用)
function getUser({ name, age = 18 }) {
  console.log(name, age);
}
getUser({ name: "王五" }); // 王五 18

四、补充:扩展运算符 ...(和解构配套)

和解构的剩余运算符写法一致,作用相反:展开数组/对象

js 复制代码
// 展开数组
const arr1 = [1,2];
const arr2 = [...arr1, 3];
console.log(arr2); // [1,2,3]

// 展开对象(浅拷贝、合并对象)
const o1 = { a: 1 };
const o2 = { ...o1, b: 2 };
console.log(o2); // { a:1, b:2 }
相关推荐
c++之路1 小时前
Bazel C++ 构建系列文档(五):多目标与多包项目
java·开发语言·c++
Hello:CodeWorld1 小时前
【C++ 避坑指南】告别缓冲区溢出!全面解析 std::snprintf 的安全美学与核心陷阱
开发语言·c++·安全
凡人叶枫1 小时前
Effective C++ 条款38:通过复合塑模出 has-a 或 \“根据某物实现出\
linux·开发语言·c++·windows
枫叶丹41 小时前
【HarmonyOS 6.0】MDM Kit:PC/2in1设备用户行为限制策略详解
开发语言·华为·harmonyos
weilaieqi11 小时前
微短剧 + 时代到来,短剧内容正在赋能文旅、品牌与数字文化产业
开发语言
888CC++1 小时前
箭头函数(ES6)
前端·javascript·es6
ytttr8732 小时前
航天器姿态控制 MATLAB 仿真程序
开发语言·matlab
charlie1145141912 小时前
嵌入式Linux驱动开发——从轮询到中断
linux·开发语言·驱动开发·嵌入式
qq_419854052 小时前
css filter
前端·javascript·css