JavaScript和Java的区别

1. Function的地位

  • JS的function是对象
  • JS的所有的function都是closure
  • JS的Lexical enviornment作为function的context,也是以object的形式存在,跟其他object共用一样的GC机制
  • Java的function是不可独立存在,需要在类中进行声明的

这在很大程度上决定了两种编程语言的不同,JS的function更加灵活,可以作为变量传递,更加适合单线程,更适合实现回调。

2. 线程模型

  • JS脚本是单线程执行的
  • Java的特点是多线程

这点导致两者的内存回收执行机制不同,对IO的处理方式不同。与第一点结合,导致两者常用的编程模型不同。

3. 对象定义不同

  • JS的对象是独立于类存在的,它首先是一种数据结构,然后才为了OOP的方便,增加了其他语法糖
  • JS在runtime没有类的概念,只有function + prototype
  • Java的对象总是类的实例,我觉得Java的类首先是一个编程的逻辑单位,其次才是一种数据结构
  • Java和Python在运行时都有class的概念,所以可以针对对象检查 is instance of
  • 典型区别之一:JS unbounded this vs Java bounded this https://javascript.info/object-methods#this-is-not-bound
  • JS的设计是object-function-oriented,Java的设计是object-class-oriented
  • ✴ JS是weakly + dynamically type; Python是strongly + dynamically typed; Java是strongly + statically typed.

4. Array实现方式不同

  • JS array本质上是连续的,不是离散的,且默认实现了类似链表的结构,所以随机增删会影响性能

5. 遍历语法不同

  • JS的for in是遍历对象的property name; for of才是遍历对象的property value。所以遍历数组的元素要用for of

6. JS的特性

  • JS object和Map相似,区别是前者只能用string或者Symbol作为key,后者可以用任意object作为key
  • 用let不要var声明变量,因为var是老的特性,他会穿透variable scope,不安全
  • JS object的Symbol.xxx成员方法,类似python的 xxx 方法,是语言内置的接口,可以用来实现iterator之类的功能

JS的代码看起来更简洁,但同时也更随意。

这些区别我觉得都是衍生于他们原本的执行环境。

JS用于前端,前端为了执行效率和准确性,基本都是事件队列+单线程+回调,这点WPF也是类似。

Java用于后端,更偏底层,所以为了压榨多核性能,默认是支持并且鼓励多线程的。