ECMAScript提供了实现通用程序设计任务必需的JavaScript的语法、运算符和基本对象。
1. 语法
ECMAScript借用了Java、C等语言的语法,对于熟悉这些语言的开发者掌握ECMAScript的语法应该是非常容易的。
- 区分大小写
- 变量是弱类型:定义变量时只用var关键字并且可以将变量初始化为任意值
- 每行结尾的分号可有可无(一个良好的习惯是总是在语句的末尾加上分号,因为如果没有分号在有的浏览器中可能会无法正确运行)
- 注释与Java和C语言等相同
- 括号表示代码块
2.变量
由于是弱类型语言,变量可以存放不同类型的值;但是在使用变量的时候,一个好的习惯是始终存放相同类型的值。
变量命名需要遵守两条简单的规则:
- 第一个字符必须是字母、_或$
- 余下的字符可以是_、$、数字字符或任何字母
注意:ECMAScript的解释程序遇到未声明过的标识符时,用该变量名创建一个全局变量,并将其初始化为指定的值,但是这样做是危险的。良好的编程习惯应当是总是声明所有变量。
3. 关键字和保留字
关键字(keyword)是有特殊含义的单词,是系统保留的不能用做变量名或函数名的特殊符号。
break、case、catch、continue、default、delete、do、else、finally、for、function、if、in、
instanceof、new、return、switch、this、throw、try、typeof、var、void、while、with
保留字(reserved word)是为将来的关键字而保留的单词。
abstract、boolean、byte、char、class、const、debugger、double、enum、export、
extends、final、float、goto、implements、import、int、interface、long、native、
package、private、protected、public、short、static、super、synchronized、throws、
transient、volatile
4. 原始值和引用值
变量可以存放两种类型的值:原始值和引用值
- 原始值(primitive value):存储在栈(stack)上的简单数据段
- 引用值(reference value):存储在堆(heap)中的对象
5. 原始类型
ECMAScript有5种原始类型,即Undefined、Null、Boolean、Number和String,通过typeof运算符可以判断一个值是否在某种类型的范围内。
~Undefined类型:该类型只有一个值undefined,当声明的变量没有初始化时它的默认值是undefined。
var temp;
alert(temp == undefined); // true
alert(typeof temp); // "undefined"
当函数无明确的返回类型时,返回类型也是undefined。
~Null类型:Null类型也只有一个值null,值undefined实际上是从null派生来的,因此ECMAScript将它们定义为相等的
~Boolean类型:有两个值true和false
~Number类型:这种类型既可以表示32位整数,也可以表示64位浮点数。有几个特殊值也被定义为Number类型,分别是:Number.MAX_VALUE和Number.MIN_VALUE,还有当计算生成的数值大于Number.MAX_VALUE时,将被赋予Number.POSITIVE_INFINITY(Infinity);同样,生成的数值小于Number.MIN_VALUE时,将被赋予Number.NEGATIVE_INFINITY
(-Infinity)。可以用isFinite()方法判断一个数值是不是无穷大。还有一个特殊值是NaN。NaN和无穷大都不能用于算数计算,另外NaN与自身不相等。
alert(NaN == NaN); // false
alert(isNaN("blue")); // true
alert(isNaN("123")); // false
~String类型:字符串是唯一没有固定大小的原始类型。字符串的字面量可以用单引号或者双引号声明。
6. 类型转换
- 转换成字符串
3种主要的原始值Boolean、Number和String都有toString()方法,可以把它们的值转换成字符串。Boolean型的toString()方法只是输出true或者false;Number类型的toString()方法有两种模式:默认模式和基数模式,所谓基数模式是可以将数值转换为二进制、八进制和十六机制,例如:
var iNum = 10;
alert(iNum.toString(2)); // 1010
alert(iNum.toString(8)); // 12
alert(iNum.toString(16)); // A
- 转换成数字
ECMAScript提供了两种把非数字的原始值转换成数字的方法,即parseInt()和parseFloat(),这两个方法只对String类型生效,其他类型返回都是NaN,例如:
alert(parseInt("1234blue")); // 1234
alert(parseInt("0xA")); // 10
alert(parseInt("22.5")); // 22
alert(parseInt("blue")); // NaN
alert(parseFloat("1234blue")); //1234.0
alert(parseFloat("0xA")); // NaN
alert(parseFloat("22.34.5")); // 22.34
alert(parseFloat("0908")); // 908
7. 引用类型
- Object类:ECMAScript中的所有类都由这个类继承而来。
- Boolean类:Boolean类是Boolean原始类型的引用类型。(注意:开发时最好使用Boolean原始值)
- Number类:Number类是Number原始类型的引用类型。(注意:只要可能,都使用数字的原始表示法)
- String类:String类具有length属性,它代表字符串中的字符个数;String类拥有大量的方法,可以查阅http://www.w3cschool.cn/提供的JavaScript帮助手册。
8. 运算符
~一元运算符
delete: 删除对以前定义的对象属性或方法的引用
void: 对任何值都返回undefined, 用于避免输出不应该输出的值
++/--: 自增/自减运算
+/-: 正/负号运算
~逻辑运算符
! && ||
~算术运算符
+ - * / %
~关系运算符
> < >= <= == != ===
~条件运算符
? :
~赋值运算符
= += -= *= /= %=
~位运算符
>> << >>> ~ & | ^
9. 语句
(不解释)
- if...else
- do...while
- while
- for
- for-in
- break / continue
- with
- switch...case...default
10. 函数
函数是一组可以随时随地运行的语句,是ECMAScript的核心。与Java或者C#等语言不同,函数在JavaScript是一等公民,其地位相当于Java中的类(JavaScript中的对象是通过函数创建的)。声明函数的关键字是function,由于是弱类型语言,函数没有返回类型,参数也不需要指定返回类型。
ECMAScript中的函数不能重载。可以用相同的名字在同一个作用域中定义两个函数不会引发错误,但是真正使用的是后一个函数。函数中有一个特殊对象arguments,这使得开发者不需要指定参数名就可以访问函数的参数。
在ECMAScript中,函数实际上是功能完整的对象。用Function类可以表示开发者定义的任何函数。可以用Function类直接创建函数,如下所示:
var sayHi = new Function("name", "alert('Hello, ' + name)"); sayHi("LUO Hao"); // Hello, LUO Hao
注意:尽管可以用Function构造函数创建函数,但是最好不要使用它,因此它定义函数比用传统的方式要慢得多。但是需要注意所有的函数其实都是Function类的实例。
还有一个和函数相关的概念叫“闭包”,这个在后面的章节中讲解。