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

对 JavaScript 说“不”

JavaScript编程语言历史悠久,但它是在 1995 年大约一周内创建的。

它最初被称为 LiveScript,但后来更名为 JavaScript,以赶上 Java 的潮流,尽管它与 Java 毫无关系。

它很快就变得非常流行,推动了 Web 应用程序革命,并得到了地球上几乎所有 Web 浏览器的支持。

如今,JavaScript 可能是世界上最常用的编程语言。

多年来,我一直说 JavaScript 之于 Web 浏览器就像汇编代码之于 CPU。

当然,汇编语言是一种强大的语言,就像 JavaScript 一样,但我们拥有高阶语言是有原因的。

鉴于如今浏览器才是真正的操作系统,JavaScript 应该——而且最终会——在开发人员的心中走上汇编语言的道路。 

我并不否认 JavaScript 的成功和有效性。Web 就是建立在它之上的,尽管它存在很多缺陷,但人们还是用它做出了许多了不起的事情。

但我就是无法将 JavaScript 视为一种我们应该编写的语言,就像今天只有极少数开发人员编写汇编语言一样。

在构建 Windows 应用程序时,我更喜欢让编译器编写我的汇编语言,在构建 Web 应用程序时,我更喜欢让编译后的 TypeScript 为我编写 JavaScript。

TypeScript则是另一回事。现在有了一种编程语言。

TypeScript 由伟大的Anders Hejlsberg设计,它具有 JavaScript 的所有优点(例如它们本身),同时还添加了一个富有表现力和强大的类型系统。坦率地说,我不明白为什么有人会更喜欢 JavaScript 而不是 TypeScript。

为什么不使用 TypeScript?

首先,您可以按照自己的节奏开始使用 TypeScript。这不是全有或全无。所有 JavaScript 代码都是 TypeScript 代码。我(主要)开玩笑说,我很乐意收取一笔不小的费用,将所有 JavaScript 开发团队转变为 TypeScript 开发人员,只需将所有 *.js 文件更改为 *.ts 文件即可。

通过这一更改,他们将成为一家 TypeScript 商店,他们根本不需要改变编写代码的方式。然后他们可以逐渐开始按照自己的意愿使用 TypeScript。 

我缺乏理解进一步源于开发人员对使用 TypeScript 的无力反对。 

“所有这些类型都只是碍事而已”

好吧,当然,他们可能会妨碍你。你也许可以快速解决一些问题,并且了解你编写的代码的一切。

但是,当那些可怜的人看到你六个月或一年前的代码时,他们不得不试图弄清楚你在想什么,那该怎么办呢?(别介意那个可怜的人可能是你……)

这就像说“我想在一年内遇到无法预见的问题,而我却记不起所有这些代码应该做什么。”

通过输入所有内容,您可以清楚简洁地声明代码意图,并在整个代码库中执行这些意图。对于拥有许多开发人员的应用程序,能够清楚明确地表达代码的功能,这比需要其他开发人员花费认知精力才能弄清楚的代码具有巨大的优势。

“JavaScript 非常适合快速制作原型”

好吧,这没问题,但请考虑一下:我们都知道“原型”的概念有点可笑。可悲的是,将原型扔到一边并重新启动“真正的”应用程序的情况很少见。

原型成为真正的应用程序,您将永远陷入在匆忙拼凑原型时做出的糟糕基础决策中,您曾说过您永远不会部署原型,但最终还是部署了它。快速拼凑某物的能力并不是一种美德。

“JavaScript 非常适合初学者”

当我听到这个时,我想,“我希望崭露头角的开发人员学会以坏习惯来编码,而不是学习真正的编程语言是如何工作的。” 

“打字打得太累了,我的手指都累了”

我的意思是,拜托。这是我听过开发人员给出的最糟糕的借口,我为那些认真提出这个借口的开发人员感到羞愧。

您可以在构建系统时键入内容,也可以在以后维护、重做和修复系统时进行更多键入。

因为键入内容太多而不想编写清晰、明确的代码是荒谬和懒惰的。

所有这些额外的键盘工作都可以让您充分表达代码的作用。您可以多键入一点。天哪。

“TypeScript 编译器只能发现小错误”

嗯,是的。完全正确。 

“所有这些类型都存在太多错误”

嗯,是的。完全正确。

好吧,最后两条评论有点轻率。但错误才是重点。

TypeScript 编译器会发现错误,如果未通过测试发现,这些错误可能会在部署时出现。

在开发周期的早期发现问题总是更好的,没有什么比在您输入错误时立即显示一个小红色波浪线更早的了。 

至于“错误太多”,嗯,这是一个功能。TypeScript 是精确的,编码时精确是好的和可取的。

使用 JavaScript 时,你可以用无数种方式来自讨苦吃。

我看到太多“猜猜这个 JavaScript 代码会输出什么!”的问题。如果一种语言中存在歧义和不精确,那么这种语言将导致有缺陷的代码。

如果您必须运行代码才能知道它的输出应该是什么,那么您的代码就是错误的。 

“我可以使用单元测试来确保我的代码正常运行”

这是一个让我犹豫的论点。我喜欢单元测试和测试驱动开发,我认为我们都应该以这种方式编写代码,所以这个论点很有说服力。但后来我想起你也可以用 TypeScript 进行单元测试,所以这个论点有点站不住脚。

糟糕的编程语言,糟糕的代码

当您说“我可以用 JavaScript 快速开发”时,我听到的是“这个项目将成为维护的噩梦。”

当您说“我不喜欢所有那些冗长的内容。JavaScript 更简单、更简洁”时,我听到的只是“我喜欢当我回头看代码时,代码是难以理解的。”

当您说“我只想解决问题,而不是处理所有这些类型”时,我听到的是“我只想以后给自己制造一大堆问题。”

当您说“很难将类型放在所有东西上”时,我听到的是“哇,哇,哇,哇。”

最终,JavaScript 成为了在正确时间出现的正确事物。它最终被折叠、扭曲和肢解,用于它并不适合的用途。

这就是 TypeScript 出现的原因。TypeScript 利用了 JavaScript 的普遍性,同时添加了现代类型系统的所有功能。这就是您应该使用 TypeScript 的原因。

相关文章:

对 JavaScript 说“不”

JavaScript编程语言历史悠久,但它是在 1995 年大约一周内创建的。 它最初被称为 LiveScript,但后来更名为 JavaScript,以赶上 Java 的潮流,尽管它与 Java 毫无关系。 它很快就变得非常流行,推动了 Web 应用程序革命&…...

spring下的beanutils.copyProperties实现深拷贝

spring下的beanutils.copyProperties方法是深拷贝还是浅拷贝?可以实现深拷贝吗? 答案:浅拷贝。 一、浅拷贝深拷贝的理解 简单说拷贝就是将一个类中的属性拷贝到另一个中,对于BeanUtils.copyProperties来说,你必须保…...

蓝桥杯二分题

P1083 [NOIP2012 提高组] 借教室 题目描述 在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。 面对海量租…...

3D数字化革新,探索博物馆的正确打开新方式!

3D数字化的发展,让博物馆也焕发新机,比如江苏省的“云上博物”,汇聚江苏全省博物馆展陈资源,采取线上展示和线下体验两种方式进行呈现的数字展览项目。在线上,用户可以通过H5或小程序进入“云上博物”数字展览空间&…...

工业检测基础-工业相机选型及应用场景

以下是一些常见的工业检测相机种类、检测原理、应用场景及选型依据: 2D相机 检测原理:基于二维图像捕获,通过分析图像的明暗、纹理、颜色等信息来检测物体的特征和缺陷.应用场景:广泛应用于平面工件的外观检测,如检测…...

通过 FRP 实现 P2P 通信:控制端与被控制端配置指南

本文介绍了如何通过 FRP 实现 P2P 通信。FRP(Fast Reverse Proxy)是一款高效的内网穿透工具,能够帮助用户突破 NAT 和防火墙的限制,将内网服务暴露到公网。通过 P2P 通信方式,FRP 提供了更加高效、低延迟的网络传输方式…...

即时通信系统项目总览

聊天室服务端项目总体介绍 本项目是一个全栈的即时通信系统, 前端使用QT实现聊天客户端, 后端采⽤微服务框架设计, 由网关子服务统一接收客户端的请求, 再分发到不同的子服务上处理并将结果返回给网关, 网关再将响应转发给客户端 拆分的微服务包含: 网关服务器&…...

QT获取tableview选中的行和列的值

