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用于后端,更偏底层,所以为了压榨多核性能,默认是支持并且鼓励多线程的。