Facebook Twitter LinkedIn E-mail
magnify
Home 2013 五月

JavaScript 开发教程(4):字面量

字面量,原文为literals,通俗一点就是用来为变量赋值时的常数量,比如 var i=1 ,其中1 就是一个“字面量”。JavaScript中支持多种类型的字面量,本节介绍下面几种字面量类型:

数组字面量

数组字面量是一个包含有零个或多个表达式的列表,其中每个表达式代表一个数组的元素,该字面量以方括号对([])封闭。当你使用数组字面量生成一个数组时,该数组将会以给定的参数值作为它的元素进行初始化,而其长度由参数的数量决定。

下面的示例用3个元素生成数组coffees,它的长度是3。

var coffees = ["French Roast", "Colombian", "Kona"];

注意 这里的数组字面量是对象初始化器的一种。参考对象初始化器的使用

若在顶层脚本里用字面量生成数组,JavaScript语言会在每次包含该数组字面量的表达式执行时,解释一次该矩阵。另一方面,在函数中使用的矩阵,将在每次函数被调用时,相应被生成一次。

数组字面量同时也是数组对象。有关数组对象的详情请参考数组对象一文。

数组字面量中的额外的逗号

你不必列举数组字面量中的所有元素。若你在同一行中连写两个逗号(,),数组中就会产生一个“未定义”的元素,其初始值是undefined。以下示例生成了一个名为fish的矩阵:

var fish = ["Lion", , "Angel"];

这个数组中,有两个已被赋值的元素,和一个空元素(fish[0]是”Lion”,fish[1]是undefined,而fish[2]是”Angel”;译注:此时矩阵的长度属性fish.length是3)。
若你在元素列表的尾部添加了一个逗号(,),它会被忽略。在下面的例子中,该矩阵的长度是3。并不存在myList[3]这个元素,元素列表中所有其它的逗号都表示一个新元素(的开始)。

var myList = [ , 'home', , 'school'];

在下面的例子中,数组的长度是4,元素myList[0]和myList[2]缺失(译注:没被赋值,因而是undefined)。

var myList = [ , 'home', , 'school'];

又一个例子,在这里该数组的长度是4,元素myList[1]和myList[3]被漏掉了。(但是)只有最后的那个逗号被忽略。

var myList = [ , 'home', , 'school'];

理解多余的逗号(在脚本运行时会被如何处理)的行为,对作为语言来理解JavaScript十分重要,不管怎样,在你自己写代码时:明确的声明缺失的变量为undefined,将大大增加你的代码的清晰度和可维护性。

布尔字面量

布尔量有两种语式值:truefalse。

不要把JavaScript定义的基本数据类型中的布尔类型值true,false 和布尔对象的True和False相混淆,布尔对象类型为基本布尔数据的一个对象封装。对照其它语言比如Java 就是  bool数据类型 和 Boolean 对象类型。

整数

整数可以被表示成十进制(基数为10)、十六进制(基数为16)以及八进制(基数为8)。

  • 十进制整数字组成的数字序列,不带前导0(零)。
  • 前导0(零)的整数文字表明它是八进制。八进制整数只能包括数字0-7。
  • 前缀0x或0X表示十六进制。十六进制整数,可以包含数字(0-9)和字母a~f或A~F。

