ES5时代的残党(被ES6淘汰的JS写法)

article/2025/7/27 18:57:49

近年来,JavaScript语言经历了翻天覆地的变化。ES6(ECMAScript 2015)的发布标志着JavaScript进入了现代化时代,带来了大量新特性和更优雅的写法。但时至今日,许多开发者仍然固守着ES5时代的老旧模式,这不仅使代码显得过时,还会影响性能和可维护性。

1. var 声明 - 作用域混乱的根源

ES5时代,变量声明只有一种方式:使用var关键字。

var name = 'JavaScript';
var version = 5;
if (version > 4) {var name = 'Modern JavaScript'; // 覆盖外部作用域的name
}
console.log(name); // 输出 'Modern JavaScript'

问题所在var声明的变量存在变量提升,且只有函数作用域,没有块级作用域,容易导致变量污染和意外覆盖。

现代替代方案:使用letconst

const name = 'JavaScript'; // 不可重新赋值的变量
let version = 5; // 可重新赋值的变量
if (version > 4) {let name = 'Modern JavaScript'; // 仅在块级作用域内有效
}
console.log(name); // 输出原始值 'JavaScript'

2. 函数声明和函数表达式的混用

ES5时代,函数定义方式五花八门,导致代码风格不一致:

// 函数声明
function doSomething() { }
// 函数表达式
var processData = function() { };
// 立即执行函数表达式(IIFE)
(function() {// 函数体
})();

问题所在:不同的函数定义方式有不同的提升行为,容易造成困惑;冗长的语法也增加了代码量。

现代替代方案:使用箭头函数和简化的方法定义

// 箭头函数
const processData = () => {// 函数体
};// 对象方法简写
const obj = {doSomething() {// 函数体}
};// 模块代替IIFE
// 在独立的模块文件中编写代码,通过import/export交互

3. 回调地狱 - 异步编程的噩梦

ES5时代的异步编程主要依赖回调函数,特别是在处理多个连续异步操作时,代码嵌套严重:

getData(function(a) {getMoreData(a, function(b) {getEvenMoreData(b, function(c) {getFinalData(c, function(result) {console.log('Got the final result: ' + result);}, failCallback);}, failCallback);}, failCallback);
}, failCallback);

问题所在:代码可读性差,错误处理复杂,逻辑流难以跟踪,修改和调试困难。

现代替代方案:Promise和async/await

// 使用Promise链
getData().then(a => getMoreData(a)).then(b => getEvenMoreData(b)).then(c => getFinalData(c)).then(result => {console.log('Got the final result: ' + result);}).catch(error => {// 统一处理错误console.error(error);});// 使用async/await(更简洁清晰)
async function retrieveData() {try {const a = await getData();const b = await getMoreData(a);const c = await getEvenMoreData(b);const result = await getFinalData(c);console.log('Got the final result: ' + result);} catch (error) {console.error(error);}
}

4. arguments对象 - 参数处理的古董

ES5时代,处理可变参数时常用arguments对象:

图片

问题所在arguments是类数组对象而非真正的数组,无法直接使用数组方法;箭头函数中不存在arguments

现代替代方案:剩余参数(Rest Parameters)

图片

5. 构造函数和原型继承 - 面向对象的曲折之路

ES5实现面向对象编程相当繁琐: 

图片

问题所在:语法冗长复杂,原型链设置容易出错,constructor属性需手动修复,私有属性实现困难。

现代替代方案:ES6 类语法

图片

6. 字符串拼接和模板 - 繁琐且易错

ES5中,字符串拼接主要依靠加号运算符:

图片

问题所在:可读性差,特别是多行字符串;容易忘记空格;插入表达式需要中断字符串并使用加号。

现代替代方案:模板字符串

图片

7. 数组和对象的复制 - 引用与深浅拷贝困境

ES5中,复制数组和对象比较麻烦:

图片

问题所在:代码冗长,容易忘记检查hasOwnProperty导致原型污染问题。

现代替代方案:展开运算符

图片

8. for循环的滥用 - 迭代的老方式

ES5时代,几乎所有迭代操作都依赖于for循环:

图片

问题所在:代码冗长,容易出错(如越界访问),无法表达迭代意图。

现代替代方案:数组方法(mapfilterreduce等)

// 数组迭代
const numbers = [1, 2, 3, 4];
numbers.forEach(num => console.log(num * 2));
// 或使用map
const doubled = numbers.map(num => num * 2);// 过滤元素
const evens = numbers.filter(num => num % 2 === 0);

JavaScript已经发展成为一门成熟、强大的编程语言,告别旧时代的老写法,让代码更简洁、更安全、更易维护。


http://www.hkcw.cn/article/qtjDYIJKeD.shtml

相关文章

【Python】4.字典和文件

文章目录 一、字典1、字典是什么?2、创建字典3、查找 key4、新增/修改元素5、删除元素6、遍历字典元素7、取出所有 key 和 value8、合法的 key 类型小结 二、文件1、文件是什么?2、文件路径3、文件操作1)打开文件2)关闭文件3&…

物流项目第十一期(智能调度之分配快递员)

本项目专栏: 物流项目_Auc23的博客-CSDN博客 整体核心业务流程 关键流程说明: 用户下单后,会产生取件任务,该任务也是由调度中心进行调度的订单转运单后,会发送消息到调度中心,在调度中心中对相同节点的运…

React 项目中封装 Excel 导入导出组件:技术分享与实践

文章目录 前言一、为什么需要封装 Excel 组件?二、技术选型三、核心实现1. 安装依赖2. 封装Excel导出3. 封装导入组件 (UploadExcel) 总结 前言 在 React 项目中,处理 Excel 文件的导入和导出是常见的业务需求。无论是导出报表数…

用calibredrv提取版图中指定类型cell,保留位置信息并输出新的gds

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 现在有一个gds,其中的bump位置信息是我们需要的,如何从现有的gds中提取我们需要的部分呢? 需要用到工具calibredrv,如果数量少,可以用图形界面操作,方法如下: 01 打开gds calibredrv -m inp…

iOS 使用CocoaPods 添加Alamofire 提示错误的问题

Sandbox: rsync(59817) deny(1) file-write-create /Users/aaa/Library/Developer/Xcode/DerivedData/myApp-bpwnzikesjzmbadkbokxllvexrrl/Build/Products/Debug-iphoneos/myApp.app/Frameworks/Alamofire.framework/Alamofire.bundle把这个改成 no 2 设置配置文件

Python基本运算符

White graces:个人主页 🐹今日诗词:相恨不如潮有信,相思始觉海非深🐹 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏 目录 🧮 Pyt…

nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: 80端口被占用

Nginx启动报错:nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions) 这个报错代表80端口被占用 先查看占用80的端口 netstat -aon | findstr :80 把它杀掉,强…

