ES6 const 使用总结

news2025/2/7 18:44:34

1. 声明不可变性

1.1 基本类型的不可变性

// 基本类型声明后不能修改
const name = 'John';
name = 'Jane';  // TypeError: Assignment to constant variable

const age = 25;
age = 26;  // TypeError: Assignment to constant variable

const 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);  // 1

function 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 initialization
  const age = 25;
}

5. 暂时性死区(TDZ)

5.1 基本概念

// 从作用域开始到变量声明前的区域称为暂时性死区
{
  console.log(name);  // ReferenceError: Cannot access 'name' before initialization
  const 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);  // ReferenceError
  const 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
    };
  }
}; 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2294420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

园区网设计与实战

想做一个自己学习的有关的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…

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

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

保姆级教程:利用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的话按照如下命令进行 …

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;是一款语言中立、平台中立、开源的远程过程调用…

Java实习生面试题汇总

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

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

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

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

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

【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…

尝试在Excel里调用硅基流动上的免费大语言模型

我个人觉得通过api而不是直接浏览器客户端聊天调用大语言模型是使用人工智能大模型的一个相对进阶的阶段。 于是就尝试了一下。我用的是老师木 袁进辉博士新创的硅基流动云上的免费的大模型。——虽然自己获赠了不少免费token&#xff0c;但测试阶段用不上。 具体步骤如下&am…

SqlSugar简单使用之Nuget包封装-Easy.SqlSugar.Core

SqlSugar官方文档 Nuget包开源地址 Nuget包是为了简化SqlSugar的使用步骤,增加一些基础的使用封装 引入分为两个版本&#xff0c;一个Ioc模式&#xff0c;另一个是注入模式&#xff0c;如果不想影响原本的仓储代码推荐使用Ioc模式&#xff0c;两者区别不到&#xff0c;方法通…