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…...
大学资产管理系统中的下载功能设计与实现
大学资产管理系统是高校信息化建设的重要组成部分,它负责记录和管理学校内所有固定资产的信息。随着信息技术的发展,下载功能成为提高资产管理效率的关键环节之一。 系统架构的设计是实现下载功能的基础。一个良好的系统架构能够确保数据的高效传输和存储…...
【华为OD机试python】日志采集系统【 E卷 | 2023 Q1 |100分】
目录 题目描述 输入描述 输出描述 示例1 输入输出示例仅供调试,后台判题数据一般不包含示例 说明 示例2 输入输出示例仅供调试,后台判题数据一般不包含示例 说明 解题思路 考点 代码 题目描述 日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采…...
园区网设计与实战
想做一个自己学习的有关的csdn账号,努力奋斗......会更新我计算机网络实验课程的所有内容,还有其他的学习知识^_^,为自己巩固一下所学知识。 我是一个萌新小白,有误地方请大家指正,谢谢^_^ 文章目录 前言 这个实验主…...
DeepSeek-R1 本地电脑部署 Windows系统 【轻松简易】
本文分享在自己的本地电脑部署 DeepSeek,而且轻松简易,快速上手。 这里借助Ollama工具,在Windows系统中进行大模型部署~ 1、安装Ollama 来到官网地址:Download Ollama on macOS 点击“Download for Windows”下载安装包&#x…...
git进阶--5---git reset 和 git revert 的区别与联系
git进阶–5—git reset 和 git revert 的区别与联系 1. 相同点 都是对版本做出一些改变 2. 不同点 git reset 是进行版本回退,根据不同的参数,是定是否复原索引和工作区git revert 是撤销上一次的提交,不会改变过去的历史,安全…...
AI绘画:解锁商业设计新宇宙(6/10)
1.AI 绘画:商业领域的潜力新星 近年来,AI 绘画技术以惊人的速度发展,从最初简单的图像生成,逐渐演变为能够创造出高度逼真、富有创意的艺术作品。随着深度学习算法的不断优化,AI 绘画工具如 Midjourney、Stable Diffu…...
单硬盘槽笔记本更换硬盘
背景 本人的笔记本电脑只有一个硬盘槽,而且没有M.2的硬盘盒,只有一个移动硬盘 旧硬盘:512G 新硬盘:1T 移动硬盘:512G 参考链接:https://www.bilibili.com/video/BV1iP41187SW/?spm_id_from333.1007.t…...
保姆级教程:利用Ollama与Open-WebUI本地部署 DeedSeek-R1大模型
1. 安装Ollama 根据自己的系统下载Ollama,我的是Linux,所以我使用如下命令进行下载安装: curl -fsSL https://ollama.com/install.sh | sh2. 安装Open-WebUI 使用 Docker 的方式部署 open-webui ,使用gpu的话按照如下命令进行 …...
机器学习模型--线性回归、逻辑回归、分类
一、线性回归 级别1:简单一元线性回归(手工实现) 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 下载速度慢是一个常见问题,主要是因为 Scoop 默认的软件源(bucket)和下载服务器通常位于国外。以下是一些提高下载速度的方法: 1. 更换 Scoop 镜像源(Bucket 镜像): 原理&…...
Kafka 可靠性探究—副本刨析
Kafka 的多副本机制提升了数据容灾能力。 副本通常分为数据副本与服务副本。数据副本是指在不同的节点上持久化同一份数据;服务副本指多个节点提供同样的服务,每个节点都有能力接收来自外部的请求并进行相应的处理。 1 副本刨析 1.1 相关概念 AR&…...
openwebui入门
1 简介 Open WebUI(网址是openwebui.com)是一个高度可扩展、功能强大且用户友好的自托管Web用户界面,专为完全离线操作设计,编程语言是python。它支持对接Ollama和OpenAI兼容的API的大模型。 Open WebUI在架构上是一种中…...
Windows下怎么安装FFFmpeg呢?
在Windows下使用Open-webui报错,说Couldnt find ffmpeg or avconv,解决open-webui报错Couldn‘t find ffmpeg or avconv-CSDN博客于是尝试解决问题,那么Windows下怎么安装FFFmpeg呢? 尝试了两种方法。 第一种方法pip安装(失败&…...
无公网IP 外网访问 Jupyter Notebook
Jupyter Notebook 是一个开源的Web应用程序,允许用户创建和共享包含实时代码、方程式、可视化和叙述文本的文档。它支持超过40种编程语言。 本文将详细的介绍如何用 Docker 在本地安装部署 Jupyter Notebook,并结合路由侠内网穿透实现外网访问本地部署的…...
C语言按位取反【~】详解,含原码反码补码的0基础讲解【原码反码补码严格意义上来说属于计算机组成原理的范畴,不过这也是学好编程初级阶段的必修课】
目录 概述【适合0基础看的简要描述】: 上述加粗下划线的内容提取版: 从上述概述中提取的核心知识点,需背诵: 整数【包含整数,负整数和0】的原码反码补码相互转换的过程图示: 过程详细刨析:…...
基于 .NET 8.0 gRPC通讯架构设计讲解,客户端+服务端
目录 1.简要说明 2.服务端设计 2.1 服务端创建 2.2 服务端设计 2.3 服务端业务模块 3.客户端设计-控制台 4.客户端设计-Avalonia桌面程序 5.客户端设计-MAUI安卓端程序 1.简要说明 gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用…...
深入浅出 DeepSeek V2 高效的MoE语言模型
今天,我们来聊聊 DeepSeek V2 高效的 MoE 语言模型,带大家一起深入理解这篇论文的精髓,同时,告诉大家如何将这些概念应用到实际中。 🌟 什么是 MoE?——Mixture of Experts(专家混合模型&#x…...
玩转Gin框架:Golang使用Gin完成登录流程
文章目录 背景基于Token认证机制简介常见的Token类型Token的生成和验证在项目工程里创建jwt.go文件根目录新建.env文件 创建登录接口 /loginToken认证机制的优点 背景 登录流程,相信大家都很熟悉的。传统网站采用session后端验证登录状态,大致流程如下&…...
Java实习生面试题汇总
Java实习生面试题汇总 简介 本人是二本大三学生,下半年大四。暑假在上海这边找实习工作,面了几家公司,所问到的问题记录在下面。 因为是在校生,没任何实习经历,一般找我面试的都是小公司,一般问的比较简…...
Java 如何覆盖第三方 jar 包中的类
目录 一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理 背景: 在我们日常的开发中,经常需要使用第三方的 jar 包,有时候我们会发现第三方的 jar 包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,…...
解密 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.示例代码(Python) 4.不同类型的梯度下降 5.优缺点 三.动量优化器(Momentum) 适用场景 1.复杂地形的优化问题 2.数据具有噪声的问…...
k8s常见面试题2
k8s常见面试题2 安全与权限RBAC配置如何保护 Kubernetes 集群的 API Server?如何管理集群中的敏感信息(如密码、密钥)?如何限制容器的权限(如使用 SecurityContext)?如何防止容器逃逸࿰…...
云计算行业分析
云计算作为数字经济的核心基础设施,未来十年将持续重塑全球科技格局,并渗透到几乎所有行业的数字化转型中。 一、云计算的发展潜力 1. 技术融合驱动爆发式创新 AI与云计算的深度耦合 - **智能云服务**:云厂商将提供预训练模型、自动化ML工…...
【C语言篇】“三子棋”
一、游戏介绍 三子棋,英文名为 Tic - Tac - Toe,是一款简单而经典的棋类游戏。游戏在一个 33 的棋盘上进行,两名玩家轮流在棋盘的空位上放置自己的棋子(通常用 * 和 # 表示),率先在横、竖或斜方向上连成三个…...
TongSearch3.0.4.0安装和使用指引(by lqw)
文章目录 安装准备手册说明支持的数据类型安装控制台安装单节点(如需集群请跳过这一节)解压和启动开启X-Pack Security和生成p12证书(之后配置内置密码和ssl要用到)配置内置用户密码配置ssl(先配置内置用户密码再配ssl)配置控制台…...
在本地顺利的部署一个al模型从零开始 windows
引言 (踩的坑,省流引言的内容没有有使模型跑起来) 最近想在本地部署一个deepseek模型,就在网上搞了3 4天终于是能够部署下来了,在部署的时候也是成功的踩了无数的坑,比如我先问al如何在本地部署一个语言模…...
【容器技术01】使用 busybox 构建 Mini Linux FS
使用 busybox 构建 Mini Linux FS 构建目标 在 Linux 文件系统下构建一个 Mini 的文件系统,构建目标如下: minilinux ├── bin │ ├── ls │ ├── top │ ├── ps │ ├── sh │ └── … ├── dev ├── etc │ ├── g…...
