03.04 客观地说java难还是javascript难?

我的人生真美好


从难易程度上来说,Java语言要比JavaScript语言更复杂一些,同时Java语言涵盖的内容也比JavaScript语言更多,Java的应用场景也更广。


刚开始学的话,java内容更多,javascript特别简单。java是静态类型语言,比javascript多了数据类型、类、接口、包等概念,自带的类库也比javascript自带的函数多的多,而且运行环境还得配置,需要安装jdk,配置环境变量,安装ide等等。而javacript直接在浏览器控制台就可以快速开始学习。这几方面都决定了java比javascript入门难度更大。但是入门以后,仅针对语言的难度来说,javascript的难度就超过java了。javascript灵活多变,比如闭包,无处不在的类型转换,this的理解,原型……现在又有es6,语法比java内容更多了,更难理解了。但是从工程方面来说,各自都能做出很庞大、很复杂的项目,难度都有无限大的可能,就看你自己的能力了。


胆小的麦迪文


呃呃~这个问题怎么说呢?个人感觉JavaScript比Java难,周围Java高手如云,但JavaScript高手寥寥无几!

自从Web 2.0的时代让只能玩儿网页特效的JS火的一塌糊涂(Ajax当时的时髦技术,现在也很常用)。

这些年开发感觉Java用起来很顺手(只因大部分时间都在写后端吧),前端核心技术JavaScript写起来很有挑战,刚开始一个弱类型就折腾我半天,后来再加上JS调试麻烦,好容易搞顺手了又出现了内存管理问题。

刚开始,每当我写JS 到身无可恋的时候,我就开始发誓“老子以后再写JS……”。

看到那些前端的兄弟“啪啪啪”写JS的时候,我那个“慕嫉妒恨”的小眼神儿~


桃园仙


JavaScript入门简单,不过要学好真的是非常不容易,关键是这玩意儿坑实在是太多了,不过尽管这玩意儿是个垃圾,可是也真的很强大,现在WebAPP已经是常态了,Electron杀入桌面领域了,现在弄个Node想要统一前后端了。

语法层面Java更简单,JavaScript乱七八糟,这也是JavaScript坑多的根本原因,做项目的话肯定Java更难一些,JavaScript稍稍学习就能做一些东西,再就是JavaScript毕竟是界面语言,结合CSS和HTML更符合所见即所得的编程哲学。

JavaScript = C + Lisp+Java?

行业里面有两句关于JavaScript的黑话,这两句黑话很好的反映了JavaScript为什么会成为今天的样子,为什么会有这么多的坑。

第一个是JavaScript之父Brendan Eich当时接到公司的工作任务设计一门编程语言,这个任务Brendan Eich并不是特别想做,于是想着敷衍了事就好了,仅仅用了10天时间就设计好了JavaScript这门编程语言。JavaScript之父当年就是为了敷衍了事完成公司的任务,要是他知道自己设计的编程语言今天会这么火,我想他一定会好好设计一下这门编程语言。

第二个是Brendan Eich是狂热的函数式编程语言爱好者,对Lisp有着非常好的好感,于是Brendan Eich在JavaScript中加入了函数式编程的思想。

有了这两个原则,Brendan Eich设计JavaScript的时候参考了C语言的基本语法,借鉴了Java的内存管理和数据类型,同时也吸取了Scheme等Lisp方言的函数式编程语言的特点,将函数的地位大大提高,当然Lisp里面的“宏”还是没有采用。命名上也是刻意用了“Java”这个字眼,算是打擦边球吧,最终JavaScript就成了一个蹭Java的名气,披着C语言外衣的Lisp语言。

JavaScript到底有哪些比较具体的坑?

JavaScript生态也是乱七八糟,ES5、ES,框架什么的更新极快,注意我说的是极快,极其不稳定就意味着你要快速跟进更新。Node、函数库、对象库一堆,内置对象、DOM编程,等你学了之后发现这玩意儿又没法用,到了公司发现公司大家用的都是各种衍生库。

JavaScript涉及到很多面向过程的编程思想,又有很多面向对象的思想。JavaScript还不是传统的经典OO,是多了一层prototype的OO,这一点如果你的以往职业经验学过经典OO的,那么用JavaScript你一定会难受,这个几乎是肯定的。

JavaScript的范式真的是一言难尽,传统范式、OO范式、函数式范式,再给你来点啥事件驱动啊啥的,AOP啥的,这时候你就开始要抓狂了,这到底是什么乱七八糟的玩意儿?

