当前位置: 首页 > article >正文

ES6 const 使用总结

1. 声明不可变性

1.1 基本类型的不可变性

// 基本类型声明后不能修改
const name = 'John';
name = 'Jane';  // TypeError: Assignment to constant variableconst age = 25;
age = 26;  // TypeError: Assignment to constant variableconst isValid = true;
isValid = false;  // TypeError: Assignment to constant variable

1.2 引用类型的可变性

// 对象的属性可以修改
const person = {name: 'John',age: 25
};
person.name = 'Jane';  // 正常工作
person.age = 26;      // 正常工作
person = {};          // TypeError: Assignment to constant variable// 数组的元素可以修改
const numbers = [1, 2, 3];
numbers.push(4);     // 正常工作
numbers[0] = 0;      // 正常工作
numbers = [];        // TypeError: Assignment to constant variable

2. 声明必须赋值

2.1 正确的声明方式

// ✅ 声明时必须初始化
const name = 'John';
const age = 25;
const person = { name: 'John' };

2.2 错误的声明方式

// ❌ 不能只声明不赋值
const name;  // SyntaxError: Missing initializer in const declaration// ❌ 不能先声明后赋值
const age;
age = 25;    // SyntaxError: Missing initializer in const declaration

3. 不允许重复定义

3.1 同一作用域重复声明

// ❌ 同一作用域不能重复声明
const name = 'John';
const name = 'Jane';  // SyntaxError: Identifier 'name' has already been declared// ❌ 与其他声明方式混用也不行
const age = 25;
var age = 26;   // SyntaxError: Identifier 'age' has already been declared
let age = 26;   // SyntaxError: Identifier 'age' has already been declared

3.2 不同作用域的声明

// ✅ 不同作用域可以声明同名常量
const x = 1;
if (true) {const x = 2;  // 正常工作console.log(x);  // 2
}
console.log(x);  // 1function example() {const x = 3;  // 正常工作console.log(x);  // 3
}

4. 不具有变量提升

4.1 变量提升问题

// ❌ 在声明前访问会报错
console.log(name);  // ReferenceError: Cannot access 'name' before initialization
const name = 'John';// ❌ 在函数中也是一样
function example() {console.log(age);  // ReferenceError: Cannot access 'age' before initializationconst age = 25;
}

5. 暂时性死区(TDZ)

5.1 基本概念

// 从作用域开始到变量声明前的区域称为暂时性死区
{console.log(name);  // ReferenceError: Cannot access 'name' before initializationconst name = 'John';
}

5.2 复杂场景中的 TDZ

// 函数参数中的 TDZ
function example(x = y, y = 1) {return [x, y];
}
example();  // ReferenceError: Cannot access 'y' before initialization// 条件语句中的 TDZ
if (true) {console.log(value);  // ReferenceErrorconst value = 123;
}

6. 不与顶层对象挂钩

6.1 与全局对象的关系

// 浏览器环境
const name = 'John';
console.log(window.name);  // undefined// Node.js 环境
const age = 25;
console.log(global.age);  // undefined

7. const 定义的数据修改限制

7.1 使用 Object.freeze() 实现真正的不可变

// 使用 Object.freeze() 冻结对象
const person = Object.freeze({name: 'John',age: 25,address: {city: 'New York'}
});person.name = 'Jane';     // 静默失败或在严格模式下报错
person.age = 26;          // 静默失败或在严格模式下报错
person.address.city = 'LA';  // 仍然可以修改(浅冻结)// 深度冻结函数
function deepFreeze(obj) {Object.keys(obj).forEach(prop => {if (typeof obj[prop] === 'object' && obj[prop] !== null) {deepFreeze(obj[prop]);}});return Object.freeze(obj);
}// 使用深度冻结
const config = deepFreeze({api: {url: 'https://api.example.com',key: '123456'},settings: {timeout: 1000}
});config.api.url = 'new-url';  // 无法修改
config.settings.timeout = 2000;  // 无法修改

7.2 使用 const 的最佳实践

// ✅ 用于不变的配置
const CONFIG = {API_URL: 'https://api.example.com',MAX_RETRIES: 3,TIMEOUT: 5000
};// ✅ 用于引用类型时,明确表达意图
const userSettings = Object.freeze({theme: 'dark',notifications: true
});// ✅ 用于函数声明
const calculateTotal = (items) => {return items.reduce((sum, item) => sum + item.price, 0);
};// ❌ 避免对需要修改的数据使用 const
const userList = [];  // 如果需要修改数组,应该使用 let

