当时和现在:为何 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,这一点没有改变过。目前还没有能与之相比的其他浏览器兼容脚本语言。
当前,尽管 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 的交互式环境。
想要了解 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 的基元类型是 Number
、String
、和 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 中的 Array
s 更像其他语言中的列表:可不必限制大小来进行创建,可以保存任何您输入的内容。比如在 Ruby 或者 Groovy 中,JavaScript Array
s 可通过文字语法来创建:[]
。更重要的是,就像在其他支持列表的语言一样,希望在 JavaScript Array
s 支持方法(如清单 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
的位置来获取其值,从零开始。Array
s 支持push
和 pop
操作,其中 push
增加项目(在其最后一个位置)而 pop
移除项目(就像堆栈,从最后一个开始)。
Array
s 还支持迭代,如清单 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 中函数作为对象
在本例中,错误消息说明 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
函数 — 带有一个名字和几个属性的对象;即,to
、from
、和 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 有一定理解,将会使您成为任何语言领域(包括您最熟悉的语言)的一名优秀的程序员。
分享到:
相关推荐
1. 来源和目的:JavaScript由Netscape开发,主要用于Web交互;Java由Sun Microsystems开发,用途广泛,包括Web应用、桌面应用等。 2. 面向对象特性:JavaScript是基于对象,而Java是真正的面向对象语言。 3. 嵌入...
Java是一种广泛使用的面向对象的编程语言,常用于开发服务器端应用程序。它以其跨平台性、稳定性和高效性能而闻名。在Web开发中,Java经常被用来创建后端服务,处理业务逻辑和数据库交互。 JavaScript,另一方面,...
《Java Web 整合开发 王者归来》是由知名IT专家刘京华撰写的一本专业书籍,专注于讲解如何在Java平台上进行Web应用的高效整合开发。这本书的源码提供了丰富的实例,帮助读者深入理解并实践书中所讲述的技术。通过...
笔记内容来源于4月18日的五天Java训练营,由多位知名讲师主讲,如刘英谦、刘苍松和范传奇老师。 一、Java技术基础 1.1 编程语言 编程语言是人与计算机进行沟通的工具,Java作为一种面向对象的编程语言,以其“一次...
1. 来源:JavaScript由Netscape开发,Java由SUN公司推出。 2. 面向对象:Java是严格的面向对象语言,JavaScript则是基于对象的语言。 3. 执行方式:Java代码需要先编译成字节码,JavaScript代码则直接解释执行。 4. ...
- **起源**:Java最初由Sun Microsystems开发,其名称来源于印度尼西亚的一个岛屿,该岛屿以其咖啡闻名。 - **发展史**: - **1991年**:由Patrick Naughton领导的团队开始研发一种适用于有线电视顶盒的小型计算...
数据可能来源于API接口或本地数据库。 8. **查询功能**:用户可以通过输入关键词,如品牌、型号等,进行汽车信息的检索。这涉及到SQL查询语句的编写和执行。 9. **分页和排序**:为了提高用户体验,查询结果可能...
"基于JAVA开发的模仿爱卡汽车商店小程序"这个标题表明这是一个使用Java编程语言开发的小型应用程序,其设计灵感来源于爱卡汽车商店。爱卡汽车是一家知名的汽车行业平台,提供汽车资讯、车型数据以及相关的服务。这里...
JavaScript是一种广泛应用于网页和网络应用的脚本语言,主要由网景公司的Brendan Eich在1995年开发,起初命名为LiveScript。后来,为了与Sun Microsystems的Java进行品牌联结,它被更名为JavaScript,尽管两者在技术...
JavaScript的设计灵感来源于Java、Self和Scheme,它支持面向对象、命令式和函数式编程风格。本书深入讲解了JavaScript的基本语法、数据类型、控制结构、函数和对象模型,为读者构建了一个坚实的编程基础。 #### ...
例如,Java的静态类型系统强调在编译时捕获错误,而JavaScript的动态类型则更注重快速迭代和开发效率。Java的面向对象设计模式在大型项目中展现出强大的组织和维护能力,但学习Haskell和Groovy的函数式和动态特性,...
压缩包名为`WebStack-Guns-NKT-master`,暗示项目可能来源于GitHub等版本控制系统,如Git。Git是进行团队协作和版本管理的重要工具,理解其基本命令和工作流对于开发者至关重要。 8. **项目构建工具**: Maven或...
"Space Invade Java Game"是一款基于Java编程语言开发的小型游戏,它可能是一个经典的游戏复刻版,灵感来源于1978年的街机游戏《太空侵略者》(Space Invaders)。这款游戏展示了Java在游戏开发中的应用,特别是对于...
1. **来源不同**:Java由SUN公司开发,而JavaScript来自Netscape公司。 2. **面向对象**:Java是严格的面向对象语言,而JavaScript是基于对象的,虽有面向对象特性,但不强制使用。 3. **执行方式**:Java代码需要...
在Java技术栈中,该系统可能采用了MVC(Model-View-Controller)设计模式,这是一种广泛应用于Web应用开发的经典架构,能够有效地分离业务逻辑、数据模型和用户界面。Model层负责数据处理,View层负责展示,...
这些文件名如"51CTO下载-Java Web整合开发王者归来.part16.rar"等,暗示了该资源可能来源于51CTO网站,并且是关于“Java Web整合开发”的深入学习资料。 Java Web开发是Java技术在互联网领域的应用,它涵盖了Web...
根据提供的文件信息,我们可以推断出这是一份关于使用Java编程语言开发的“火影忍者”游戏的源代码。接下来,我们将详细分析并总结出与该标题、描述及部分内容相关的知识点。 ### Java编程语言 Java是一种广泛使用...
JavaScript的设计灵感来源于Java,但它的语法更为简化,无需预编译,可以直接在浏览器环境中解释执行,极大地提升了网页的交互性和动态效果。 JavaScript的特点包括: 1. 脚本语言:JavaScript的语法相对宽松,不...
它的语法结构来源于Java,同时也受到了Self(一种基于原型的面向对象编程语言)和Scheme(一种函数式编程语言)的影响。JavaScript支持面向对象编程,但与传统的基于类的面向对象编程不同,JavaScript中对象是通过...