早在Java平台的早期,对于新闻记者,甚至是新手程序员,混淆JavaScript和Java语言并不罕见。 毕竟,由于这两种语言都适用于Web编程,因此得到了普及,并且几年来,它们在流行的想象中并驾齐驱。 如今,大多数人将这两种语言区分开来,但是Java开发人员仍然普遍认为JavaScript是一种玩具语言,甚至不适合脚本编写。 事实是,JavaScript(很像Java语言)已经存在,甚至还在发展。 它是Ajax这样的客户端编程技术和Node.js这样的服务器端编程的基础,它对于移动应用程序开发的重要性正在逐渐显现。 它也是Java代码在非常流行的Google Web Toolkit(即GWT)中编译的语言。

在Java开发2.0的这一部分中,我将解释为什么JavaScript对当今的Java开发人员很重要,并逐步介绍一些最有用JavaScript语法,解释它与Java语言的不同之处,并与Groovy和Ruby等更现代的动态语言进行对比。

关于本系列

自从Java技术首次出现以来,Java开发环境发生了根本变化。 得益于成熟的开源框架和可靠的租用部署基础架构,现在可以快速,廉价地组装,测试,运行和维护Java应用程序。 在本系列中 ,Andrew Glover探索了使这种新的Java开发范例成为可能的技术和工具的范围。

过去和现在:为什么JavaScript很重要

JavaScript由Netscape于1995年推出,并Swift普及。 原因与网络作为商业媒体平台的兴起有很大关系:有了JavaScript,您可以而且仍然可以以编程方式影响浏览器中的网页行为。 那真是太酷了! HTML表单验证和有限的图像欺骗是游戏的名称。

从那时起,JavaScript有了一些变身。 Netscape曾经有一种产品Netscape Application Server,它依靠服务器端JavaScript来构建Web应用程序。 几年后,由于引入了Ajax和诸如Prototype,JQuery和Extjs之类的小部件库,引起了人们对JavaScript的新兴趣。 最近,服务器端JavaScript已与Node.js全面融合,Node.js是基于事件的I / O框架,可使用Google的V8 JavaScript引擎构建服务器端Web应用程序。

Netscape通过将JavaScript提交给Ecma International进行标准化,在时间上做了一些颇具前瞻性的事情。 这就是为什么有人将JavaScript称为ECMAScript的原因。 更重要的是,这就是为什么大多数Web浏览器都支持ECMAScript的原因。 结果,Web应用程序被迫不使用JavaScript,这似乎很难改变。 当前没有其他浏览器兼容的脚本语言出现。

Node.js

Node.js的(见相关信息 )是服务器端,高并发,基于事件的框架。 Node.js程序的伸缩性比带有线程的程序更有效,同时解决了与并行编程相关的许多问题。 尽管Node.js相对较新,但围绕它的创新却非常令人兴奋。 了解JavaScript是访问与Node.js关联的工具系列的关键。

如今,尽管JavaScript声誉一直徘徊不前,但可以说JavaScript是地球上使用最广泛(也是最有用)的语言之一。 如果您是Java程序员(或Ruby,Python或PHP程序员),则很可能您过去曾经使用JavaScript,或者不久之后会使用。 了解JavaScript的某些功能可以帮助您构建下一个超级受欢迎的Web应用程序。 此外,它将使您能够利用Node.js,甚至可以更好地了解GWT幕后的情况。

在下一节中,我将重点介绍JavaScript语法的主要元素,重点介绍那些可能使Java开发人员特别惊奇或高兴的小小的旅程。 但是,首先,我想消除JavaScript的一个普遍的神话:您需要一个网页才能与其进行交互。

在Chrome中使用JavaScript

从历史上看,JavaScript要执行就需要浏览器,间接需要一个网页。 对于有些开发人员来说,这很烦人,甚至是一个障碍。 幸运的是,浏览器已经发展。 如今,Firefox和Chrome都提供了用于执行JavaScript的IDE。

我喜欢Chrome的漂亮JavaScript控制台,可以用来愚弄这种语言。 与Ruby的IRB或Python的shell一样,Chrome提供了一个无需使用网页即可浏览JavaScript的交互式环境。

CoffeeScript

如果您喜欢JavaScript可以做什么,但不喜欢它的语法,则应该看看CoffeeScript。 CoffeeScript是“可编译为JavaScript的小语言”,也就是说,CoffeeScript通过放宽其某些语法,使JavaScript编程更加容易。 在许多方面,CoffeeScript感觉更像Ruby或Python,但提供了JavaScript的一对一等效性。 请参阅相关主题 ,以了解更多关于CoffeeScript的。

要开始使用ChromeJavaScript控制台,您需要下载适用于您操作系统的Chrome 。 接下来,打开一个新的空白标签(即,不要指向网页),然后选择“ 视图”>“开发人员”>“ JavaScript控制台” 。 在Chrome窗口的底部,您会看到JavaScript开发者控制台弹出。 通过选择控制台左下角的Undock图标,可以使其成为一个独立的对话框。 然后,您可以在对话框的右上角选择“控制台”图标,以进入一个简单的空白窗口以与JavaScript进行交互,如图1所示:

