`

面向 Java 开发人员的 JavaScript【来源于网络】

 
阅读更多

当时和现在:为何 JavaScript 很重要

Netscape 于 1995 年引入了 JavaScript,它很快就流行起来了。最主要的原因是 Web 作为商业媒体平台的出现:使用 JavaScript,您(依然)可以通过编程来影响浏览器中 Web 页面的特性。那这是个很棒的工具!HTML 表单验证与受限图片欺骗(limited image trickery)是主题。

自那时起 JavaScript 就具有多个化身。Netscape 曾一度拥有一个产品,Netscape Application Server,它正是基于服务器端 JavaScript 来构建的 Web 应用程序。多年以后,由于 Ajax 和 Prototype、JQuery、和 Extjs 之类部件库的引入,重新引起了人们对 JavaScript 的兴趣。最近,服务器端 JavaScript 被用于 Node.js 当中,这是利用 Google's V8 JavaScript 引擎构建服务器端 Web 应用程序的基于事件的 I/O 框架。

Netscape 做了一件很有前瞻性的事,就是把 JavaScript 提交到 Ecma International 来进行标准化。这就是人们称 JavaScript 为 ECMAScript 的原因。更重要的是,这也是众多 Web 浏览器支持 ECMAScript 的原因。因此,Web 应用程序大都会采用 JavaScript,这一点没有改变过。目前还没有能与之相比的其他浏览器兼容脚本语言。

Node.js

Node.js(见 参考资料Resources)是服务器端、高并发、基于事件的框架。在处理大量有关并发编程的问题时,Node.js 程序比具有线程的程序效率更高。Node.js 相对比较新,围绕该技术的创新令人期待。了解 JavaScript 是使用 Node.js 相关工具的关键。

当前,尽管 JavaScript 的名声不好,它仍然是应用最广(最有用)的语言之一。如果您是位 Java 程序员(或者 Ruby、Python、或 PHP 程序员),那么您可能曾用过 JavaScript ,或者在不久的将来会使用 JavaScript。了解 JavaScript 的一些特性,有助于构建优秀的 Web 应用程序。此外,这有助于使用 Node.js,甚至还能增强您对 GWT 内部技术的了解。

在下一小节中,我将关注 JavaScript 语法的主要元素,重点介绍一些细节内容,这将有助于 Java 开发人员的提高。然而,我首先想打破一个关于 JavaScript 的神话:就是您需要一个 Web 页面来与其交互。

 

在 Chrome 中使用 JavaScript

在过去,JavaScript 需要浏览器,并间接地需要一个 Web 页面来执行。这对于一些开发人员来说是个麻烦,甚至是个障碍。幸运的是浏览器已经发展了;今天不论 Firefox 还是 Chrome 都提供了用于执行 JavaScript 的 IDE。

我喜欢 Chrome 漂亮的 JavaScript 控制台。就像 Ruby's IRB 或者 Python's shell,Chrome 提供不需要 Web 页面的用于浏览 JavaScript 的交互式环境。

CoffeeScript

如果您喜欢 JavaScript 的功能,但不喜欢它的语法,那么您可以尝试一下 CoffeeScript。CoffeeScript 是 “编译成 JavaScript 的小型语言” — 也就是说,CoffeeScript 通过简化 JavaScript 的一些语法,使 JavaScript 编程更加方便。CoffeeScript 更像 Ruby 或者 Python,但能提供 JavaScript 的效果。见 参考资料 中 CoffeeScript 的相关内容。

想要了解 Chrome's JavaScript 控制台,需要 下载用于您 OS 中的 Chrome。然后,打开一个新的空白标签(也就是说,不要指向 Web 页面)并选择 View > Developer > JavaScript Console。在 Chrome 窗口的底部,会弹出 JavaScript 开发人员控制台。可通过选择控制台左下角的 Undock 图标来使其成为独立对话框。然后可选择右上角的 Console 图标,来打开用于和 JavaScript 交互的空白窗口,如图 1 所示:


图 1. 在 Google Chrome 中与 JavaScript 交互

.
现在来看一些语法。


JavaScript 变量

JavaScript 是一个比较容易使用的语言,它能容忍很多编程错误,并仍然能在加载的 Web 页中执行。JavaScript 元素经常没有任何提示就失败了,这大部分都是好消息。如果 JavaScript 语言草率地禁止页面加载,那么早期的 Web 将是一片混乱。也就是说,当我们利用 JavaScript 来做我们喜欢做的事时(比如异步更新页面状态),草率使用 JavaScript 将付出代价。由于这个原因,Java 开发人员应该花时间真正了解 JavaScript 语法的特定方面。

JavaScript 变量的处理对理解来说很重要。例如,您想定义一个变量 foo,可以直接定义或者通过 var 声明,如清单 1 所示:


清单 1. 变量 foo

				
foo = 'foo'
var bar = 'bar'

清单 1 中的 foo 是 JavaScript 中的有效变量。但它缺少 var 声明,这是个全局变量。因此利用 var 定义的变量是有范围的(例如,在定义它的函数中)。

通常,全局变量比较麻烦。它们很容易造成变量使用的混乱,因为全局变量可在 JavaScript 应用程序中的任何地方进行访问和改变,这将导致潜在 bug。因此,当在 JavaScript 中编程时,不要忘了对变量应用 var


基元和对象

尽管 JavaScript 不够完善,但在类型方面十分简单。事实上,JavaScript 仅有 4 个基本类型,其中三个是基元。JavaScript 的基元类型是 NumberString、和 Boolean。您可通过 JavaScript typeof 运算符来在操作中查看这些类型。

我们来一起看一下该问题。在 Chrome's JavaScript 中,输入清单 2 中的内容:


清单 2. Activating types

				
var string = "test"
typeof string

可以看到控制台输出值 “string”。还要注意在 JavaScript 中分号是可选的。正如在流行的语言当中一样,string 通过引号来划定;因此,数字通过数字来划定。Booleans 通过值 true 或者 false 来划定,没有分号。


清单 3. JavaScript truth 与 numbers

				
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 中的 Arrays 更像其他语言中的列表:可不必限制大小来进行创建,可以保存任何您输入的内容。比如在 Ruby 或者 Groovy 中,JavaScript Arrays 可通过文字语法来创建:[]。更重要的是,就像在其他支持列表的语言一样,希望在 JavaScript Arrays 支持方法(如清单 5 所示):


清单 5. Array 方法

				
> 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 的位置来获取其值,从零开始。Arrays 支持pushpop 操作,其中 push 增加项目(在其最后一个位置)而 pop 移除项目(就像堆栈,从最后一个开始)。

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


清单 6. 通过 Array 迭代

				
> var myArray = [1,2]
> for(var i = 0; i < myArray.length; i++) { console.log(myArray[i]) }
1
2

类型强制

JavaScript 不仅是一个弱类型的语言 — 它比 Ruby 或者 Groovy 更弱 !JavaScript 可强制变量在代码的特定位置为任何类型。这符合 JavaScript 最初设想:Web 页面交互。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

如果尝试向 array 增加 "A",情况将是:

 

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 中,定义了一个没有参数的简单函数。其目的是在 Chrome 的 JavaScript 控制台中打印 “blah”。


清单 9. 在 JavaScript 中定义并调用函数

				
> function blah() { console.log("blah"); }
> blah() //prints blah
> blah.call() //prints blah
> blah.apply() //prints blah

可通过方法 call 或者方法 apply 直接调用有括号(也就是 ())的函数。在这里展示了首个无类函数对象。清单 10 展示了在函数 blah 中调用 garbage 方法时的情形:


清单 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 函数 — 带有一个名字和几个属性的对象;即,tofrom、和 msg。然后我定义了一个属性(asJSON)指向内部函数,其任务是将 JSON 消息用字符串表示。

注意,还可在 Web 页面中定义该 “类”,利用 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 有一定理解,将会使您成为任何语言领域(包括您最熟悉的语言)的一名优秀的程序员。

 

分享到:
评论

相关推荐

    JavaScript语言

    1. 来源和目的:JavaScript由Netscape开发,主要用于Web交互;Java由Sun Microsystems开发,用途广泛,包括Web应用、桌面应用等。 2. 面向对象特性:JavaScript是基于对象,而Java是真正的面向对象语言。 3. 嵌入...

    road-big-city_java_javascript_jsp_

    Java是一种广泛使用的面向对象的编程语言,常用于开发服务器端应用程序。它以其跨平台性、稳定性和高效性能而闻名。在Web开发中,Java经常被用来创建后端服务,处理业务逻辑和数据库交互。 JavaScript,另一方面,...

    Java Web 整合开发 王者归来 (刘京华) 光盘源码

    《Java Web 整合开发 王者归来》是由知名IT专家刘京华撰写的一本专业书籍,专注于讲解如何在Java平台上进行Web应用的高效整合开发。这本书的源码提供了丰富的实例,帮助读者深入理解并实践书中所讲述的技术。通过...

    Java相关课程系列笔记之一Java学习笔记.doc

    笔记内容来源于4月18日的五天Java训练营,由多位知名讲师主讲,如刘英谦、刘苍松和范传奇老师。 一、Java技术基础 1.1 编程语言 编程语言是人与计算机进行沟通的工具,Java作为一种面向对象的编程语言,以其“一次...

    javascript的资源教程。ppt版

    1. 来源:JavaScript由Netscape开发,Java由SUN公司推出。 2. 面向对象:Java是严格的面向对象语言,JavaScript则是基于对象的语言。 3. 执行方式:Java代码需要先编译成字节码,JavaScript代码则直接解释执行。 4. ...

    java实战pdf文档

    - **起源**:Java最初由Sun Microsystems开发,其名称来源于印度尼西亚的一个岛屿,该岛屿以其咖啡闻名。 - **发展史**: - **1991年**:由Patrick Naughton领导的团队开始研发一种适用于有线电视顶盒的小型计算...

    基于java开发的汽车查询(类似于汽车之家)小程序

    数据可能来源于API接口或本地数据库。 8. **查询功能**:用户可以通过输入关键词,如品牌、型号等,进行汽车信息的检索。这涉及到SQL查询语句的编写和执行。 9. **分页和排序**:为了提高用户体验,查询结果可能...

    基于JAVA开发的模仿爱卡汽车商店小程序

    "基于JAVA开发的模仿爱卡汽车商店小程序"这个标题表明这是一个使用Java编程语言开发的小型应用程序,其设计灵感来源于爱卡汽车商店。爱卡汽车是一家知名的汽车行业平台,提供汽车资讯、车型数据以及相关的服务。这里...

    个人收集JavaScript源代码集

    JavaScript是一种广泛应用于网页和网络应用的脚本语言,主要由网景公司的Brendan Eich在1995年开发,起初命名为LiveScript。后来,为了与Sun Microsystems的Java进行品牌联结,它被更名为JavaScript,尽管两者在技术...

    JavaScript Programming

    JavaScript的设计灵感来源于Java、Self和Scheme,它支持面向对象、命令式和函数式编程风格。本书深入讲解了JavaScript的基本语法、数据类型、控制结构、函数和对象模型,为读者构建了一个坚实的编程基础。 #### ...

    从Java和JavaScript来学习Haskell和Groovy_.docx

    例如,Java的静态类型系统强调在编译时捕获错误,而JavaScript的动态类型则更注重快速迭代和开发效率。Java的面向对象设计模式在大型项目中展现出强大的组织和维护能力,但学习Haskell和Groovy的函数式和动态特性,...

    基于java开发的开源网址导航网站项目.zip

    压缩包名为`WebStack-Guns-NKT-master`,暗示项目可能来源于GitHub等版本控制系统,如Git。Git是进行团队协作和版本管理的重要工具,理解其基本命令和工作流对于开发者至关重要。 8. **项目构建工具**: Maven或...

    Space Invade Java Game

    "Space Invade Java Game"是一款基于Java编程语言开发的小型游戏,它可能是一个经典的游戏复刻版,灵感来源于1978年的街机游戏《太空侵略者》(Space Invaders)。这款游戏展示了Java在游戏开发中的应用,特别是对于...

    JavaScript教程

    1. **来源不同**:Java由SUN公司开发,而JavaScript来自Netscape公司。 2. **面向对象**:Java是严格的面向对象语言,而JavaScript是基于对象的,虽有面向对象特性,但不强制使用。 3. **执行方式**:Java代码需要...

    基于Java开发的家庭财务管理系统源码

    在Java技术栈中,该系统可能采用了MVC(Model-View-Controller)设计模式,这是一种广泛应用于Web应用开发的经典架构,能够有效地分离业务逻辑、数据模型和用户界面。Model层负责数据处理,View层负责展示,...

    java web4.zip

    这些文件名如"51CTO下载-Java Web整合开发王者归来.part16.rar"等,暗示了该资源可能来源于51CTO网站,并且是关于“Java Web整合开发”的深入学习资料。 Java Web开发是Java技术在互联网领域的应用,它涵盖了Web...

    JAVA源码Java火影忍者游戏源代码

    根据提供的文件信息,我们可以推断出这是一份关于使用Java编程语言开发的“火影忍者”游戏的源代码。接下来,我们将详细分析并总结出与该标题、描述及部分内容相关的知识点。 ### Java编程语言 Java是一种广泛使用...

    JavaScript培训

    JavaScript的设计灵感来源于Java,但它的语法更为简化,无需预编译,可以直接在浏览器环境中解释执行,极大地提升了网页的交互性和动态效果。 JavaScript的特点包括: 1. 脚本语言:JavaScript的语法相对宽松,不...

    JavaScript 简易教程

    它的语法结构来源于Java,同时也受到了Self(一种基于原型的面向对象编程语言)和Scheme(一种函数式编程语言)的影响。JavaScript支持面向对象编程,但与传统的基于类的面向对象编程不同,JavaScript中对象是通过...

Global site tag (gtag.js) - Google Analytics