8. 实际应用场景

8.1 模块常量

// constants.js
export const API_CONFIG = Object.freeze({BASE_URL: 'https://api.example.com',TIMEOUT: 5000,HEADERS: {'Content-Type': 'application/json'}
});// 使用常量
import { API_CONFIG } from './constants';
fetch(\`\${API_CONFIG.BASE_URL}/users\`, {headers: API_CONFIG.HEADERS,timeout: API_CONFIG.TIMEOUT
});

8.2 React/Vue 组件中的使用

// React 组件
const DEFAULT_PROPS = Object.freeze({theme: 'light',size: 'medium'
});const MyComponent = (props) => {const finalProps = { ...DEFAULT_PROPS, ...props };return <div className={finalProps.theme}>{/* ... */}</div>;
};// Vue 组件
const VALIDATION_RULES = Object.freeze({required: true,minLength: 3,maxLength: 20
});export default {data() {return {rules: VALIDATION_RULES};}
}; 

相关文章:

ES6 const 使用总结

1. 声明不可变性 1.1 基本类型的不可变性 // 基本类型声明后不能修改 const name John; name Jane; // TypeError: Assignment to constant variableconst age 25; age 26; // TypeError: Assignment to constant variableconst isValid true; isValid false; // Ty…...

大学资产管理系统中的下载功能设计与实现

大学资产管理系统是高校信息化建设的重要组成部分&#xff0c;它负责记录和管理学校内所有固定资产的信息。随着信息技术的发展&#xff0c;下载功能成为提高资产管理效率的关键环节之一。 系统架构的设计是实现下载功能的基础。一个良好的系统架构能够确保数据的高效传输和存储…...

【华为OD机试python】日志采集系统【 E卷 | 2023 Q1 |100分】

目录 题目描述 输入描述 输出描述 示例1 输入输出示例仅供调试,后台判题数据一般不包含示例 说明 示例2 输入输出示例仅供调试,后台判题数据一般不包含示例 说明 解题思路 考点 代码 题目描述 日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采…...

园区网设计与实战

想做一个自己学习的有关的csdn账号&#xff0c;努力奋斗......会更新我计算机网络实验课程的所有内容&#xff0c;还有其他的学习知识^_^&#xff0c;为自己巩固一下所学知识。 我是一个萌新小白&#xff0c;有误地方请大家指正&#xff0c;谢谢^_^ 文章目录 前言 这个实验主…...

DeepSeek-R1 本地电脑部署 Windows系统 【轻松简易】

本文分享在自己的本地电脑部署 DeepSeek&#xff0c;而且轻松简易&#xff0c;快速上手。 这里借助Ollama工具&#xff0c;在Windows系统中进行大模型部署~ 1、安装Ollama 来到官网地址&#xff1a;Download Ollama on macOS 点击“Download for Windows”下载安装包&#x…...

git进阶--5---git reset 和 git revert 的区别与联系

git进阶–5—git reset 和 git revert 的区别与联系 1. 相同点 都是对版本做出一些改变 2. 不同点 git reset 是进行版本回退&#xff0c;根据不同的参数&#xff0c;是定是否复原索引和工作区git revert 是撤销上一次的提交&#xff0c;不会改变过去的历史&#xff0c;安全…...

AI绘画:解锁商业设计新宇宙(6/10)

1.AI 绘画&#xff1a;商业领域的潜力新星 近年来&#xff0c;AI 绘画技术以惊人的速度发展&#xff0c;从最初简单的图像生成&#xff0c;逐渐演变为能够创造出高度逼真、富有创意的艺术作品。随着深度学习算法的不断优化&#xff0c;AI 绘画工具如 Midjourney、Stable Diffu…...

单硬盘槽笔记本更换硬盘

背景 本人的笔记本电脑只有一个硬盘槽&#xff0c;而且没有M.2的硬盘盒&#xff0c;只有一个移动硬盘 旧硬盘&#xff1a;512G 新硬盘&#xff1a;1T 移动硬盘&#xff1a;512G 参考链接&#xff1a;https://www.bilibili.com/video/BV1iP41187SW/?spm_id_from333.1007.t…...

保姆级教程:利用Ollama与Open-WebUI本地部署 DeedSeek-R1大模型

1. 安装Ollama 根据自己的系统下载Ollama&#xff0c;我的是Linux&#xff0c;所以我使用如下命令进行下载安装&#xff1a; curl -fsSL https://ollama.com/install.sh | sh2. 安装Open-WebUI 使用 Docker 的方式部署 open-webui &#xff0c;使用gpu的话按照如下命令进行 …...

机器学习模型--线性回归、逻辑回归、分类

一、线性回归 级别1&#xff1a;简单一元线性回归&#xff08;手工实现&#xff09; import numpy as np import matplotlib.pyplot as plt# 生成数据 X np.array([1, 2, 3, 4, 5]) y np.array([2, 4, 5, 4, 5])# 手动实现梯度下降 def gradient_descent(X, y, lr0.01, epo…...

使用scoop 下载速度慢怎么办

在国内使用 Scoop 下载速度慢是一个常见问题&#xff0c;主要是因为 Scoop 默认的软件源&#xff08;bucket&#xff09;和下载服务器通常位于国外。以下是一些提高下载速度的方法&#xff1a; 1. 更换 Scoop 镜像源&#xff08;Bucket 镜像&#xff09;&#xff1a; 原理&…...

Kafka 可靠性探究—副本刨析

Kafka 的多副本机制提升了数据容灾能力。 副本通常分为数据副本与服务副本。数据副本是指在不同的节点上持久化同一份数据&#xff1b;服务副本指多个节点提供同样的服务&#xff0c;每个节点都有能力接收来自外部的请求并进行相应的处理。 1 副本刨析 1.1 相关概念 AR&…...

openwebui入门

1 简介 ‌Open WebUI‌&#xff08;网址是openwebui.com&#xff09;是一个高度可扩展、功能强大且用户友好的自托管Web用户界面&#xff0c;专为完全离线操作设计&#xff0c;编程语言是python。它支持对接Ollama和OpenAI兼容的API的大模型。‌ Open WebUI‌在架构上是一种中…...

Windows下怎么安装FFFmpeg呢?

在Windows下使用Open-webui报错&#xff0c;说Couldnt find ffmpeg or avconv,解决open-webui报错Couldn‘t find ffmpeg or avconv-CSDN博客于是尝试解决问题&#xff0c;那么Windows下怎么安装FFFmpeg呢&#xff1f; 尝试了两种方法。 第一种方法pip安装&#xff08;失败&…...

无公网IP 外网访问 Jupyter Notebook

Jupyter Notebook 是一个开源的Web应用程序&#xff0c;允许用户创建和共享包含实时代码、方程式、可视化和叙述文本的文档。它支持超过40种编程语言。 本文将详细的介绍如何用 Docker 在本地安装部署 Jupyter Notebook&#xff0c;并结合路由侠内网穿透实现外网访问本地部署的…...

C语言按位取反【~】详解,含原码反码补码的0基础讲解【原码反码补码严格意义上来说属于计算机组成原理的范畴,不过这也是学好编程初级阶段的必修课】

目录 概述【适合0基础看的简要描述】&#xff1a; 上述加粗下划线的内容提取版&#xff1a; 从上述概述中提取的核心知识点&#xff0c;需背诵&#xff1a; 整数【包含整数&#xff0c;负整数和0】的原码反码补码相互转换的过程图示&#xff1a; 过程详细刨析&#xff1a;…...

基于 .NET 8.0 gRPC通讯架构设计讲解,客户端+服务端

目录 1.简要说明 2.服务端设计 2.1 服务端创建 2.2 服务端设计 2.3 服务端业务模块 3.客户端设计-控制台 4.客户端设计-Avalonia桌面程序 5.客户端设计-MAUI安卓端程序 1.简要说明 gRPC 一开始由 google 开发&#xff0c;是一款语言中立、平台中立、开源的远程过程调用…...

深入浅出 DeepSeek V2 高效的MoE语言模型

今天&#xff0c;我们来聊聊 DeepSeek V2 高效的 MoE 语言模型&#xff0c;带大家一起深入理解这篇论文的精髓&#xff0c;同时&#xff0c;告诉大家如何将这些概念应用到实际中。 &#x1f31f; 什么是 MoE&#xff1f;——Mixture of Experts&#xff08;专家混合模型&#x…...

玩转Gin框架:Golang使用Gin完成登录流程

文章目录 背景基于Token认证机制简介常见的Token类型Token的生成和验证在项目工程里创建jwt.go文件根目录新建.env文件 创建登录接口 /loginToken认证机制的优点 背景 登录流程&#xff0c;相信大家都很熟悉的。传统网站采用session后端验证登录状态&#xff0c;大致流程如下&…...

Java实习生面试题汇总

Java实习生面试题汇总 简介 本人是二本大三学生&#xff0c;下半年大四。暑假在上海这边找实习工作&#xff0c;面了几家公司&#xff0c;所问到的问题记录在下面。 因为是在校生&#xff0c;没任何实习经历&#xff0c;一般找我面试的都是小公司&#xff0c;一般问的比较简…...

Java 如何覆盖第三方 jar 包中的类

目录 一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理 背景&#xff1a; 在我们日常的开发中&#xff0c;经常需要使用第三方的 jar 包&#xff0c;有时候我们会发现第三方的 jar 包中的某一个类有问题&#xff0c;或者我们需要定制化修改其中的逻辑&#xff0c…...

解密 Java Lambda 表达式中的 “effectively final“ 陷阱

文章目录 1. 引言 (Introduction)1.1. 核心问题1.2. 博客目标1.3. 目标读者1.4. 阅读收获 2. 重现错误 (Reproducing the Error)2.1. 代码示例 (LambdaErrorExampleCorrected.java)2.2. 逐步演示2.2.1. 没有错误的代码版本 (list 满足 effectively final)2.2.2. 导致错误的代码…...

react的antd中Cascader级联选择如何回显

如果你的数据都是这个样子的 {"id": 1015,"pid": 0,"name": "电力、热力、燃气及水生产和供应业","children": [{"id": 1403,"pid": 1015,"name": "热力",},{"id": 140…...

深度学习系列--04.梯度下降以及其他优化器

目录 一.梯度概念 1.一元函数 2.二元函数 3.几何意义上的区别 二.梯度下降 1.原理 2.步骤 3.示例代码&#xff08;Python&#xff09; 4.不同类型的梯度下降 5.优缺点 三.动量优化器&#xff08;Momentum&#xff09; 适用场景 1.复杂地形的优化问题 2.数据具有噪声的问…...

k8s常见面试题2

k8s常见面试题2 安全与权限RBAC配置如何保护 Kubernetes 集群的 API Server&#xff1f;如何管理集群中的敏感信息&#xff08;如密码、密钥&#xff09;&#xff1f;如何限制容器的权限&#xff08;如使用 SecurityContext&#xff09;&#xff1f;如何防止容器逃逸&#xff0…...

云计算行业分析

云计算作为数字经济的核心基础设施&#xff0c;未来十年将持续重塑全球科技格局&#xff0c;并渗透到几乎所有行业的数字化转型中。 一、云计算的发展潜力 1. 技术融合驱动爆发式创新 AI与云计算的深度耦合 - **智能云服务**&#xff1a;云厂商将提供预训练模型、自动化ML工…...

【C语言篇】“三子棋”

一、游戏介绍 三子棋&#xff0c;英文名为 Tic - Tac - Toe&#xff0c;是一款简单而经典的棋类游戏。游戏在一个 33 的棋盘上进行&#xff0c;两名玩家轮流在棋盘的空位上放置自己的棋子&#xff08;通常用 * 和 # 表示&#xff09;&#xff0c;率先在横、竖或斜方向上连成三个…...

TongSearch3.0.4.0安装和使用指引(by lqw)

文章目录 安装准备手册说明支持的数据类型安装控制台安装单节点(如需集群请跳过这一节)解压和启动开启X-Pack Security和生成p12证书&#xff08;之后配置内置密码和ssl要用到&#xff09;配置内置用户密码配置ssl&#xff08;先配置内置用户密码再配ssl&#xff09;配置控制台…...

在本地顺利的部署一个al模型从零开始 windows

引言 &#xff08;踩的坑&#xff0c;省流引言的内容没有有使模型跑起来&#xff09; 最近想在本地部署一个deepseek模型&#xff0c;就在网上搞了3 4天终于是能够部署下来了&#xff0c;在部署的时候也是成功的踩了无数的坑&#xff0c;比如我先问al如何在本地部署一个语言模…...

【容器技术01】使用 busybox 构建 Mini Linux FS

使用 busybox 构建 Mini Linux FS 构建目标 在 Linux 文件系统下构建一个 Mini 的文件系统&#xff0c;构建目标如下&#xff1a; minilinux ├── bin │ ├── ls │ ├── top │ ├── ps │ ├── sh │ └── … ├── dev ├── etc │ ├── g…...