经常有人问我怎么学JavaScript,我的建议就是大家认真学习,认真做项目,还有就是那本大名鼎鼎的《JavaScript权威指南》,看一遍不行再看一遍,看两遍不行就看三遍,看三遍我觉得那你也差不多了,其余的就是怼各个框架的文档,比如React、比如Vue,反正拿到就生怼,不然还能咋办?



EmacserVimer


实际上java比较简单,java的简单在于java的发明人高斯林当初做这个东西是为了减少程序员的低级错误,把所有的一切都限制好,只要把繁琐的语法和概念记清楚了,写起来很轻松,好像搬砖一样,每天就是增删改查,而且是固定的面向对象编程范式,开发业务逻辑死死的,工程化程度很高,所以那些培训班初中毕业就可以去招生,出来之后一样可以干活。

如果只从使用途径上来看,javascript的发明是为了给浏览器添加一些交互,它本身是很简洁的,不过这种简洁并不代表简单,js的设计者本身并不喜欢c,c++和java这种静态类型的语言,相反,布兰登艾奇受到self语言和scheme语言的启发,给js增加了一些高级特性,这些高级特性一般用于高级程序开发人员的极客技巧,一般的开发虽然用不上,不过在某些特定情况下,它会起到非常关键的作用,js的卓越在于它把函数作为一等公民,支持闭包,可以直接定义对象字面量,这意味着它能非常容易地实现动态绑定,对象自省,这将省略大量的代码,而且使得逻辑的封装性非常高,抽象程度达到DSL语言的级别,使用函数式技巧,灵活运用闭包,可以构建真正属于自己的面向对象世界。


符号进化


(抛开,类库、框架、应用程序的规模 等 因素,小石头 仅仅 就语言本身的特性 来回答这个问题。)

从纯语言上来看 JavaScript 比 Java 难度大。

从语言历史看

早在计算机出现之前,逻辑学家伙同数学家,就对 “计算”进行的深入的研究,直到哥德尔 时期 出现的 《递归论》为“计算”奠定了 坚实的理论基础。 之后,关键人物:丘奇 登场,他在递归论的基础上创立的 λ-演算系统——这是,第一个被广泛使用的计算系统。 再之后,数学天才 图灵 登场,他 在师从 丘奇 期间,又创立了 图灵机——这是,另一个被广泛使用的计算系统。再再后来,他俩合作证明了 两个计算系统的 等价性。至此,历史时间为 1936年,数学已经为 计算机的诞生,建立了完整的 理论基础。

1946年,大神,冯诺依曼,以图灵机为理论依据,提出了 冯诺依曼体系结构,并且世界上第一台计算机 ENIAC 诞生。1956年,第一个高级语言——Fortran语言,在 巴克斯 开发下 正式诞生,将高级语言编译为机器指令的 模式 从此确立。之后 高级语言,经历了 从 面向命令 → 面向过程 → 面向对象 的演变,直到 C++ 完全成熟。1995年,Java在吸收了 C++语言特性之后,第一次将 程序运行在了 JVM(Java虚拟机)之上。从 现实的 ENIAC 到模拟的 JVM,它们从来没有 离开 图灵机的指引。而不管是不是正规的科班出身,全世界计算机教育的主流都是 冯诺依曼体系结构。因此,Java语言的学习者 从 机器指令切换到 字节码,并不困难,大家很容易 接受 Java 的体系原理。于此同时,面向对象 更是符合人类的思维方式,这使得 Java 跟容易 广泛传播。

阶段性总结:Java = 面向对象 + 图灵机。

图灵机 普照计算机界的时候,λ-演算系统 并没有退出舞台。仅仅比 Fortran 晚 2 年,1958年 麦卡锡 在 λ-演算 的基础上,创立了 Lisp 语言。 Lisp 从一开始就是就有 数据和程序的一致性:符号表达式。于是Lisp自己可以生成自己,这就是 宏。每个Lisper 都可以利用 宏 建立 自己的 方言。时间推进到 1975 年,Lisp 方言,已经相当 混乱,而且 毫无约束的 宏 恣意妄为,于是 MIT 开发出了 方言 Scheme 已经 卫生的宏,并一直以 其为 教学语言,直到 2008年 被 Python 取代。1995年,受雇于 网景公司的 艾克 在研发 一种运行于 浏览器 上的 脚本语言。艾克 原本希望以 Scheme 为蓝本,他的目的是 将 Scheme 办到 浏览器上。然而,1996 年 Java 的成功,以及 Sun 和 网景 的 达成的合作关系,使得,公司高层施压 艾克 让脚本 以 Java为模板,并将 语言命名为 JavaScript。原本雄心勃勃的 艾克 心灰意冷,用了短短 1个星期多时间,草草在已有的 Scheme 研究基础上,包了一个 Java 的语法壳,交给公司 完事。很难想象,一个 语言开发者,对自己的“孩子”如此不满,但 这对 艾克 是事实。JavaScript 这个先天发育不全的早产儿,经过后来无数程序员的共同努力,才在 ES6(ES2015) 趋于完善。

