在Ajax应用程序中,JavaScript是核心的编程语言。JavaScript可以嵌在网页中,也可以保存在网页外部的独立文件中。当保存在外部文件中时,网页可以通过文档的head中的<script>标签来引用这些文件:
<script type="text/javascript" src="/path/file.js"></script>
JavaScript通常都是按过程书写的,也就是说,JavaScript执行的顺序和你所编写代码的顺序是一致的。
1、语句
JavaScript指令被称为语句。一组语句便构成了脚本。每条语句应该以分号结尾。如果语句不以分号结尾,而以换行符结尾,JavaScript会自动插入一个分号,把这条语句视为用分号结尾。不过这样会养成松散的编程习惯,所有即使每条语句独占一行,也最好以分号结束语句。
例如:
var name = "gerry", age = 18;
var person = ["gerry", 18];
函数块或者语句块的行末尾就不必添加分号,加了就是多了一句空语句了。
例如:
if ( a > 5 ) { a = 5; alert(""); }
function person() { a = 5; alert(""); }
还有一种情况比较特殊,例如:
var obj = { "person " : {"name":"gerry", "age":18} };
var person = function()
{
this.name = "gerry";
this.age = 18;
};
这种情况下,虽然行的结尾是函数块或者语句块,但是又由于前面有一个赋值的操作,这个语句块或者函数就构成了一个复杂语句了,一个复杂语句也是一个语句,每个语句的末尾都应该用分号结尾。
2、变量
在JavaScript中,变量就是值的标签,即使值变了,其标签是不变的。这使得变量非常有助于用于数据的存储、操作和检索。创建变量成为声明,在JavaScript中使用关键字var来声明变量,如:
var myName;
变量名可以由字母、数字、下划线和“$”符号组成,但变量名不可以用数字开始。变量名是大小写敏感的。另外,JavaScript的保留字不能用作变量名,如:if、else、for、while、var、function等。
如果一个变量不使用关键字var来声明,则声明的时候就必须同时赋值。形如:
myName = "gerry";
这种变量不管在哪个语句块里面声明,它的作用域都是全局的。它隐性的继承了宿主,在浏览器中就等价于window.myName 。
3、数据类型
当一个变量第一次被声明后,它的值是null,其中不包含任何数据。变量的值可以是字符串、数值、布尔值或者数组等。这些都被称为数据类型。JavaScript是一种弱类型语言,声明变量时无需定义变量的数据类型,使用过程中也可以随时更改变量的数据类型。
3.1、字符串
字符的集合便成了字符串。任何字符都可以构成字符串,包括空字符串。在JavaScript中null != "",0 == "",false == ""、null == undefined。字符串必须被放在成对的引号中,引号可以是双引号,也可以是单引号。这样可以方便于我们在字符串中包含引号了,如:
var s1 = "it's my name", s3 = 'her name is "vivian".';
当然也可以对字符串中的引号进行转义处理,如:
var s1 = 'it/'s my name';
字符串还可以用new运算符来创建,效果和用字符串文字显式创建大致相同,如:
var s1 = new String("hi");
一个字符串变量创建完后就会自动具有以下属性和方法:
constructor 属性 | length 属性 | prototype 属性
anchor 方法 | big 方法 | blink 方法 | bold 方法 | charAt 方法 | charCodeAt 方法 | concat 方法 | fixed 方法 | fontcolor 方法 | fontsize 方法 | fromCharCode 方法 | indexOf 方法 | italics 方法 | lastIndexOf 方法 | link 方法 | match 方法 | replace 方法 | search 方法 | slice 方法 | small 方法 | split 方法 | strike 方法 | sub 方法 | substr 方法 | substring 方法 | sup 方法 | toLowerCase 方法 | toUpperCase 方法 | toString 方法 | valueOf 方法
3.2、数值
如果你想要一个数值变量,赋值时不要用引号或其他符号把数字包含起来,直接把数值赋给变量即可。数值不一定非得大于零,也没有限制必须是整数。如:
var num = -100.01;
字符串还可以用new运算符来创建,效果和用数值赋值方式创建基本一样,不同的地方是,这种方式会自动把字符串转化为数值,如:
var num = new Number("100"); 或者 var num = new Number(100);
当我们运行alert("100" == 100)的时候,会发现返回的结果是true。但千万不要以为字符串的"100"和数值的100就是完全相等了。这是JavaScript的灵活性带来的一个不严谨的小问题,因为JavaScript在进行比较运算时会尝试将数值转成字符串然后再比较。当数值和字符串混合操作时(尤其是相加时),我们如果不小心数据类型往往会在这里留下bug。例如:
var num1 = "100", num2 = 100;
var result1 = num1 + num2 ; // 运行结果是"100100"
var result2 = num1 - num2 ; // 运行结果是0
alert (num1.length); // 运行结果是2
alert (num2.length); // 运行结果是undefined
所以我们在进行字符和数值混合运算时,要养成先显式转化数据类型在运算的习惯。转化方式如:
num2.toString(); //数值型转换成字符串型
parseInt(num1); //返回由字符串转换得到的整数
parseFloat(num1); //返回由字符串转换得到的浮点数
我们可以使用isNaN()方法来测试一个字符串能不能转换成数值,如果isNaN(string)返回true则不能转换;返回false则可以。
3.3、布尔值
对于一个布尔变量来说,它的取值只有两种可能,不是真(true)就是假(false)。布尔变量声明如下:
var boolObj = false;
布尔值不需要包含在引号内,例如用引号把false括住,它就会变成字符串,而非空的字符串就是真,这样以下语句就会弹出警告框。
if ("false") { alert ("haha") ;}
在JavaScript中,除了null、false、空字符串""、0、NaN、undefined是假以外,其他都是真的。所以当一个布尔变量声明后但却没有被赋值,则它的值是null,也就是假。
布尔变量也可以用new运算符来创建,这样就可以将字符串"true"转换成true了。如
var boolObj = new Boolean("true"); // 结果返回true
3.4、数组
以上几种数据类型都只能存储单值,数组可以在一个变量中存储多个值,数组中的每个值它叫做成员。数组的声明可以用new关键字,也可以用一个中括号。当数组有多个成员时,成员之间用逗号分隔,数组的成员可以是任意数据类型混合的。如:
var arr = new Array("gerry", 18);
var arr = ["gerry", 18];
当把数组的声明和赋值写在一起时,每个成员就自动赋予一个索引。一个索引就是一个自然数,用于标明成员在数组中的位置。如果声明数组后再赋值,就需要为每个成员明确提供索引。如:
var fruit = [];
fruit[0] = "apple";
fruit[1] = "orange";
fruit[5] = "banana";
fruit[-1] = "lemon";
JavaScript的数组的索引是自然数,也就是说索引是从0开始的。那上面我们给fruit[-1]赋值会造成什么结果呢?经过运行,程序没有报错,而且alert(fruit[-1] )也能正确返回值,但是alert(fruit.length)却返回6,说明fruit[-1] 已经被剔除出fruit数组了。
JavaScript的数组还可以使用字符串作为数组的索引,这种数据叫做关联数组,或者称为散列。如:
var fruit = [];
fruit["apple"] = "apple1";
fruit["orange"] = "orange1";
fruit["banana"] = "banana1";
我们运行alert(fruit["apple“] )也能正确返回"apple1",但是alert(fruit.length)却返回0,所以这种数组其实已经不能算是数组了。当然也不能使用数组变量的通用属性和方法:
constructor 属性 | length 属性 | prototype 属性
concat 方法 | join 方法 | pop 方法 | push 方法 | reverse 方法 | shift 方法 | slice 方法 | sort 方法 | splice 方法 | toLocaleString 方法 | toString 方法 | unshift 方法 | valueOf 方法
4、运算符
4.1、算术
JavaScript的算术运算符包括加“+”、减“-”、乘“*”、除“/”、求余“%”、自增“++”、自减“--”。其中“+”比较特殊,它还有一个特别的功能是可以拼接字符串,当字符串和数字相加时,数字会自动转化成字符串再进行拼接。如:
var s = 100 + 9 + "s" + 2; // 结果返回109s2
4.2、比较
JavaScript的比较运算符包括大于“>”、小于“<”、等于“==”、不等于“!=”、大于等于“>=”、小于等于“<=”、恒等于“===”、不恒等于“!==”。其中等于“==”和恒等于“===”的区别是是否绝对相等。他们的区别主要用来解决JavaScript灵活的自动转换性带来的不严谨。比如:
alert("100" == 100); // 返回ture
alert("100" === 100); // 返回false
alert("" == 0); // 返回ture
alert("" === 0); // 返回false
4.3、逻辑
JavaScript的逻辑运算符包括取反“!”、逻辑或“||”、逻辑与“&&”。如:
alert(1 - 1 || !(2 > 1)); // 返回false。
4.4、三元
JavaScript也有三元运算符,如:( a > b ) ? "result1" : "result2" 。其中如果a>b返回true则整个表达式返回result1,如果a>b返回false则整个表达式返回result2。
4.5、if
if 语句是最常见的控制结构之一。其如:
if ( a > b ) { /* do something */ }
其中关键字if后的圆括号里就是比较操作,只有比较的结果为true,才会执行大括号里的操作。
if 语句还可以使用else进行扩展,使得比较的结果为false时,可以执行else后面大括号里的操作。如:
if ( a > b ) { /* do something */ }
else{ /* do something */ }
5、循环
if 语句是条件控制结构的一种。另一种控制结构用于反复执行同段代码,这种结构叫做循环。
5.1、while
while语句看起来有点像if。它们的不同之处在于只要条件判断为true,大括号里的语句就会反复执行。如:
while ( a > b ) { /* do something */ }
5.2、do...while
控制结构do...while与while很像。不同之处为do...while大括号中的语句至少会被执行一次。如:
do { /* do something */ } while ( a > b ) ;
5.3、for
在for循环控制结构中,圆括号里包含3条语句:初始化语句、条件测试语句和变更语句,它们彼此用分号分隔。其中每条语句又可以有多条小语句组成,其用逗号分隔。如:
for (var i = 0, j= 10; i<4 || j > 8 || i - j > 2; i ++, j-=2) { /* do something */ }
5.4、for...each
for...each循环控制结构主要用于一个对象的每个,或一个数组的每个元素,执行一个或多个语句。 如:
var a = [1,2,3,4,5,"s"],s = "", key;
for (key in a){s += a[key];}
alert(s); // 结果返回12345s
6、函数
7、对象
7.1、内置对象
7.2、用户自定义对象
7.3、宿主对象