八进制整数字面量在ECMA-262,版本3标准(严格模式下 中被弃用并被移除。不过JavaScript 1.5为了后向兼容仍然支持。

整数字面量例子如下:

0, 117 and -345 (decimal, base 10)

015, 0001 and -077 (octal, base 8) 
0x1123, 0x00111 and -0xF1A7 (hexadecimal, "hex" or base 16)

浮点字面量

浮点字面量可以有以下的组成部分:

  • 一个十进制整数,它可以带符号(即前面的“+”或“ – ”号),
  • 一个小数点(“.”),
  • 一个小数部分(由一串十进制数表示),
  • 一个指数部分。

指数部分是以“e”或“E”开头后面跟着一个整数,可以有正负号(即前面写“+”或“-”)。一个浮点数语式量必须至少由一位数字、小数点或者“e”(大写“E”也可)组成。

一些浮点数字面量的例子,如3.1415,-3.1E13,.1e12以及2E-12。

简言之,其语法是:

[digits][.digits][(E|e)[(+|-)]digits]

例如:

3.14
2345.789
.3333333333333333333

对象字面量

对象字面量是包含有一个对象的零个或多个属性名值对的(元素)列表,其中每个名值对由一个属性名和一个相应的属性值构成,该字面量以花括号对({})封 闭。你不能在一段语句的开头就使用对象字面量。因为此时左花括号({)会被认为是一个块的起始符号,这将导致一个程序错误或非你所预想的行为。

以下是一个对象字面量的例子。对象car的第一个元素(译注:即一个属性双值对)定义了属性myCar;第二个元素,属性getCar,引用了一个函数(即CarTypes("Honda"));第三个元素,属性special,使用了一个已有的变量(即Sales)。

var Sales = "Toyota";

function CarTypes(name) {
  return (name == "Honda") ?
    name :
    "Sorry, we don't sell " + name + "." ;
}

var car = { myCar: "Saturn", getCar: CarTypes("Honda"), special: Sales };

console.log(car.myCar);   // Saturn
console.log(car.getCar);  // Honda
console.log(car.special); // Toyota

更进一步的,你可以使用数字或字符串语式量作为属性的名字,或者在另一个字面量内嵌套上一个字面量。如下的示例中使用了这些可选项。

var car = { manyCars: {a: "Saab", "b": "Jeep"}, 7: "Mazda" };

console.log(car.manyCars.b); // Jeep
console.log(car[7]); // Mazda

要注意的是:

var foo = {a: "alpha", 2: "two"};
console.log(foo.a);    // alpha
console.log(foo[2]);   // two
//console.log(foo.2);  // Error: missing ) after argument list
//console.log(foo[a]); // Error: a is not defined
console.log(foo["a"]); // alpha
console.log(foo["2"]); // two

字符串字面量

字符串字面量可以包含有零个或多个字符,由双引号(”)对或单引号(”)对包围。字符串被限定在同种引号之间;也即,必须是成对单引号或成对双引号。下面的例子都是字符串字面量:

  • "foo"
  • 'bar'
  • "1234"
  • "one line \n another line"
  • "John's cat"

你可以在字符串字面量上使用字符串对象的所有方法,过程其实是这样的:JavaScript会自动将字符串字面量暂时的变换为字符串对象,调用该方法,然后废弃掉那个临时的字符串变量。你也能用对字符串语式量使用类似String.length的属性:

"John's cat".length

你应当一直使用字符串字面量,除非你有特别的需求,要用到字符串对象。要查看字符串对象的有关细节,请阅读字符串对象一文

在字符串中使用的特殊字符

作为一般字符的扩展,你可以在字符串中使用特殊字符,如下例所示。

"one line \n another line"
Table 2.1 JavaScript special characters
Character Meaning
\b Backspace
\f Form feed
\n New line
\r Carriage return
\t Tab
\v Vertical tab
\' Apostrophe or single quote
\" Double quote
\\ Backslash character (\).
\XXX The character with the Latin-1 encoding specified by up to three octal digits XXX between 0 and 377. For example, \251 is the octal sequence for the copyright symbol.
\xXX The character with the Latin-1 encoding specified by the two hexadecimal digits XX between 00 and FF. For example, \xA9 is the hexadecimal sequence for the copyright symbol.
\uXXXX The Unicode character specified by the four hexadecimal digits XXXX. For example, \u00A9 is the Unicode sequence for the copyright symbol. See Unicode escape sequences.

Unicode编码

Unicode是一种通用字符编码标准的主要书面语言的交换和显示。它涵盖的语言,美洲,欧洲,中东,非洲,印度,亚洲和环太平洋,以及历史悠久的脚本和技术符号。 Unicode允许的多语言文本的交换,处理和显示,以及使用通用的技术和数学符号。它希望多语言计算,如不同的民族性格的标准,以解决国际化问题。但是,并非所有的现代或古老的语言书写体目前都支持。

Unicode字符集,可用于所有已知的编码。 Unicode是仿照ASCII(美国信息交换标准码)字符集。它使用一个数值,每个字符的名称。字符编码指定的字符和数值(代码位置),以及表示这个值位的身份。 16位的数字值(代码值)被定义为一个十六进制数,例如,前缀U,U +0041代表A.唯一的名称,这个值是拉丁大写字母A。

注意:早于JavaScript 1.3之前的版本并不支持Unicode编码。

兼容于ASCII和ISO标准的Unicode编码

Unicode编码完整兼容于ISO 10646国际标准的子集ISO/IEC 10646-1; 1993。

几种编码标准(包括UTF-8,UTF-16和ISO UCS-2)在物理上将Unicode表示为实际比特值(二进制值)。

Unicode编码的UTF-8与ASCII字符是兼容,并支持许多程序。前128个Unicode字符对应的ASCII字符,并具有相同的字节值。相当于从0x20到0x7E的ASCII字符的Unicode字符U +0020至U +007 E。支持拉丁字母,并使用7位字符集,与ASCII,UTF-8之间使用一个和第四个字节为每个字符(“字节”,这意味着一个字节,或8位)。这使得数百万个字符。另一种编码标准,UTF-16,使用两个字节来表示Unicode字符。转义序列允许UTF-16,代表整个Unicode范围由4个八位位组。 ISO UCS-2(通用字符集)使用两个字节。

JavaScript和浏览器对UTF-8/Unicode的支持,意味着你可以使用非拉丁,国际化,本地化的字符,再加上特殊的技术符号,在JavaScript程序。 Unicode提供了一种标准的方式来编码多语言文本。由于UTF-8的Unicode编码与ASCII兼容,程序可以使用ASCII字符。您可以使用非ASCII Unicode的字符的意见,字符串文字,标识,和正则表达式的JavaScript。

Unicode转义序列

你可以使用Unicode转义序列的字符串常量,正则表达式和标识符。转义序列由6个ASCII字符:\u和一个4位十六进制数字。例如,\u00A9表示版权符号。每一个Unicode转义序列,在JavaScript中被解释为一个字符。

下面的代码返回一个版权符号和字符串“Netscape Communications”。

var x = "\u00A9 Netscape Communications";

下表列出了常用特殊字符的Unicode值。

Table 2.2 Unicode values for special characters
Category Unicode value Name Format name
White space values \u0009 Tab <TAB>
\u000B Vertical Tab <VT>
\u000C Form Feed <FF>
\u0020 Space <SP>
Line terminator values \u000A Line Feed <LF>
\u000D Carriage Return <CR>
Additional Unicode escape sequence values \u0008 Backspace <BS>
\u0009 Horizontal Tab <HT>
\u0022 Double Quote
\u0027 Single Quote
\u005C Backslash \

从Java的JavaScript使用Unicode转义序列是不同的。在JavaScript中,转义序列是永远不会理解为一个特殊字符,第一个。例如,在一个字符串的行结束符转义序列不终止字符串,它被解释的功能。使用Javascript忽略任何转义序列,如果在评论中使用。在Java中,如果使用转义序列在一个单一的注释行,它被解释为一个Unicode字符。对于一个字符串字面量,Java编译器解释的转义序列的第一个。例如,如果一个行结束符转义字符(例如,\u000A),在Java中使用,它终止字符串文字。在Java中,这将导致一个错误,因为行结束符中不允许使用字符串文字。您必须使用\n换行的字符串文字。在JavaScript中,转义序列的工作方式相同的\n。

JavaScript文件中的Unicode字符

早期的Gecko默认使用Latin-1字符作为从XUL文件加载的JavaScript代码文件的编码。在Gecko 1.8之后,则根据XUL文件的编码来推断。请参考在XUL JavaScript中使用国际字符一文内的更多信息。

用Unicode编码显示字符

您可以使用Unicode的字符显示在不同的语言或技术符号。对于字符才能正确显示,如Mozilla Firefox或Netscape客户端需要支持Unicode。此外,适当的Unicode字体必须是提供给客户端,客户端平台必须支持Unicode。通常情况下,Unicode字体不会显示所有的Unicode字符。一些平台,如Windows 95,提供对Unicode的部分支持。

要接收非ASCII字符的输入,客户端需要发送的输入为Unicode。使用标准的增强型键盘,客户端可以很容易地输入Unicode支持的字符。有时,只有这样,才能输入Unicode字符使用Unicode转义序列。

更多关于Unicode的信息,请到Unicode Home Page查阅Unicode标准2.0版,Addison-Wesley出版社,1996年出版。

外部参考资源

 

JavaScript 开发教程(3):值,变量

本章讨论在JavaScript语言中可以支持的数值类型和构成Javascripts表达式的基本构造单元:变量,常量和字面值(literals)。

JavaScript语言可以识别下面这些不同类型的值:

 
类型 类型值范例 / 注释
数字* 42, 3.14159
逻辑(布尔)* true / false
字符串* “Howdy”
null(译注:意为空) 一个特殊的用于表示空值的关键字;同时null也是一个初始值。因为JavaScript语言是区分大小写的,所以null不同于NullNULL或者任何其他变体
undefined(译注:意为未定义) 当一个值未定义时的顶级属性;undefined同时也是初始值。

(*译注:因此处不是关键字,故译之)

这一值的类型的相关小集合,或称数据类型表,就让你能够执行对你的应用程序非常有用的函数。在整数和实数型数字之间并没有明确的类型分界。JavaScript中也没有明确的日期数据类型。尽管如此,你仍可以用Date对象以及相关的方法处理日期数据。

对象函数是本语言的另两个基本要素。你可以这样认为:对象是上面标着名字的用来盛放值的容器,而函数是你的应用可以执行的程序(功能模块)。

数据类型的转换

JavaScript是一种支持动态数据类型的语言。这意味着你定义变量时不必指定数据类型,而数据类型会在脚本执行需要时自动转换。那么,你可以这样来定义变量:

var answer = 42;

然后,你还可以给同一个变量分配个字符串值,例如:

answer = "Thanks for all the fish...";

因为JavaScript是动态类型的,这样的分配并不会导致提示出错。

在包含加法运算符的数字和字符串表达式中,JavaScript会把数字值转换为字符串。例如,假设有如下的语句:

x = "The answer is " + 42 // "The answer is 42"
y = 42 + " is the answer" // "42 is the answer"

在包含其它运算符(译注:如下面的“-”)时,JavaScript语言不会把数字变为字符。例如(译注:第一例是数学运算,第二例仍是字符串运算):

"37" - 7 // 30
"37" + 7 // "377"

字符串转换为数字

代表一个数字的值在内存中是作为字符串保存的,这种情况下,有一些方法可以进行转换。

parseInt()parseFloat()

参考:parseInt()parseFloat()的相关页面。

parseInt仅能够返回全部的数目字,所以使用它会丢失小数部分。另外,最好的parseInt实践是在使用时总包含一个基数(译注:即进位制)参数。

加法运算符

将字符串转换为数字的一个替代方法,是使用加法运算符。

"1.1" + "1.1" = "1.11.1"
(+"1.1") + (+"1.1") = 2.2   // Note: the parentheses are added for clarity, not required.

变量

在应用中,你会以有意义的名称命名变量,并使用来表示值。变量的名称,或称为变量标识符,需要遵守一定的规则。

在JavaScript语言中,一个标识符必须以字母、下划线(_)或者美元($)符号开头;后续的字符可以包含数目字(0-9)。因为JavaScript语言是区分大小写的,这里所指的字母可以是(大写的)“A”到字母“Z”和(小写的)“a”到“z”。

从JavaScript 1.5版开始,你可以使用ISO 8859-1或Unicode编码的字符作标识符,例如å和ü。你也可以使用\uXXXX字样的转义序列 Unicode escape sequences作标识符。

一些合法的名称,例如:Number_hits,temp99和_name

声明变量

你可以用以下两种方式声明变量:

  • 使用关键词var。例如,var x = 42。这个语法可以同时用来声明局部和全局变量。
  • 直接赋值。例如,x = 42。这样就声明了一个全局变量并会导致JavaScript编译时产生一个严格警告。因而你应避免使用这种非常规格式。

对变量求值

声明时未赋初值的变量,值会被设定为undefined(译注:即未定义值,本身也是一个值)

试图取得一个未定义变量会导致一个控制台ReferenceError例外错误被抛出:

var a;
console.log("The value of a is " + a); // logs "The value of a is undefined"
console.log("The value of b is " + b); // throws ReferenceError exception

你可以使用undefined条件来决定是否赋值给变量。以下的代码中,变量input未被赋值,因而if条件语句的求值结果是true。

var input;
if(input === undefined){
  doThis();
} else {
  doThat();
}

未定义的undefined值在布尔类型下会被当作非真false。例如,下面的代码将运行函数myFunction,因为矩阵myArray中的元素未被定义:

var myArray = new Array();
if (!myArray[0]) myFunction();

数值类型下undefined值会被转换为NaN(NaN为“不是一个数字”的缩写)。

var a;
a + 2 = NaN

当你对一个空变量求值时,空值null在数值型下会被当作0来对待,而布尔类型下会被当作非真。例如:

var n = null;
console.log(n * 32); // logs 0

变量作用域

在任何函数之外声明的变量,会成为全局变量,因为它对当前代码档中的任何部分都是可用的。当你在函数内部声明一个变量,那么它会是个局部变量,因为它仅在该函数内部有效。

JavaScript中变量不支持所谓语句声明块的域,此时变量的作用域为包含该语句块的上层作用域。例如,如下的代码控制台将记录下5,因为x所在的域是x被声明的函数(或全局,由上下文决定),而不是if条件语句的块 ,这点和其它语言比如Java或C#,对于Java或C#来说,它们是支持语句块作用域的,变量x作用域为if块,离开if块后,x无定义,应该抛出异常。而对于JavaScript来说,不存在这种问题,它不支持语句块作用域,因此此时var x定义的作用域和把var x放在if块外面效果是一样的,因此console.log(x)可以打印出5。

if (true) {
  var x = 5;
}
console.log(x);

JavaScript语言中关于变量的另外一个比较特殊的是,是你可以引用稍后声明的变量,而不会得到一个例外错误。这一概念称为做举升;JavaScript变量感觉上是被“举升”或提起到了函数和语句段之上。

/**
 * Example 1
 */
console.log(x === undefined); // logs "true"
var x = 3;

/**
 * Example 2
 */
// will return a value of undefined
var myvar = "my value";

(function() {
  console.log(myvar); // undefined
  var myvar = "local value";
})();

上面的例子2,也可作:

var myvar = "my value";

(function() {
  var myvar;
  console.log(myvar); // undefined
  myvar = "local value";
})();

如果我们借助于IDE(比如Visual Studio 2012)的Javascript 编辑器,可以很清楚的看到这种警告:

20130525003
拜举升的概念所要求,所有的var变量声明语句应尽可能地放在接近函数顶部的地方。这种体验将会大大提升程序代码的明晰度。

全局变量

全局变量实际上是全局对象的属性。在互联网页面中,(译注:缺省的)全局对象是窗口,所以你可以用形如window.variable的语法来设置和取得全局变量。

因而这带来,你可以从一个窗口或框架用指定窗口或框架名的方法,取得在另一个窗口或框架里声明的变量。例如,设想一个叫phoneNumber的变量在文档FRAMESET里被声明,你可以在其子框架里用变量parent.phoneNumber来指向它。

常量

你可以用关键字const生成可命名的、只读的常量。常量标识符的语法和变量的相同:必须以字母、下划线或美元符号开头并可以包含有字母、数字或下划线。

const prefix = '212';

一个常量的值在脚本程序运行过程中,不会因分配或重新声明而改变。
常量的域的规则与变量相同,除了关键字const是必须的,全局常量也必须有。若关键字被遗漏了,那该标识符将被视为变量。
在同一个域当中,你不能用与变量或函数同样的名字来命名常量。例如

// THIS WILL CAUSE AN ERROR
function f() {};
const f = 5;

// THIS WILL CAUSE AN ERROR ALSO
function f() {
  const g = 5;
  var g;

  //statements
}
 

JavaScript 开发教程(2):JavaScript 概述

本节将介绍并讨论 JavaScript 的基本概念。

什么是 JavaScript?

JavaScript 是一种跨平台,面向对象的脚本语言。作为一种小巧且轻量级的语言,JavaScript 无意于独立运行,而是被设计为可以轻易嵌入到其它的产品和应用中,比如 Web 浏览器。在宿主环境中,JavaScript 可以被连接到环境中的对象之上,以提供对其的编程控制。

核心的 JavaScript 中包含有一组核心的对象,包括 Array,DateMath,以及一组核心的语言要素,包括操作符,控制结构和语句。出于多种目的,可以通过为其增补附加的对象,对核心 JavaScript 加以扩展;例如:

  • 客户端 JavaScript 提供了用于控制浏览器(Navigator 或者其它浏览器)以及其中的文档对象模型(DOM)的对象,从而扩展了核心 JavaScript。例如,客户端扩展允许应用程序在 HTML 的表单中加入元素,以便响应用户事件,比如鼠标点击,表单输入和页面导航。
  • 服务器端 JavaScript 提供了服务于在服务器上运行 JavaScript 的对象,从而扩展了核心 JavaScript。例如,服务器端扩展可以允许应用程序访问关系型数据库,在不同的应用程序调用间提供信息的联系性,甚至于处理服务器之上的文件。

借由 JavaScript 的 LiveConnect 功能,您可以让 Java 和 JavaScript 间实现通讯。从 JavaScript 中,您可以创建 Java 对象并访问它们的公共方法和域。从 Java 中,也可以访问 JavaScript 的对象,属性和方法。

Netscape 发明了 JavaScript 并将 JavaScript 首先用于 Netscape 浏览器中。

JavaScript 和 Java

JavaScript 和 Java 虽然在某些方面相似,但在另外一些方面确有着本质的不同。JavaScript 语言类似于 Java 语言,但是没有 Java 的类型静态化和强类型检查。JavaScript 大部分的表达式语法,命名规范以及基本的控制流构成都和 Java 相同。正是由于这个原因,JavaScript 才从 LiveScript 改名得来。

相对于 Java 的通过声明而形成的编译时的类系统,JavaScript 基于少量的表示数值,布尔值以及字符串值等的数据类型,支持运行时的系统。JavaScript 使用基于原型的对象模型,而不是更常见的基于类的对象模型。基于原型的对象模型提供了动态的继承能力,实际上,究竟什么得到继承,对于每个对象都可能不同。JavaScript 还支持无需任何特殊的声明要求的函数。函数可以作为对象的属性加以运行,有点类似于类型化的方法。

相比 Java 而言,JavaScript 是一种格式相当自由的语言。无需声明所有的变量,类和方法。无需关系方法是公共的,私有的或者是保护的,也无需实现接口。变量,参数,以及返回值都无需显式的类型声明。

Java 是基于类的编程语言,目标在于快速的执行和类型安全。这里的类型安全,可以是比如,你不能将 Java 的整数强制转换为对象引用,或者通过串改 Java 字节码来达到访问私有内存区域的目的。Java 基于类的模型意味着程序完全由类及其方法构成。这些类的继承以及强类型通常需要紧密耦合的对象层级结构。这些需求使得 Java 编程远比 JavaScript 编程要复杂。

相比之下,JavaScript 系处于那些更小巧的,类型动态化的语言,比如 HyperTalk 和 dBASE。这些脚本语言因其更为简单的语法,更专注的内建功能,以及最小化的对象创建需求,提供了更为大众化的编程工具。

表 1.1 JavaScript 与 Java 的对比
JavaScript Java
面向对象的。对象的类型间没有区别。继承是基于原型机制实现的,且属性和方法可以动态地添加到任何对象之上。 基于类的。对象被划分为类和实例,且所有的继承是通过类的层级结构实现的。类或者实例不能动态地添加属性或方法。
变量的数据类型无需声明(动态化类型)。 变量的数据类型必需声明(静态化类型)。
不能自动地写入硬盘 不能自动地写入硬盘

有关 JavaScript 和 Java 之间区别的更多信息,参见 对象模型的细节

JavaScript 和 ECMAScript 规范

Netscape 发明了 JavaScript 并将 JavaScript 首先用于 Netscape 浏览器中。不过, Netscape 正在与 Ecma International — 欧洲信息和通讯标准化协会(ECMA 曾是 European Computer Manufacturers Association,既欧洲计算机制造商协会的缩写)一道致力于交付一个基于核心 JavaScript 的,标准化的,国际化的编程语言,既 ECMAScript。ECMAScript 在所有支持该标准的应用程序中具有相同的特性。其它公司可以使用开放的标准语言来开发它们的 JavaScript 实现。ECMAScript 标准在 ECMA-262 规范中加以记述。

ECMA-262 标准由 ISO(International Organization for Standardization,既国际标准化组织)批准为 ISO-16262。在 Mozilla 网站上可以找到 PDF 版本的 ECMA-262 (过时的版本)。在 Ecma International 的网站 上也可以找到该规范。ECMAScript 规范没有描述文档对象模型(DOM)。该模型由 World Wide Web Consortium (W3C) 完成标准化。DOM 定义了 HTML 文档对象呈现在脚本中的方式。

JavaScript 版本和 ECMAScript 版本之间的关系

Netscape 与 Ecma International 的紧密合作形成了 ECMAScript 规范(ECMA-262)。下面的表格描述了 JavaScript 版本和 ECMAScript 版本之间的关系。

表 1.2 JavaScript 版本和 ECMAScript 版本
JavaScript 版本 与 ECMAScript 版本的关系
JavaScript 1.1 ECMA-262,第 1 版 基于 JavaScript 1.1.
JavaScript 1.2 ECMA-262 在 JavaScript 1.2 发布时尚未完成。由于以下原因,JavaScript 1.2 并不与 ECMA-262,第 1 版完全兼容:

  • Netscape 在 JavaScript 1.2 开发了一些新的特性尚未被 ECMA-262 采纳。
  • ECMA-262 添加了两项新特性:基于 Unicode 的国际化,以及跨平台的一致行为。而 JavaScript 1.2 的某些特性,例如 Date 对象,是依赖于平台的,且具有特定于平台的行为。
JavaScript 1.3 JavaScript 1.3 完全兼容于 ECMA-262,第 1 版。
JavaScript 1.3 解决了 JavaScript 1.2 与 ECMA-262 之间的不一致性,同时保留了 JavaScript 1.2 中的附加特性,除了  ==!= 被修改以便顺应于 ECMA-262 之外。
JavaScript 1.4 JavaScript 1.4 完全兼容于 ECMA-262,第 1 版。
ECMAScript 规范的第三版在 JavaScript 1.4 发布时尚未最终完成。
JavaScript 1.5 JavaScript 1.5 完全兼容于 ECMA-262,第 3 版。
注:ECMA-262,第 2 版仅包含对第 1 版规范的细微的编辑性的改动和错误修正。由 Ecma International 的 TC39 工作组发布的最新版本为 ECMAScript 版本 5.1

JavaScript 参考 中标明了语言中的哪些特性兼容于 ECMAScript。

JavaScript 将总会包含某些 ECMAScript 规范中所没有的特性;JavaScript 兼容于 ECMAScript,同时提供附加特性。

JavaScript 文档相较于 ECMAScript 规范

ECMAScript 规范了实现 ECMAScript 的一组需求;它有助于您确定某项 JavaScript 特性是否也为其它 ECMAScript 的实现所支持。如果您想编写仅仅使用 ECMAScript 所支持的特性的代码,那么您可能需要参考 ECMAScript 规范。

ECMAScript 的文档的目的不在于帮助脚本程序员;对于如何编写脚本方面的信息,可以参考 JavaScript 的文档。

JavaScript 和 ECMAScript 术语

ECMAScript 规范使用的术语和语法对于 JavaScript 程序员而言,可能会有点陌生。尽管对语言的描述方式在 ECMAScript 中可能不尽相同,但是语言本身还是相同的。JavaScript 支持 ECMAScript 规范中所勾勒出的全部功能。

JavaScript 文档描述了语言中适合于 JavaScript 程序员的方面。例如:

  • JavaScript 文档中没有描述全局对象,因为不会直接用到它。全局对象的属性和方法在 JavaScript 文档中被称为顶层函数和属性。
  • JavaScript 文档中没有讨论 NumberString 对象的无参(零个参数)构造器,因为几乎不会用到其生成的对象。无参的 Number 构造器返回 +0,而无参的 String 构造器返回 “” (空的字符串)。
 

JavaScript 开发教程(1):关于本教程

前面介绍过jQuery开发教程,本想继续写个JavaScript的中文开发教程,发现https://developer.mozilla.org 上面的教程(英文)写的非常好,

在这里就全篇转发过来,原文的中文翻译部分翻译似乎是由非计算机背景的人翻译,本教程参考英文原文做其中某些部分做了简要的修改,并补上后面没有翻译成中文的几篇。

JavaScript 是一种跨平台的,基于对象的脚本语言。本指南介绍了所有您使用 JavaScript 所需要了解的事情。

JavaScript 各版本中的新特性

您应该已经了解的事情

本指南假设您已经具有以下背景知识:

  • 对于互联网和 World Wide Web(WWW)的基本理解。
  • 对于超文本链接语言(HTML)的较好认知。

具有一些编程语言方面的知识,比如 C 或者 Visual Basic 将是非常有帮助的,但是并不是必需的。

JavaScript 版本

表格 1 JavaScript 和 Navigator 版本对照
JavaScript 版本 Navigator 版本
JavaScript 1.0 Navigator 2.0
JavaScript 1.1 Navigator 3.0
JavaScript 1.2 Navigator 4.0-4.05
JavaScript 1.3 Navigator 4.06-4.7x
JavaScript 1.4
JavaScript 1.5 Navigator 6.0
Mozilla (开源浏览器)
JavaScript 1.6 Firefox 1.5,及其它基于 Mozilla 1.8 的产品
JavaScript 1.7 Firefox 2,及其它基于 Mozilla 1.8.1 的产品
JavaScript 1.8 Firefox 3,及其它基于 Gecko 1.9 的产品

不同版本的 Netscape 企业服务器也支持不同版本的 JavaScript。为了帮助您编写兼容于多个版本的企业服务器的脚本,这本手册使用以下缩略形式标识实现不同特性的服务器版本。

表 2 Netscape 企业服务器版本缩略
缩略 企业服务器版本
NES 2.0 Netscape 企业服务器 2.0
NES 3.0 Netscape 企业服务器 3.0

哪里可以找到 JavaScript 的信息

JavaScript 文档包括以下数目:

如果您刚刚开始接触 JavaScript,可以从 JavaScript 指南 开始。一旦掌握了基础知识,您可以从 JavaScript 参考 中获得更多关于特定的对象和语句的细节。

学习 JavaScript 语言的窍门

开始学习 JavaScript 很容易:您只需要一个流行的 Web 浏览器即可。这本指南中包含了一些仅在 Firefox(以及其它基于 Gecko 的浏览器)的近期版本中才有的特性,因此,建议您使用最新的 Firefox 浏览器。

交互式解释器

交互式的 JavaScript 解释器允许您尝试编写脚本而不必保存文件和刷新页面,这对于学习 JavaScript 语言具有巨大裨益。通过 Firefox 的 Tools 菜单,您可以访问 Firefox Error Console 工具。该工具提供了便捷的访问交互式的 JavaScript 的途径:输入代码行,然后点击“Evaluate”即可。

20130525001

Firebug

通过 Firefox 的扩展程序 Firebug,您可以获得一个更高级的交互式解释器。您输入的表达式将被解释为对象,并链接到 Firebug 的其它部分。例如,您可以计算 5 加 5,改变一个字符串的大小写,同时获得可以点击的到相关文档的链接,或者是到元素的链接:

20130525002

通过右下角的箭头,可以激活支持多行脚本的命令编辑器。

Firebug 同时还提供了增强的 DOM 检查器,JavaScript 调试器,性能分析器以及其它实用工具。运行于 Web 页面中的 JavaScript 代码可以调用 console.log() 函数将给定的参数输出到 Firebug 的控制台中。

文档约定

JavaScript 应用可以运行在许多操作系统之上;本书中所给出的信息适用于所有这些系统。文件和目录的路径将以 Windows 的形式给出(反斜线用于分隔目录名)。对于 Unix 系统,目录的路径是相同的,只是将反斜线换成斜线即可。

本指南使用如下形式的统一资源定位符(URL):

http://server.domain/path/file.html

在这些 URL 中,server 表示您的应用所运行的服务器的名称,比如 research1 或者 wwwdomain 表示您的互联网域名,比如 netscape.com 或者 uiuc.edupath 表示在服务器中的目录结构;而 file.html 则表示特定的文件名。一般来讲,URL 中的斜体部分为占位符,而其中的等宽字体则为原文。如果您的服务器启用了安全套接字层(SSL),则需要将 URL 中的 http 换成 https。

本指南使用如下字体约定:

  • 等宽字体用于示例代码,代码罗列,API 以及语言元素(比如方法名或者属性名),文件名,路径名,目录名,HTML 标签,以及其它任何必需键入到屏幕中的文本。(等宽斜体字用于代码中的占位符)
  • 斜体字 用于本书的标题,强调,变量和占位符以及其它直接字面上的词汇。
  • 粗体 用于词汇表。
 

引路蜂技术博客论坛开放

为了更好的实现技术交流,引路蜂技术博客开始支持技术论坛

网址 http://www.guidebee.info/forum

20130519001

 

欢迎大家注册并发言。

 

开源引路蜂地图开发包

由于时间上的问题,已经有很长时间没有对引路蜂地图开发添加功能,因此决定对引路蜂地图开发包,此外征召有兴趣的开发人员共同开发引路蜂地图包 (联系Email:james.shen@guidebee.com)

引路蜂地图包分为Java和.Net版本,支持移动平台和手机平台,其主要功能如下:

地图开发

提起地图开发包,Google 地图和Bing 地图主要应用于Web应用,在离线方式和移动平台上它们并没有提供足够的支持,比如在Java ME平台上使用Google地图API或是在Android,iPhone平台上使用Bing地图。如在中国,想在Windows Mobile 平台上使用 MapABC地图API都不是很方便。
引路蜂地图开发包提供了对几乎所有软件平台(桌面和移动平台)的支持,采用统一的接口使用包括Google 地图,Bing地图,MapABC地图在内多达二十多种地图类型,并在同一开发包中支持离线地图,矢量地图显示。
下图显示了引路蜂地图开发包支持的开发平台,软件包以三个不同的开发包提供对各个平台的支持:

Java ME 地图开发包 MIDP/LWUIT/Blackberry
Java SE 地图开发包 Android/Java SE
.Net Framework 地图开发包 Windows Mobile/Windows Phone 7/.Net desktop/Mac OS/iPhone/iPad

引路蜂地图开发包支持的主要功能如下表

开源代码经过整理,将逐步投放在github ,目前采用GPL 开源协议。

GitHub 地址 为 https://github.com/guidebee/  下

  • guidebeemap      Java库源码
  • guidebeemapdonnet  .Net 库源码
  • guidebeemaptutorial  教程及示例应用代码
  • maptiledownloader    离线地图下载应用代码