阶段性总结:JavaScript = Scheme 内核(λ-演算系统) + Self 面向对象机制 + Java 语法。

从语言的诞生历史来看,JavaScript 就比 Java 屈折和复杂。

从语言特性看

接下来进行具体语言特性的分析比较。

  • 面向对象:面向对象就是将 数据和过程 封装成 类,类 作为 对象的 模板使用,类之间通过继承复用,通过 多态 特化。

Java 使用了 和 早期 C/C++类似的面向对象实现,不过取消了多继承,并升级提供了对象管理 和 反射机制,这使得 Java 非常容易学习和使用。直到后来,才陆续加入,特性 、泛型 和 λ-表达式。这仅仅稍微增加了 Java 的难度。

JavaScript 使用了 Self 的 原型模式,实现面向对象。它的类等价于 对象工厂(构造函数),对象工厂 利用模板(原型)来创建 对象。对象在特化(多态)时仅仅改变自己,不改变公用模板。一系列模板(原型链) 构成复用(继承)关系。在 ES6 之前,以上面为基础,包装出 类似 Java 的面向对象 语法,都是不容易的。好在 ES6 提供了 class 语法糖。

  • 语法结构:Scheme 语言以 广义列表 为 本身的 语法结构,叫做 符号表达式,它 同时是 数据也是代码。例如:

(+ 1 (* 3 4))

可以看成 三个元素 的列表:+, 1, (* 3 4),其中 第三个 元素 又是一个 子列表:*, 3, 4,这个广义列表,如果被运行就是 代码,否则就是 数据。

JavaScript 和 Java 的语法同源,于是 它们都不能,做到 Scheme 的 符号表达式 的高度统一。

先说代码结构。它们将 代码分为:语句 和 表达式 两类。表达式 可以 互相嵌套,但是 表达不能 直接嵌套 语句,必须通过 函数的包装。但毕竟 JavaScript 的内核是 Scheme,因此 在表达式上留有后门:

在 JavaScript 中,可以通过 表达式 达成 语句的效果,这并不奇怪。(虽然 Java 在引入 λ-表达式 后也可以这样做,但这不是 语言原始的,Java 程序员不需要了解。)

再说对象结构。Java 语言的对象结构是黑盒的,静态的,程序员不需要关心。JavaScript 用 散列表代替了 Scheme的 广义列表,作为自己的 对象结构。可以通过 Json 语法创建,. 表达式 读写,for-in 语句浏览, delete 来删除 这些 键值对(属性-属性值),同时还有 属性访问的约束(Java也有)。

  • 函数:Scheme 中函数就是 λ-表达式 的运行结果,它和 数字、符号、字符/字符串 并无区别。

JavaScript 的函数 传承了 Scheme 这一特点,其本身也是对象的一种(特殊对象),而 Java 的函数(方法)就是函数,不能当做对象操作,后来引入的 λ-表达式 才有了前面的特性。

函数对象的引入,使得 在函数中 定义 函数 成了 JavaScript 的家常便饭,这使得理解作用域 和 闭包 成了萌新 的学习难点。

另外,在对象属性调用时,this指针也是 作用域嵌套的一部分。早期 由于 function 不绑定 定义域 内的 this 指针,这带来了很多麻烦(不得不自己用 Object.bind 绑定),ES6 的箭头函数解决了这个问题。

函数对象的另一优势就是 高阶函数(比如:map、reduce、filter、... )的 广泛应用,这部分也需呀一定的学习成本。

  • 泛型:JavaScript 本事就是弱语言,因此其函数对参数来说,就是泛型,可是实现不一定可以支持。Java 有强大的类型系统,可以提供安全的 泛型机制。在这部分 Java 会比 JavaScript 难一些,但还好,Java 没有 C/C++ 基于模板的 泛型机制那么复杂(比如:偏特化)。

以上是语言层面的简单分析,基本上可以得出 JavaScript 的语言复杂程度 远高于 Java。

从使用维护看

Java 是多线程语言,JavaScript 是单线程语言,当他们用于 服务端时,后者的异步很容易出现 嵌套地域。这个问题到 ES2017 才得到解决。