vscode命令行debug

vscode命令行debug 一般命令行debug会在远程连服务器的时候用上,命令行debug的本质是在执行时暴露一个监听端口,通过进入这个端口,像本地调试一样进行。 这里提供两种方式: 直接在命令行中添加debugpy,适用于python…

(笔记+作业)第五期书生大模型实战营---L1G2000 OpenCompass 评测书生大模型实践

学员闯关手册:https://aicarrier.feishu.cn/wiki/QdhEwaIINietCak3Y1dcdbLJn3e 课程视频:https://www.bilibili.com/video/BV13U1VYmEUr/ 课程文档:https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/Python 关卡作业:htt…

激光雷达的强度像和距离像误差与噪声分析(1)2025.5.30

激光雷达的强度像和距离像在测量过程中可能受到多种误差和噪声的影响,这些因素既包括硬件本身的物理特性,也涉及环境条件和算法处理等外部因素。以下是主要误差类型、噪声来源及其关键影响因素的综合分析: 一、强度像的误差与噪声 能量信号…

uboot移植之IOMUX介绍

本章节主要讲,如何将NXP官方i.MX6ULL EVK评估板的uboot源码移植适配到ELF 1开发板。本身uboot的作用就是启动内核,只要能成功启动内核,uboot使命便已完成。但是从开发调试的角度来讲,有时候我们需要在uboot阶段使用一些外设接口方…

3DMAX+Photoshop教程:将树木和人物添加到户外建筑场景中的方法

在本教程中,我将向您展示如何制作室外场景。我不会详细解释每一个细节,而是想快速概述一下我的方法。 在本教程中,我使用了一个相对简单的3D模型,并向您展示了在一些高质量纹理的帮助下可以做什么。此外,我将向您展示…

n8n 中文系列教程_25.在n8n中调用外部Python库

在n8n中使用Python处理复杂任务时,内置的Code节点由于运行在沙盒环境中,无法直接调用外部Python库(如pandas、requests等),限制了工作流的扩展能力。本文将介绍一种持久化解决方案:通过Docker挂载目录虚拟环…

STM32单片机简介

1.基本情况 STM32单片机正如其名是32位微控制器,相较于51单片机的8位微控制器,性能会更好,但学习难度也会提高。 在stm32单片机中内核时核心部分,是ARM公司设计的,其在stm32单片机中占据极为重要的地位。(程序指令的…

安全帽目标检测

安全帽数据集 这里我们使用的安全帽数据集是HelmentDetection,这是一个公开数据集,里面包含5000张voc标注格式的图像,分为三个类别,分别是 0: head 1: helmet 2: person 安全帽数据集下载地址、 我们将数据集下载后&#xff0c…

气镇阀是什么?

01、阀门介绍: 油封机械真空泵的压缩室上开一小孔,并装上调节阀,当打开阀并调节入气量,转子转到某一位置,空气就通过此孔掺入压缩室以降低压缩比,从而使大部分蒸汽不致凝结而和掺入的气体一起被排除泵外起此…

1,QT的编译教程

目录 整体流程: 1,新建project文件 2,编写源代码 3,打开QT的命令行窗口 4,生成工程文件(QT_demo.pro) 5,生成Make file 6,编译工程 7,运行编译好的可执行文件 整体…

Linux操作系统 使用共享内存实现进程通信和同步

共享内存使用 //main.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <assert.h> #include <sys/shm.h> #include <string.h> int main() {int shmidshmget((key_t)1234,256,IPC_CREAT|0600);assert(shmid!-1);…

力扣HOT100之动态规划:322. 零钱兑换

这道题和上一道题279.完全平方数的套路是完全一样的&#xff0c;但是这道题不需要我们自己生成物品列表&#xff0c;函数的输入中已经给出了&#xff0c;但是这道题有一个坑&#xff0c;就是我们在初始化dp数组的时候&#xff0c;所有的位置不应该赋值为INT_MAX&#xff0c;因为…

工厂方法模式(Factory Method)深度解析:从原理到实战优化

作者简介 我是摘星&#xff0c;一名全栈开发者&#xff0c;专注 Java后端开发、AI工程化 与 云计算架构 领域&#xff0c;擅长Python技术栈。热衷于探索前沿技术&#xff0c;包括大模型应用、云原生解决方案及自动化工具开发。日常深耕技术实践&#xff0c;乐于分享实战经验与…