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