Java是强类型语言,编译器可以帮助我们找到很多Bug,而 JavaScript 是弱类型语言,很多Bug 必须到运行时才 显现,这时的 JavaScript 的调试难度 也 高于 Java。也是因为这样的原因,才出现了 TypeScript 这类语言。(当然,另一面,为了弥补 Java 函数特性不足,也出现了 Scala 这类语言。)

另外,JVM 的 Debug 方便程度 也高于 Chrome。


思考思考的动物


前言

关于Java和JavaScript两种语言,我都有接触过。所以谈一谈我对这两种语言使用的一些感受,希望对小伙伴们有一定的帮助和借鉴意义。


Java

Java是一种强类型的面向对象的编程语言,Java可以很好地对现实世界的各种事物之间的关系进行描述并建模,从而实现你想要的软件模型。通常在中大型软件中,用Java这种面向对象的编程语言就能很好地帮你理清事物之间的逻辑关系。

目前Java的应用领域主要集中在Android开发和后端开发。其中Android开发就是开发Android版的APP,比如我们使用的Android版的今日头条。Java后端开发则主要是和数据库打交道,并面向前端提供数据的支撑。


JavaScript

javaScript虽然和Java只有Script之差,但两者是两种截然不同的编程语言。JavaScript是一种非常灵活的编程语言,其主要有ECMAScript + BOM + DOM 三部分组成。

其中ECMAScript部分在设计之初就存在着一些诟病,导致现在除了有ES5的语法之外,还新增了ES6语法。所以对于新手而言,除了要掌握ES5语法,还需要了解ES6以及将来的ES7的语法,才能更好地掌握ECMAScript的使用。

对于BOM和DOM部分,由于不同浏览器对其支持度不一致,导致了你也需要了解每种浏览器的兼容性是怎样的,才能更好地去使用JavaScript的BOM和DOM语法。所以这就进一步增加了学习这门语言的复杂度。

通常JavaScript语言的使用主要集中在Web前端。也就是通过JavaScript语言,你就可以实现web页面各种交互的效果。


总结

就上述分析,个人认为Java语言设计是完美并且好用的,很好地贴合了现实世界各种事物之间的关系。而JavaScript相对灵活但较难以使用,至今仍处在较大的迭代之中,但由于其在Web端具有不可替代的作用,所以至今仍无法撼动。


如果你觉得文章不错或者对你有帮助,欢迎点赞转发。关注我,分享好玩科技,探索未知世界!


drinkingcode


就语言本身而言,Java更难,有些人觉得Java简单一个原因是因为ide掩盖了Java的书写难度,还有个原因是Java的各种框架非常成熟,解决了工作中遇到的大部分难题。

其实不谈业务,个人认为掌握JavaScript和python的难易程度差不多,如果谈复杂,都是业务带来的,大家都半斤八两,就像人工智能这个领域,你能说python简单吗,不熟悉算法,其实也完全看不懂别人在写些啥。


菜鸟猿


VBA比javascript更难,只有汇编最简单,没有框架,也没类、对象,没有线程、虚拟机……,更没有模板、泛型


木易145698188


看到题目,情不自禁想起了一个有趣的问答:

问:Java和JavaScript是什么关系?答:雷锋和雷峰塔的关系

是的,当年为了自身发展,巧借Java名声,取名为Javascript。如今JavaScript名声鹊起,喊出了“能用JavaScript写的,最终都要用JavaScript写”的壮志豪言。


会者不难,难者不会,当你能深刻理解两者语言的异同时,剩下的就变得简单了。


下面简单梳理一下两者异同:

当年面试我的公司CTO就问我,“你觉得Java和JavaScript两种开发语言的最大区别是什么?”

我当时从两者语法方面进行了分析,显然很业余,实际上两者最大的区别时:Java是同步思想占主导的开发语言,大部分代码是一行一行的往下执行;而JavaScript是异步思想占主导的开发语言,从一些原生的方法中就能看出,例如setTimeout(),setInterval()。


程序员小宁


7年经验全栈

这两款语言要对比的话

js 最基础的语法就那点东西 还特简单 然后是出了es语法一代又一代 但是其实越来越靠近面向对象 而不是简单的脚本语言了

但是还是很简单

java 有两个大方向

后台

那其实java很简单 或者说特别简单 甚至你都不需要学 只要有人给你搭好架构 然后稍微讲解一下怎么用 就能干活了 出严重bug的情况基本不会有

安卓

刚入门 那很简单 胡编乱造都能写 但是你要开始优化的时候你就会发现 这比一切都难 原本只是简单的写法 会内存溢出 而你不得不使劲的改 甚至完全重构才能解决 你会发现很多写法都有问题


分享到:


相關文章: