我为什么要自寻烦恼?Javascript是有史以来最好的语言?
对于不专业的专家来说,软件行业确实存在需求。也就是说,现在大多数软件角色都希望能够拥有“广泛的Javascript知识,特别是React,Redux和TDD [测试驱动开发]经验”的人。一些Java知识也很有用。这是现实生活。
简而言之,随着编码领域的发展,以及“服务器工作确实繁重”和“前端展示好东西”之间的界限模糊,对具有多个知识方面的开发人员的需求正在增长。他们想要能够做到这两点的人。这意味着如果你是一个对Javascript有深入了解并拥有大量技术堆栈的开发人员,你可以写入(Angular,React等)但是用Java启动Tomcat服务器的想法吓坏了你,那么你可能会很快发现自己正在努力适应并为需要“全栈”开发人员的团队贡献相当数量的价值。
大约3个月前,我专门在前端堆栈中工作,而且,或多或少完全在Javascript中。我们的应用程序有一个Angular前端和一个连接到数据库的Java服务器,这是一个相当标准的应用程序设置。我对Angular的任何知识都有广泛的了解,但是如果涉及到任务工作的任务,我立即被困住了,不得不寻求帮助。这意味着当我等待服务器更改完成时,我最终等待一段时间或者尝试切换焦点并处理其他事情。它会减慢我的速度,也会减慢我要求为我做出改变的人。
我决定解决这个问题并决定学习尽可能多的Java来开始理解服务器代码库,并在我们构建的应用程序发展过程中(略微!)对所需的更改做出贡献。在我正在构建的当前应用程序上,我一直在寻找(并参与)Java代码库,仅仅六周多。我还不是一个Java向导,但我取得了很好的进展,现在可以有效地为我们团队正在开发的整个堆栈做出贡献。
我已经列出了一些简单的建议,帮助我弥合了解Javascript和开始学习Java之间的差距。这个列表并非详尽无遗,我想有些Java纯粹主义者在阅读时会窒息,但我希望我所学到的经验可能会让其他人成为一个“全栈”开发人员变得更容易比我做的!
在Javascript中以“type类型”开头
虽然这似乎是一个相当无害的概念,但明确定义“类型”的想法(在我看来)是Java和Javascript之间最大的差异之一。那么,什么是类型?
如果我们看一个例子,我们将很快掌握什么是“类型”!
在Java中,如果将字符串定义为:
String myString = <font>"Java is great!"</font><font>; </font><font><i>// OK</i></font><font> </font>
一切正常,因为myString的类型被正确识别为String类型。
但是,我们要调用:
Boolean myString = <font>"Java is great!"</font><font>; </font><font><i>// Compiler error!</i></font><font> </font>
这将遇到问题,编译将失败。我们已经明确地将myString设置为布尔类型,但之前是将其定义为String类型。
类型本身可能很复杂。具有静态类型的语言(如Java)被称为静态类型语言,并在编译时检查类型,例如上面的示例。另一方面,具有动态类型的语言被称为动态类型语言,并且 - 至关重要 - 在运行时检查类型。
JavaScript是动态类型语言的一个示例,它采用不同的方法。它允许上下文确定正在定义的数据类型。这意味着类型仍然是Javascript中的一个东西,它们只是在引擎盖下处理。所以,在Javascript中定义:
<b>const</b> myString = 'Javascript is easier!'; <font><i>// OK</i></font><font> </font>
这将在运行时确定myString是一个String类型。静态类型语言开发人员最大的一个问题是:无法理解以下是完全有效的(如果设计非常严格)代码,它不会在运行时或编译时中断。
let result = 'Javascript is sometimes a bit daft'; <font><i>// result is type string</i></font><font> <b>if</b>(result === 'Javascript is sometimes a bit daft') { result = 10; </font><font><i>// result is type int</i></font><font> } <b>else</b> { result = <b>true</b>; </font><font><i>// result is type boolean</i></font><font> } <b>return</b> result; </font><font><i>// 10 - all compiles OK (?!)</i></font><font> </font>
显然,在像Java这样的静态类型语言中,这会引发一堆错误。长话短说:动态类型语言不要求您声明数据类型。JavaScript意味着数据类型,而像Java这样的静态类型语言直接声明它,要求您在使用它们之前声明构造的数据类型。
如果您一直在使用Javascript进行开发并且没有仔细查看您的类型但是您已经正确编码,那么这应该做些转变:逐渐习惯于在Javascript语言内部分配类型是转向静态类型语言(在我们的例子中,特别是Java)。通常有两种方法可以在Javascript代码中明确引入类型:
学会喜欢流Stream
一个优秀的Javascript开发人员可以使用的最强大的工具之一是能够在阵列上执行许多不同的操作符,采集数据源采取大而笨重地转换连接方法将结果修改为您想要的任何内容。
<b>const</b> myAwesomeArray = ['Java', 'is', 'different', 'to', 'Javascript']; myAwesomeArray .filter(entry => { <b>return</b> entry.includes('Java'); }) .map(javaEntries => { <b>return</b> javaEntries.toUpperCase(); }) .slice(-1) .reduce((acc, entry) => { <b>return</b> `${entry} is a dynamically typed language!`},''); <font><i>// JAVASCRIPT is a dynamically typed language!</i></font><font> </font>
当你开始使用Java时,你首先注意到的是有大量的Lists和Collections,而不是那么多的数组!突然间,你所有的精彩链条都毫无意义,你需要重新学习一切。不要担心!Java 8引入了流媒体的概念。它支持列表和集合的功能操作。意思突然之间,您可以通过Javascript(或至少非常相似的东西)重新使用您知道和喜爱的链接和操作符!
myAwesomeList.stream() .filter(entry -> entry.contains(<font>"Java"</font><font>) .findFirst() .ifPresent(entry -> system.Print(entry.toUpperCase() + </font><font>"is a statically typed language!"</font><font>); </font><font><i>// JAVA is a statically typed language</i></font><font> </font>
注意那些有多相似?我接受有一些小的差异,但通常有很多重叠。远远超过大多数人的期望!一切都是通过Stream()的力量实现的!
正确设置IDE
这个有点不太明显,乍一看是可以忽略的。使用JavaScript,因为事实上它的动态类型,通常有点对全局和局部变量更宽松,您使用IDE可以是些基本的记事本(我仍然不会推荐它,虽然!)为Javascript编辑的金标准(目前对我来说肯定是Visual Studio Code!)
但是,由于编译的复杂性,可以通过正确设置IDE来制作或破坏Java。我不得不建议使用IntelliJ。我目前正在使用终极版。我知道使用它需要花钱,但(对我自己来说,从Javascript学习语言)能够循环每个类和变量的选项,并查看错误和警告,因为值得花钱!
不要害怕问专家!
如果你从Javascript转向Java,不要害怕提出很多问题,这是改进的最快方法!