damoluomu
发布于 2026-08-23 / 8 阅读
0

Java 和 JavaScript,名字只差一个词,写法越走越近

截至 2026 年 8 月,Java 最新正式版是 2026 年 3 月 17 日发布的 JDK 26(按半年一期的节奏,这不是 LTS,长期支持版本还是 21 和 25,来源:OpenJDK 官方发布页面);JavaScript 这边最新定稿的标准是 ECMAScript 2026,也就是 ECMA-262 第 17 版(2026 年 6 月定稿,来源:ECMA 官网规范文档)。

先把底子说清楚,这两门语言的差别是根本性的。Java 静态类型,变量类型写死,源码编译成字节码交给 JVM 跑;JavaScript 动态类型,类型运行时才定型,源码直接交给引擎,边解释边 JIT 编译。继承上一个真类基、一个真原型链,并发一个多线程、一个单线程事件循环。可为什么新版越看越像?两个原因:一是 JavaScript 出生那年,网景为了搭 Java 的顺风车,语法上刻意照着 Java 描,这个骨架留到了今天;二是这几年两边都在做同一件事——语言特性现代化,函数式、资源管理、异步这些能力一项项补齐,补着补着就撞脸了。下面按几个最能说明问题的方向挨个说。

一、语法骨架,JS 从出生就照着 Java 长

最表层的东西几乎一样:大括号包代码块,分号结尾(JS 有自动分号补全可以省,但标准写法一致),// 和 /* */ 注释完全相同,运算符和优先级大差不差。流程控制整套——if/else、switch/case、break/continue、for、while、do-while——写法是同一个模子。变量声明也往一个方向使劲:Java 10 的 var 省掉重复的类型书写,JS 的 let/const 把 var 函数作用域的坑填平,一个省字一个治乱,目标都是声明更简洁、作用域更清楚。

二、面向对象,一个真类一个假类,写法却对上了

Java 是正统的类基继承,JS 底层是原型链,机制两码事。但 ES6 的 class 语法糖进来之后,类声明、constructor、实例方法和静态方法、extends 继承、super 调父类,写出来跟 Java 几乎一个样,Java 背景的人基本不用重新学。封装上,Java 有 public/protected/private 三件套,JS 用 # 前缀的私有字段,一样能把内部状态关起来不让外面乱碰。机制不同,能表达的事一样多。

三、函数式,两边都从纯命令式里长出了新枝

Java 8 是个分水岭,lambda 加 Stream API,filter/map/reduce 链式操作集合,还是懒执行,用多少算多少。JS 这边箭头函数和数组的 map/filter/reduce 早就有,但数组方法是急性子,一次算完;直到 ES2025 才给迭代器补上 Iterator Helpers,map/filter/take/flatMap 全齐,同样是惰性求值、链式调用——执行模型一下跟 Java Stream 对上了。相当于 JS 先学会了"这么写",这几年才把"怎么算"也补成 Java 那样。

四、资源管理和异常,撞得最瓷实

异常两边早就同款:try/catch/finally、throw、分层错误体系,Java 的 Exception 家族和 JS 的 Error 家族,都能自定义子类。资源管理这边更有意思。Java 7 就有 try-with-resources,代码块走完自动关文件流、数据库连接;JS 之前只能在 finally 里手动收拾,直到 ES2026 才正式引入 using / await using,作用域结束自动调用对象的释放方法。思路一模一样,都是防泄漏、少写清理代码——只是 Java 领先了差不多二十年,JS 这步补得有点晚。

五、异步,机制差得远,写法却一个样

一个多线程一个单线程事件循环,却都往"用同步的样子写异步"上靠。链式组合这块,Java 的 CompletableFuture 对 JS 的 Promise,then/catch/finally 串起来,回调地狱两边都治了。同步风格这边,JS 靠 async/await;Java 靠虚拟线程(Java 21 正式转正,用写普通线程的方式跑高并发),配着结构化并发——这个从 Java 19 就开始孵化,到 JDK 26 还是第六次预览。另外 ES2025 的 Promise.try 能把同步函数统一包装成 Promise,同步抛的错也进 .catch,跟 CompletableFuture.supplyAsync 包同步任务的思路很接近。

六、标准库,互相抄作业

日期时间最典型。Java 8 的 java.time 干掉了又老又坑的 Date/Calendar,不可变、线程安全、时区友好;JS 的原生 Date 被骂了多少年,ES2026 的 Temporal 总算落地,同样不可变,PlainDate、PlainTime、Instant、ZonedDateTime 拆得明明白白,跟 java.time 一个路数。集合上,List/Array、Set、Map 两边都有,ES2025 还给 Set 补了 union/intersection/difference 这些集合运算,补齐了 Java 集合框架早有的能力。网络请求也是:Java 11 内置 HttpClient,支持 HTTP/2,JDK 26 又加了 HTTP/3;JS 的原生 fetch 在主流运行时里 HTTP/2、HTTP/3 也都通。两边都是标准自带,不用挂第三方库。

七、底层那点共性

内存管理都是自动的,JVM 和 V8 都走分代回收,开发者不用手动申请和释放。跨平台,Java 靠 JVM"一次编写、到处运行",JS 靠浏览器加 Node 全平台跑,都跟操作系统解耦了。

一句话:Java 和 JavaScript 底子差得远,但最新版从语法到标准库越靠越近,想从一边跳到另一边,门槛比想象中低。

参考来源:

[1] JDK 26 官方发布页面(OpenJDK):https://openjdk.org/projects/jdk/26/

[2] JEP 517: HTTP/3 for the HttpClient(OpenJDK):https://openjdk.org/jeps/517

[3] JEP 525: Structured Concurrency (Sixth Preview)(OpenJDK):https://openjdk.org/jeps/525

[4] ECMAScript 2026 Language Specification,ECMA-262 第 17 版(ECMA 官网):https://262.ecma-international.org/17.0/

[5] ECMAScript 2025 Language Specification,ECMA-262 第 16 版(ECMA 官网):https://262.ecma-international.org/16.0/

[6] Temporal 提案(TC39):https://tc39.es/proposal-temporal/

[7] Explicit Resource Management(using)提案(TC39):https://github.com/tc39/proposal-explicit-resource-management