最近看到Java 8,9, 10以及Java Script ES 6的新特性的时候,发现一个比较有意思的事情,就是这两个名字相近实际基因完全不同的编程语言在发展方向上似乎在互相靠近。
1. 历史背景
1.1 名字的由来
- Java
1991年 太阳微系统公司(Sun)James Gosling等人研发了名称为 Oak 的语言,目标是小型嵌入式设备。1994年更名为Java(爪哇)。爪哇生产咖啡,所以Java的图标就是一杯热气腾腾的咖啡。 - JavaScript
JavaScript原名LiveScript,是为即将在 1995 年发行的 Netscape Navigator 2.0 浏览器开发的脚本语言。后更名为 JavaScript,目的是为了利用 Java 这个因特网时髦词汇。
1.2 原始设计理念
- Java
Java 设计之初,就确定了面向对象Object Oriented的方向,“一切都是对象”。Java是一种功能完备的强类型语言。 - JavaScript
JavaScript 设计目标是为浏览器做表单验证使用的轻量级脚本语言。它虽然使用对象,但本质是函数式语言,函数是第一等公民,对象实现的方式是也不像传统的面向对象语言,而是使用原型链继承的方式。JavaScript是一种特定用途的功能有限的弱类型脚本语言。另一值得说的地方是
1.3 原始相关性
由上面所说的可以看出,Java与JavaScript的原始相关性基本上只是名字有点儿像,其他基本没啥关系。如果仔细找的话可以看到某些细节有点儿像:比如语法都用点操作符,API里面都有substring函数。但这点儿基因相似程度远不足以证明他们的关系比别的语言更亲密。
2. 新版本的互相渗透
Java 和JavaScript最近似乎是在互相渗透,距离越来越近了。下面列一下最近版本的相关性
2.1 Java ==> JavaScript
- Java 8开始支持lamda 表达式(类似ES 6箭头函数),函数式接口,方法引用等语法特性,即支持函数式的写法
- Java 6开始正式支持运行在JVM上的脚本语言框架,支持多种弱类型语言,包括JavaScript引擎
- Java 8支持新的Nashorn javascript引擎, java 9又对其进行改进使得它支持部分ES 6新特性
- Java 10预计会支持var 关键字,弱类型语言的写法
2.2 JavaScript ==> Java
- ES 6的新变量let使用了块级作用域,习惯Java那种变量作用域的同学可以松口气了
- ES 6支持常量const (类似Java final关键字)
- ES 6支持class及相关关键字,虽然我认为其实是个语法糖,内部还是原型链,但起码写类似面向对象的程序方便多了
- ES 6支持模块化,import, export
- ES 6引入iterable类型(类似Java的iterator)
- ES 6支持可变参数(Java 5开始支持)
- Node.js可以做服务器端程序(这个虽然不算是新特性,但也体现了工程师们的意愿)
3. 总结
除去上面列出的,我想我们还能找出不少例子,Java与JavaScript确实在特性上有融合的趋势。这不是说Java 或者JavaScript的语言要真的融合。但是作为广泛应用的两种编程语言,我想程序猿用户群体的重合是难免的事情,本人也是前端用JavaScript后端用Java,比较之下,一边用得熟练好用的特性,自然希望另一面也有:Java开发希望箭头函数的方便,JavaScript开发希望用上类和继承。什么面向对象和函数式之争,在实际需求面前都不重要,怎么方便怎么来,对吧…