一、语法
ECMAScript的语法大量借鉴了C及其他类C语言的语法;
1、区分大小写
ECMAScript中的一切都是区分大小写的(变量、函数名和操作符);
2、标识符
所谓标识符,就是指变量、函数、属性的名字,或者函数的参数,标识符可以是按照下列的格式规则组合起来的一或多个字符:
第一个字符必须是一个字母、下划线或一个美元符($)构成;
其他字符可以是字母、下划线、美元符号($)或数字;
按照惯例,ECMAScript标识符采用驼峰大小写格式(驼峰命名法);
不能把关键字、保留字、true、false和null用作标识符;
3、注释
ECMAScript使用C风格的注释,包括单行注释(//注释内容)和多行注释(/*注释内容*/);
4、严格模式
ECMAScript 5 引入了严格模式的概念,严格模式是javascript定义了一种不同的解析与执行模型。在严格模式下,ECMAScript 3 中一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误。要在整个脚本中启用严格模式,可以在顶部添加如下代码:
"user strict";
这行代码是一个编译指令,用于告诉支持的javascript引擎切换到严格模式;
在函数内部的上方包含这条编译指令,也可以指定函数在严格模式下执行:
function doSomething(){
"user strict";
//函数体
}
5、语句
ECMAScript中的语句以一个分号结尾,虽然语句结尾的分号不是必需的,但是建议任何时候都不要省略;
二、关键字和保留字
按照规则, 关键字和保留字不能作为标识符和属性名;
三、变量
ECMAScript的变量时松散类型的,所谓松散类型就是可以用来保存任何类型的数据,定义变量时要使用 var 操作符,后跟变量名,如:
var message; //该变量可以用来保存任何类型的数据,像这种没有经过初始化的变量,会保存一个特殊的值——undefined;
可以在修改变量值的同时修改值的类型:var message = "Hellow";
message = 100; //有效,不推荐
省略var操作符可以定义变量为全局变量,但不推荐这种做法,因为在局部作用域中定义的全局变量很难维护;function test(){
message = "Hellow"; //不推荐这种方式定义变量message
}
test();
alert(message); //有效,打印 "Hellow"
可以使用一条语句定义多个变量;var message = "Hellow",found = false,age = 12;
因为ECMAScript是松散类型,因此使用不同类型初始化变量的操作可以放在一条语句中完成;
四、数据类型
ECMAScript中有5中简单数据类型(也称为基本数据类型):Undefined、Null、Number、Boolean、String,还有一种复杂数据类型——Object;
ECMAScript不支持任何创建自定义类型的机制,而所有的值最终都将是上述的6中数据类型之中的一种;
1、typeof操作符
检测给定变量的数据类型——typeof 操作符,对一个值使用typeof操作符可能返回下列字符串:
"undefined"——如果这个值未定义;
"boolean"——如果这个值是布尔值;
"string"——如果这个值是字符串;
"number"——如果这个值是数值(整数、浮点数);
"object"——如果这个值是对象或null;
"function"——如果这个值是函数;
var message = "some thing";
alert(typeof message); //"string"
alert(typeof(message)); //"string"
alert(typeof 12); //"number"
typeof是一个操作符而不是函数,所以例子中的圆括号不是必需的,可用可不用;
2、Undefined类型
Undefined类型只有一个值,就是特殊的undefined;在使用var声明变量但没有初始化的时候,这个变量的值就是undefined;
var message;
alert(message == undefined); //true
对于未声明的变量,只能执行一项操作,就是使用typeof操作符检测其数据类型;var message; //这个变量声明之后默认取得了undefined值;
//下面这个变量并没有声明
//var age
alert(typeof message); //"undefined"
alert(typeof age); //"undefined"
3、Null类型
Null类型只有一个值null,null值是一个空对象指针;使用typeof操作符检测null值,返回的是"object"类型;
var car = null;
alert(typeof(car));//"object"
如果定义的变量准备在将来用于保存对象,那么最好将这个变量显示的初始化为null;这样一来,只要直接检查null就可以知道相应的变量是否已经保存了一个对象的引用;undefined值是派生自null值的;
alert(null == undefined); //true
尽管null和undefined有这样的关系,但它们的用法完全不同。无论在什么情况下都没有必要把一个变量的值显示的设置为undefined,如果定义的变量准备在将来用于保存对象,那么最好将这个变量显示的初始化为null;
4、Boolean类型
Boolean类型只有两个值:true和false,true不一定等于1,false不一定等于0,区分大小写;
要将一个值转换为对象的Boolean值,可以调用转型函数Boolean(任何数据类型的值);
var message = "Hellow world!";
var messageAsBoolean = Boolean(message);
各种数据类型及其对应的转换规则:
String:任何非空字符串转换为true值,空字符串(" ")转换为false值;
Number:任何非0数字值(包括无穷大)转换为true值,0或NaN转换为false值;
Object:任何对象转换为true值,null转换为false值;
Undefined:undefined值转换为false值;
5、Number类型
6、String类型
7、Object类型
五、操作符
1、一元操作符
2、位操作符
3、布尔操作符
4、乘性操作符
5、加性操作符
6、关系操作符
7、相等操作符
8、条件操作符
9、赋值操作符
10、逗号操作符
六、语句
1、if语句
2、do-while语句
3、while语句
4、for语句
5、for-in语句
6、label语句
7、break和continue语句
8、with语句
9、switch语句
七、函数
ECMAScript中的函数使用function关键字声明,后跟一组参数和函数体,函数的基本语法如下:
function functionName(arguments0, arguments1, argument2 ...){
}
函数可以通过函数名调用,后面还要加上一对圆括号和参数,圆括号中的参数如果有多个,可以用逗号隔开;
ECMAScript 中的函数在定义是不必指定是否返回值;
return语句也可以不带有任何返回值,在这种情况下,函数会停止执行并返回 undefined 值;
严格模式对函数有一些限制:
不能把函数命名为eval或arguments;
不能把参数命名为eval或arguments;
不能出现两个命名参数同名的情况;
1、理解参数
ECMAScript函数不介意传递进来多少个参数,也不在乎传进来参数时什么数据类型。也就是说,即使你定义的函数只接收两个参数,在调用这个函数时未必一定要传递两个参数。可以传递一个或三个甚至不传递参数,而解释器不会有什么怨言;
实际上,函数可以通过arguments对象来访问参数数组,从而获取传递给函数的每一个参数;
function sayHi(){
<span style="white-space:pre"> </span>alert("Hello" + arguments[0] + "," + arguments[1]);
}ECMAScript函数重要特性:函数命名参数只是为了提供便利,但不是必需的;
通过访问 arguments 对象的length属性可以知道有多少个参数传递给函数,如:
function howManyArgs(){
<span style="white-space:pre"> </span>alert(arguments.length);
}
howManyArgs();<span style="white-space:pre"> </span>//0
howManyArgs(12, "we");<span style="white-space:pre"> </span>//2
howManyArgs(12);<span style="white-space:pre"> </span>//1
arguments 对象可以跟命名参数一起使用,如:function doAdd(num1, num2){
<span style="white-space:pre"> </span>if(arguments.length == 1){
<span style="white-space:pre"> </span>alert(num1 + 10);
<span style="white-space:pre"> </span>}else if (arguments.length == 2){
<span style="white-space:pre"> </span>alert(arguments[0] + num2);
<span style="white-space:pre"> </span>}
}
arguments 的值永远跟对应的命名参数的值相等,在函数中,修改 arguments 的值,对应的命名参数的值会发生改变以保持跟 arguments 的值一致;但是修改命名参数的值,不会改变 arguments 中对应的值;没有传递值的命名参数将自动被赋值 undefined;
2、没有重载
ECMAScript函数不能像传统意义上那样实现重载,如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数,如:
function addSomeNumber(num){
<span style="white-space:pre"> </span>return num + 100;
}
function addSomeNumber(num){
<span style="white-space:pre"> </span>return num + 200;
}
var result = addSomeNumber(100);<span style="white-space:pre"> </span>//300