变量与解构

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 }
相关推荐
子兮曰4 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰4 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
前端小万4 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝4 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋4 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
卡布鲁4 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
C语言小火车4 天前
C/C++ 为什么需要编译器?
开发语言·c++
李少兄4 天前
JavaScript 隐式全局变量解析
javascript