查询数据库数据放入tableview(tableView_database)后 QSqlQueryModel* sql_model new QSqlQueryModel(this);sql_model->setQuery("select * from dxxxb_move_lot_tab");sql_model->setHeaderData(0, Qt::Horizontal, tr("id&quo…...

GDPU 人工智能 期末复习

1、python基础 2、回归、KNN、K-Means、搜索方法思想及算法实现步骤 3、知识表示基本概念 4、状态空间的相关概念、表示方法及应用 5、图搜索策略及应用 6、问题归约概念、与或图搜索、博弈树搜索与剪枝 7、决策树、贝叶斯决策算法及其应用 8、神经网络与深度学习基本概念 一、…...

编程之路,从0开始:补充篇

Hello大家好&#xff01;很高兴和大家又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《题海拾贝》、《数据结构与算法之美》 欢迎点赞&#xff0c;关注&#xff01; 这篇…...

使用缓存提升Web应用性能:从新手到高手的实践指南

引言 在现代Web开发中&#xff0c;性能优化是确保用户体验和系统稳定性的关键。使用缓存是提升网站性能的有效手段之一&#xff0c;可以显著减少数据库访问和计算开销。根据“网站优化第一定律”&#xff0c;缓存可以提升网站的响应速度&#xff0c;减少延迟&#xff0c;从而改…...

【数字电路与逻辑设计】实验一 序列检测器

文章总览&#xff1a;YuanDaiMa2048博客文章总览 【数字电路与逻辑设计】实验一 序列检测器 一、实验内容二、设计过程&#xff08;一&#xff09;作出状态图或状态表&#xff08;二&#xff09;状态化简&#xff08;三&#xff09;状态编码 三、源代码&#xff08;一&#xff…...

运动模糊效果

1、运动模糊效果 运动模糊效果&#xff0c;是一种用于 模拟真实世界中快速移动物体产生的模糊现象 的图像处理技术&#xff0c;当一个物体以较高速度移动时&#xff0c;由于人眼或摄像机的曝光时间过长&#xff0c;该物体会在图像中留下模糊的运动轨迹。这种效果游戏、动画、电…...

养老护理员培训考试题库;免费题库;大风车题库

下载链接&#xff1a;大风车题库-文件 大风车题库网站&#xff1a;大风车题库 大风车excel&#xff08;试题转excel&#xff09;&#xff1a;大风车excel...

Python-配置模块configparser使用指南

configparser 是 Python 标准库中的模块&#xff0c;用于处理配置文件&#xff08;如 .ini 文件&#xff09;。它适合管理程序的配置信息&#xff0c;比如数据库连接参数、应用程序设置等。 1. 配置文件的基本结构 配置文件通常是 .ini 格式&#xff0c;由 节&#xff08;Sec…...

C++的HDF5库将h5图像转为tif格式:szip压缩的图像也可转换

本文介绍基于C 语言的hdf5库与gdal库&#xff0c;将.h5格式的多波段HDF5图像批量转换为.tif格式的方法&#xff1b;其中&#xff0c;本方法支持对szip压缩的HDF5图像&#xff08;例如高分一号卫星遥感影像&#xff09;加以转换。 将HDF5图像批量转换为.tif格式&#xff0c;在部…...

【JAVA】Java第十三节:String类(String相关方法,以及StrinBuftrer , StringBulder相关方法)

本文详细介绍了String类以及常用的String相关方法&#xff0c;以及StrinBuftrer , StringBulder相关方法的使用&#xff0c;建议有印象即可&#xff0c;不需要都记住&#xff0c;使用时去查取即可 一、创建一个String类型的变量 我们平时创建String类型的变量一般是第一种形式…...

WordPress安装或访问时出现数据库连接错误的处理方式

一、在安装时出现数据库连接错误 1、如果数据库名称、用户名或密码错误&#xff0c;或者主机设置不正确&#xff08;如数据库服务器不是在本地localhost&#xff0c;而是在远程服务器&#xff0c;需要正确填写远程服务器的 IP 地址或域名&#xff09;&#xff0c;就会导致连接错…...

JAVA-面向对象基础

文章目录 概要封装多态抽象类接口内部类为什么需要内部类 概要 面向对象是一种编程范式或设计哲学&#xff0c;它将软件系统设计为由多个对象组成&#xff0c;这些对象通过特定的方式相互作用 封装 将数据和操作数据的方法封装在一个类中&#xff0c;并通过访问修饰符控制对…...

[Java]项目入门

这篇简单介绍一些入门的有关项目和行业的知识&#xff0c;并带着实现一个小项目。便于已经编程入门的各位准备进阶到下一个阶段。 先大致地介绍&#xff0c;一个完整的项目(不看客户端、服务端的分类)基本可以划分为三部分&#xff1a; 1.前端。比如你现在看到的CSDN页面就是一…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...