图1.与Google Chrome中JavaScript交互

现在让我们看一些语法。

JavaScript变数

JavaScript是一种相当随和的语言,它使您可以犯很多编程错误,并且仍然会加载网页。 JavaScript元素通常会静默失败,这主要是个好消息。 如果草率JavaScript编程禁止页面加载,那么早期的Web将会是一个粗糙的地方。 就是说,由于我们依靠JavaScript进行更出色的工作(例如异步更新页面状态),所以粗心JavaScript确实会付出巨大的代价。 出于这个原因,Java开发人员应该花时间真正地理解JavaScript语法的某些方面。

了解JavaScript对变量的处理特别重要。 例如,您可以直接或通过var声明定义一个名为foo的变量,如清单1所示:

清单1.变量foo
foo = 'foo'
var bar = 'bar'

清单1中的foo是JavaScript中的有效变量。 但是因为它缺少var声明,所以它是一个全局变量。 因此,用var定义的变量的作用域是有限的(例如,在定义它们的函数中)。

通常,全局变量是错误的。 它们通常会散发出代码异味 ,这意味着由于可以在JavaScript应用程序中的任何位置访问和更改它们,因此使用它们会导致隐患。 因此,当您使用JavaScript进行编程时,请不要忘记将var与变量一起使用。

原始对象

尽管JavaScript并非一成不变,但在类型方面却非常简单。 实际上,JavaScript实际上只有四种基本类型,其中三种是基本类型。 JavaScript的原始类型为NumberStringBoolean 。 您可以通过JavaScript方便的typeof运算符查看这些类型的运行情况。

让我们一起尝试一下。 在ChromeJavaScript控制台中,输入清单2所示的内容:

清单2.激活类型
var string = "test"
typeof string

您应该看到控制台打印出值“ string 。 您还将注意到,分号在JavaScript中是可选的。 与大多数流行语言一样, string用引号引起来; 因此,数字用数字来描绘。 布尔值由值true或false表示 ,不带引号。

清单3. JavaScript的真相和数字
var aNumber = 10
var anotherNumber = 0.99
var aBool = true
var notABoolean = "false"

您会注意到,JavaScript不会区分数字类型。 数字只是数字,格式不同。

JavaScript还支持通用对象,它们本身具有实例类型,例如Array ,如清单4所示:

清单4. Array的实例
> var myArray = ["Hello", 1, true]
> typeof myArray
"object"
> myArray instanceof Array
true

JavaScript中的Array很像其他语言中的列表:可以不受大小限制地创建它们,并可以容纳要扔入其中的任何内容。 像在Ruby或Groovy中一样,可以使用文字语法[]创建JavaScript Array 。 此外,您期望其他支持列表的语言支持JavaScript Array的支持方法(如清单5所示):

清单5.数组的方法
> var myArray = ["Hello", 1, true]
> myArray[0]
"Hello"
> myArray.length
3
> myArray.pop()
true
> myArray
["Hello", 1]
> myArray.pop()
1
> myArray
["Hello"]
> myArray.push("pushed")
2
> myArray
["Hello", "pushed"]

您可以通过其位置(从零开始)获取Array的值。 Array响应pushpop ,其中push添加一个项目(在最后一个位置),而pop删除一个项目(如堆栈,从最后一个位置开始)。

Array还支持迭代,如清单6所示:

清单6.遍历数组
> var myArray = [1,2]
> for(var i = 0; i < myArray.length; i++) { console.log(myArray[i]) }
1
2

类型强制

JavaScript不仅是一种弱类型的语言, 甚至比Ruby或Groovy 更弱 ! JavaScript竭尽所能将对象强制为代码中给定点上有意义的任何类型。 在最初构思JavaScript的上下文中,这是有道理的:网页交互。 草率JavaScript不应禁止某人阅读在线文章!

类型强制不是JavaScript独有的,但是JavaScript的特定品牌非常灵活。 根据您的观点,这可能是好事,也可能是坏事。 JavaScript的松动可以隐藏缺陷,就像全局变量一样。

例如,我可以定义一个Array ,然后无意间尝试使用它执行数字操作,甚至执行一些String连接,如清单7所示:

清单7. JavaScript的类型灵活性
> var myArray = [1,2]
> console.log(2 * myArray)
> console.log("A" + myArray)

在这种情况下,第一条日志消息将显示NaN ,而第二条日志消息将显示A1,2 。 在这两种情况下,代码都“起作用”了,没有什么炸掉的-JavaScript一直在不断地被运输。 这是最弱的打字。 Ruby中的相同代码无法像清单8那样工作:

清单8. Ruby并不是那样
> array = ["A", "B"]
> ans = 2 * array

清单8中的Ruby代码将出现以下错误:

TypeError: Array
can't be coerced into Fixnum

如果我尝试将"A"添加到array ,它将产生:

TypeError: can't convert
Array into String

