变量与解构

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 }
相关推荐
程序员大阳9 小时前
副队长JavaScript教程(49)-主动抛出异常与错误类型
javascript·异常处理·error·throw·错误类型
hhhjhl9 小时前
Protobuf.js 跨端三方库仓颉适配全流程
javascript·网络·udp
康小汪9 小时前
AI 写 Vue 总写成同一个味道:给它装 Skills,装的不是知识是边界
前端·vue.js·人工智能·ai编程·最佳实践
学逆向的9 小时前
C 堆区内存管理
c语言·开发语言·网络安全
huoyueyi9 小时前
《融天AI-APP从0到1开发实录》
开发语言·lua
智能运维指南10 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
OpenAnolis小助手11 小时前
PHP 两个严重漏洞曝光,龙蜥社区 24 小时完成 3 版本修复
开发语言·操作系统·php·龙蜥社区
白山编程大哥11 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list
阿尼卡~12 小时前
VS Code 配置 C 语言开发环境(Windows 10/11):从 GCC 安装到运行、断点调试,一篇搞定
c语言·开发语言·windows
Flynt12 小时前
我把热榜那篇"禁用 axios"逐条实测了一遍:结论大体对,坑在它没讲的地方
前端·javascript·axios