如果我在Groovy中尝试了相同的技巧,我将得到以下内容:

groovy.lang.MissingMethodException: No signature of method: 
java.lang.Integer.plus() is applicable for argument types: (java.util.ArrayList) values:
[[A, B]]

因此,您可以看到各种类型的弱输入在起作用。 显然,如果存在类型弱点的规模,JavaScript将是所有弱点中的最弱者!

JavaScript函数

JavaScript函数(类似于Java方法)是用于定义和封装可重用行为的构造。 乍一看,JavaScript中的函数外观与Groovy的闭包很像。 JavaScript中的函数是对象。 实际上,它们是一流的对象, 与 Java代码中的方法非常不同 。 因为JavaScript函数是对象,所以可以将它们传递给其他函数,并且可以随意调用。

函数是使用function关键字定义的。 您可以像在Java语言中的方法声明中那样指定参数,此外还可以从JavaScript函数返回某些内容。 与动态语言(例如Groovy或Ruby)不同,返回调用是可选的(因此返回任何方法的最后一行),JavaScript中的函数如果要返回内容,则必须使用return语句。 否则,他们什么也不会返回。

您可以像在Groovy中调用闭包一样在JavaScript中调用函数。 在清单9中,我定义了一个不带参数的简单函数。 其目的是将“ blah”打印到Chrome中JavaScript控制台。

清单9.在JavaScript中定义和调用一个函数
> function blah() { console.log("blah"); }
> blah() //prints blah
> blah.call() //prints blah
> blah.apply() //prints blah

您可以通过call方法或apply方法直接在括号中调用函数(即() )。 功能对象的一流性在此得到了清晰展示。 清单10显示了当我尝试在blah函数上调用垃圾方法时会发生什么:

清单10.在JavaScript中作为对象的函数
> blah.foo()

在这种情况下,您应该看到一条错误消息,说明foo不是定义的方法,如下所示:

TypeError: Object function blah() { console.log("blah"); } has no method 'foo'

现在,再次阅读该错误消息。 它抱怨foo没有定义 ,这意味着如果它被定义,事情应该有工作。

JavaScript中的类

JavaScript支持原语,我已经讨论过。 它还支持对象,例如Array 。 JavaScript不支持类-至少不支持经典Java语言。 因为JavaScript是基于原型的语言,所以您无需定义类:相反,通过克隆现有对象可以重用行为。 因此,在JavaScript中,您无需定义类对象,而是在函数中定义它们,然后使用嵌套函数来定义行为-您已经在操作中看到了这些。

要模拟一个类,可以定义一个函数。 您可以给它命名(即类名),指定参数(如在构造函数中),甚至可以使用.this关键字,这基本上意味着在函数范围内引用变量。 而且,内部函数可以使用别名来看起来像方法调用。

为了演示,在清单11中,我将创建一个非常简单的Message原型(也称为类)。 我将提供一些参数(消息来自谁,消息来自谁以及实际消息),并且该类将把我的消息表示为JSON。

清单11.在JavaScript中作为类的函数
function Message(to, from, msg){
 this.to = to;
 this.from = from;
 this.msg = msg;

 this.asJSON = function(){
  return "{'to':'" + this.to + "', 'from':'" + this.from + "', 'message':'" +
    this.msg + "'}";
 }
}

在清单11中 ,我定义了一个Message函数-一个具有名称和一些属性的对象; 即tofrommsg 。 然后,我定义了一个指向内部函数的属性( asJSON ),该函数的作用是用手阻塞我的JSON消息的字符串表示形式。

请注意,我还可以在网页中定义此“类”,将其加载到Chrome中,打开JavaScript控制台,然后以交互方式使用它。 清单12中就是这样的:

清单12.在JavaScript中使用类
> var message = new Message('Andy', 'Joe', 'Party tonight!');
> message.asJSON();
"{'to':'Andy', 'from':'Joe', 'message':'Party tonight!'}"

这段代码看起来几乎类似于Groovy甚至Java代码(如果不是var ),不是吗? 事实是,完全有可能使用OOP技术来构建JavaScript应用程序(即,包含对象的程序与数据以及相互交互的方法)。

结论

我希望本文消除了将JavaScript作为一种玩具语言的观念,这种观念早已过时。 实际上,它功能强大,并且具有很多语法功能,并且易于使用Groovy和Ruby等新语言。 如今,在90年代使JavaScript令人怀疑的某些特质被认为是可取的。

鉴于Web对许多Java应用程序开发的重要性以及JavaScript作为与浏览器兼容的语言所拥有的独特地位,每个Java程序员都应该精通JavaScript。 浏览器(无论是在计算机还是移动设备,电话或平板电脑上)是越来越多的人与应用程序进行交互的方式。 JavaScript也是所有服务器端语言之间的通用媒介。 此外,了解JavaScript的某些功能将帮助您以任何一种语言(包括您称为家的语言)成为更好的程序员。


翻译自: https://www.ibm/developerworks/java/library/j-javadev2-18/index.html

更多推荐

Java开发人员JavaScript