JavaScript教程
01章 JavaScript入门JavaScript具有相当强大的页面处理能力,是衡量一个程序员水平高低的重要标志。学习JavaScript首先要了解JavaScript的“对象(object)、 类(class)、对象标识(id)、对象名称(name)” 等重要概念之间的区别,熟练掌握基本语法。学习JavaScript之前必须首先学会HTML和CSS。仅仅从网上搜索下载一些技巧便认为自己掌握了JavaScript的人决非是标准的程序员,只会通过一些工具而不懂概念语法之人, 决不是一位好程序员,甚至根本够不上程序员的资格。不同的浏览器所支持的JavaScript的语法和功能也略有不同,不同的JavaScript版本之间也同样有功能区别, 甚至浏览器的不同版本之间也会有升级的问题。因此这儿只以IE6.0为基准来介绍。JavaScript的写法<script type="text/javascript"><!--JavaScript语句<noscript>不支持JavaScript的注释。</noscript>//--></script><!--...//-->是HTML的注释,JavaScript的注释和Java相同,单行注释//,多行注释用/*...*/。大小文字也是有区别的。JavaScript的版本选择<script language="javascript1.2"><!--JavaScript语句// --></script>这是HTML4.1以前的写法,现在一般不用language属性,而用type属性JavaScript保存到外部文件<script type="text/javascript" src="../test.js"></script>src属性后的内容是带路径的文件名,后缀一般用.js。如果保存在多个文件中,可重复使用这一语句。JavaScript对事件操作的声明<meta http-equiv="Content-Script-Type" content="text/javascript">如果要用onClick等事件时,必须用meta元素的http-equiv来声明其属性值为:Content-Script-Type。JavaScript嵌在HTML中的写法<input type="button" value="Click Me!!" onclick="window.alert('Hello!!');"><a href="javascript:alert('Hello!!');">Click Me</a>如果要用onClick等事件时,必须用meta元素的http-equiv来声明其属性值为:Content-Script-Type。JavaScript执行时序<html><head><script type="text/javascript">alert(documet.title);</script><title>My test</title><script type="text/javascript">alert(documet.title);</script></head><body><script type="text/javascript">alert(document.myFrm.test.value);</script><form name_myFrm><input name="test" value="My Test"></form><script type="text/javascript">alert(document.myFrm.test.value);//--></script></body></html>上例中粉红色是错的,兰色才是正确的。当Html文中的对象还没有出现时就被使用,这显然不正确。02章 概念的理解学习JavaScript首先要了解JavaScript的“对象(object)、 类(class)、对象标识(id)、对象名称(name)、动态页面(DynamicPage)” 等重要概念之间的区别,熟练掌握基本语法。学习JavaScript之前必须首先学会HTML和CSS。对象对象主要包括Html中各Tag对象和JavaScript中用于运算控制的诸如String对象、Date对象等。Html文中的一段文字本身不是对象,但用Tag如<B>...</B>将文字括起来,这就变成了对象,也就可以对其进行操作。如果对某一段Html文你不需要用特殊意义的Tag括起来时,可以用<div></div>或<span></span>来将Html文括起来进行控制。对象标识每个对象内部都可指定一个标识符,JavaScript便可用来对其进行控制。<span id="code01">Sample1</span><p id="code01">Sample2</p><font id="code03" color="red">Sample2</font><input id="code04" type="button" onClick="func1();">对象名称与服务器处有数据交换的对象基本都有name属性,如:<img>、<a>、<input>、<form>等。HTTP在传送数据时将name一道打包在requst或response里面。而ID是纯客户端的东西,服务器端无法根据ID来取得数据。<a name="n01" href="test.html">Sample1</a><input name="n02" type="text" value="test">classclass是CSS的内容,是用来控制对象的位置、尺寸、段落、字体、颜色等。学习JavaScript重点就是要控制这些内容。.title { font-size: medium; margin: 0; padding: 0.3em; color: #ffffff; background-color: #000000;}动态页面动态页面是指用JavaScript对Html文(即页面)的对象的CSS属性值进行控制,从而达到页面能动态地变化的效果。方法和属性属性和方法相当于谜题和函数,变量和函数是对整个程序而言,方法和属性是对对象而言。属性和方法被引用时,前面要加对象。当所处的位置正是该对象内时,对象吸以省略。window.alert("Hello"); // 对话框navigator.appName // 浏览器的名称03章 运算符JavaScript的运算符与Java基本相同,因为是Script,在数据类型的限制方面要松散的多。赋值、加减乘除、余除“=、+、-、*、/、%”分别代表“赋值、加减乘除、余除”xx = 3 + 2; // xx的值为 5xx = 3 - 2; // xx的值为: 1xx = 3 * 2; // xx的值为: 6xx = 3 / 2; // xx的值为: 1.5xx = 3 % 2; // xx的值为: 1增1减1“++a、a++、--a、a--”分别代表“前增1、后增1、前减1、后减1”a = 5; b = a++; // a的值为: 6、b的值为: 5a = 5; b = ++a; // a的值为: 6、b的值为: 6a = 5; b = a--; // a的值为: 4、b的值为: 5a = 5; b = --a; // a的值为: 4、b的值为: 4字符串运算作为运算符只有“+”来连接2个字符串,至于查找、截取等功能要用字符串类的各种方法实现。注意:字符串与其它类型相加时,其它类型将被自动转换为字符串类型,再相加。xx = "abcd" + "xyz" //xx的值为: "abcdxyz"xx = "1234" + 56 //xx的值为: "123456"var dd = new Date(1999, 11, 31);xx = "今天是=" + dd //xx的值为: "今天是=Fri Dec 31 00:00:00 UTC+0900 1999"逻辑运算符“&&、||、!”分别表示“与、或、非”if ((1 <= mon) && (mon <= 12)) { alert("xx is between 1 and 12.");}if ((xx == "ABC") || (xx == "abc")) { alert("xx is ABC.");}if (!(xx == 5)) { alert("xx is not five.");}位运算符“&、|、^、~”分别表示“与、或、异或、取反”xx = 0x87654321 & 0xffff0000; // xx的值为 0x87650000xx = 0x87654321 | 0xffff0000; // xx的值为 0xffff4321xx = 0xffff0000 ^ 0xff00ff00; // xx的值为 0x00ffff00xx = ~0xffff0000; // xx的值为 0x0000ffff“<<、>>、>>>”分别表示“左移、右移、补0右移”xx = 0x12345678 << 8; // xx的值为 0x34567800xx = 0x12345678 >> 8; // xx的值为 0x00123456xx = 0x87654321 >> 8; // xx的值为 0xff876543xx = 0x87654321 >>> 8; // xx的值为 0x00876543比较运算符相等(==)、不等(--)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)if (xx == 5) { alert("xx is five.");}if (yy != "ABC") { alert("yy is not ABC.");}if (xx == null) { alert("xx is Null.");}if (yy != null) { alert("yy is not Null.");}if (xx < 123) { alert("xx is smaller than 123");}当类型不一致时,将被自动转换为字符串类型。如果不需要自动转换,可以用“===和!==”来代替“==”和“!=”。if ( 123 == 123 ) { ... } // true(真)if ("123" == "123") { ... } // true(真)if ("123" == 123 ) { ... } // true(真)if ( 123 == "123") { ... } // true(真)if ( 123 === 123 ) { ... } // true(真)if ("123" === "123") { ... } // true(真)if ("123" === 123 ) { ... } // false(假)if ( 123 === "123") { ... } // false(假)复合运算符加减乘除并赋值(+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=、>>>=)xx += 5; // xx = xx + 5;xx -= 5; // xx = xx - 5;xx *= 5; // xx = xx * 5;xx /= 5; // xx = xx / 5;xx %= 5; // xx = xx % 5;xx &= 0xff; // xx = xx & 0xff;xx |= 0xff; // xx = xx | 0xff;xx ^= 0xff; // xx = xx ^ 0xff;xx <<= 8; // xx = xx << 8;xx >>= 8; // xx = xx >> 8;xx >>>= 8; // xx = xx >>> 8;条件运算符“exp1 ? exp2 : exp3”这和Ifelse语句相同功能但用法不同,这是运算符。yy = (xx >= 5) ? "big" : "small"; //若xx>5,则yy的值为: "big"; 若xx<=5,则yy的值为: "small"逗号分隔符主要用于函数的参数之间分隔,for循环语句中也用来分隔语句。for (i = 0, j = 0; i < 10; i++) { ......}null时注意当对象为null时,该对象的方法和属性都不能使用,要特别注意。运算符的优先顺序优先顺序运算符↑高低↓数组([]) 括弧(( ))増1減1(++ --) 负号(-) 取反(~) 非(!)乗除余(* / %)加減(+ -) 文字列连接(+)位移(<< >> <<<)比较(< <= >= >)比较(== != === !==)AND(&)XOR(^)OR(|)与(&&)或(||)条件(? :)赋值(=) 复合(+=等)逗号(,)04章 基本语法JavaScript的流程控制语法基本与Java类似。当控制语句部分只有一句时,{}可以省略。条件分支(if...else...)if (条件) { ......} else if (条件) { ......} else { ......}if (n < 10) { alert("SMALL");}if (n < 10) { alert("SMALL");} else { alert("BIG");}if (n < 10) { alert("SMALL");} else if (n > 20) { alert("BIG");} else { alert("NORMAL");}条件分支(switch)switch (表达式) {case 表达式的值1: ... break;case 表达式的值2: ... break;default: ... break;}switch (xx) {case 1: alert("ONE"); break;case 2: alert("TWO"); break;case 3:case 4: alert("THREEorFOUR"); break;default: alert("OTHER"); break;}循环(while)while (条件) { ......}n = 0;while (n < 10) { document.write(n); n++;}循环(do)do { ......} while (条件)n = 0;do { document.write(n); n++;} while (n < 10);循环(for)for (初始条件; 终止条件; 条件改变语句) { ......}for (i = 0; i < 10; i++) { document.write(i);}for (variable in array) { //数组的情况下,也可这样使用 ......}xx = new Array(3);xx[0] = "A";xx[1] = "B";xx[2] = "C";for (i in xx) { document.write(xx[i]);}中断(break)break; //跳到循环结束之后break label; //跳到循环外的某个标签处for (i = 0; i < 10; i++) { if (i == 5) { break; } document.write(i);}abc:for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { xx = i * 10 + j; if (xx > 20) { break abc; } document.write(xx + "<br>"); }}继续下一轮循环(continue)continue; //跳到循环内的开始处continue label; //跳到某个标签处(循环内外都可以)for (i = 0; i < 10; i++) { if (i == 5) { continue; } document.write(i);}abc:for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { xx = i * 10 + j; if (xx > 20) { continue abc; } document.write(xx + "<br>"); }}对象操作(with)with (对象) { ......}with (document) { write(bgColor); write(fgColor);}05章 数据类型虽然JavaScript没有明确地区分类型,我们仍要搞清楚以下几点:数值型和字符串型是最常见的基本类型、字符串同时作为对象处理的。日期型也是作为对象来处理的。布尔型一向简单,而数组需要重点掌握。数值型JJavaScript的数值型包括10进制、8进制、16进制、实数、小数、整数等都可以使用。O开头的整数是8进制,0x开头的整数是16进制。12345 // 10进制的123451.23 // 实数的 1.231.23e4 // 1.23 × 10的4次方1.23E4 // 1.23 × 10的4次方012 // 8进制的12(10进制的10)0x1b // 16进制的1B(10进制的27)字符串型字符串的内容很多,专门作为一章来学习。这儿简单一提。str = "这是字符串";布尔型布尔型只有2个值:true和false。 True、TRUE、False、FALSE等都是错误的写法。作为条件比较时要特别注意:◆ 数值的0和-0,特殊变量的null、false、NaN、undefined、空字符串("")都作为false处理◆ 其它都作为true处理xx = (3 = 4); //xx的值为: falsexx = (100 > 50); //xx的值为: true日期型日期型的内容也较多,专门作为一章来学习。这儿简单一提。dd = new Date(1999, 11, 31, 23, 59, 59, 999);数组型严格地说数组不能算基本数据类型,数组在任何语言中都是必须掌握的。xx = new Array(3); xx[0] = "Sun"; xx[1] = "Mon"; xx[6] = "Sat"; yy = new Array("Sun", "Mon", "Thu");对象类用java的思想来说,一切都是类。事实上数值型和布尔型也都封装了相应的类,即Number和Boolean。因过于简单,不用也罢。xx = new Number(123); //等价于: xx = 123;xx = new Number("123"); //等价于: xx = palseInt("123");xx.toString(); //转换成字符串,事实上,在使用时JavaScript会自动转换。xx.toString(16); //转换成16进制的字符串: 7Byy = new Boolean(true); //等价于: yy = true;另外,Number类中封装了一些可以直接使用的常数。Number.NaN //不正确的数值Number.MAX_VALUE //JavaScript可用的最大数Number.MIN_VALUE //JavaScript可用的最小数Number.POSITIVE_INFINITY //JavaScript正数无穷大Number.NEGATIVE_INFINITY //JavaScript负数无穷小常量null 空undefined 未定义NaN 非数值Infinity 无穷大数值JavaScript将所有整数和小数都转换为浮点小数,当用不正确的类型数据进行数学运算时就转换成NaN正数大到JavaScript无法表示时,便转换成Positive Infinity负数小到JavaScript无法表示时,便转换成Negative InfinityavaScript是区分正0和负0的。null不属于任何一种数据类型,表示“没有值”。你可以将null赋给某一变量,这等于删除这个变量的值,但却保留这个变量的定义。。当null参于运算时便产生undefined结果。06章 字符串类型字符串类型在在在论何语言都是很重要的,JavaScript中的字符串替换功能要用到正则表达式,必须熟练掌握。新建字符串几乎所有类型都自动转换为字符串。字符串既可以用String类来生成,也可以用各种类型的对象的toString()方法来转换。xx = "abc";xx = new String("abd"); //String类yy = 123;xx = yy.toString(); //Integer类的toString()方法yy = new Date(2004,11,25);xx = yy.toString(); //Date类的toString()方法xx = "abc" + 123 + "xyz"; //123自动转换为字符串转意字符以下的转意字符要注意。例:在对话框中输出2行文字:alert('你好!\n欢迎光临。');\n - 换行\r - 回车\f - フォームフィード\b - 退格字符\t - Tab字符\' - 单引号(')\" - 双引号(")\\ - 反斜杠(\)\nnn - 8进制(例 "A" 写成: "\101")\xnn - 16进制(例 "A" 写成: \x41")\unnnn - Unicode字符(例 "あ" 写成: "\u3042")字符串的长度string.length //取字符串的长度,汉字和英数字都作为1个Unicode字符。xx = "abc五笔字型".length; //xx的值为: 7xx = "abc\n五笔字型".length; //xx的值为: 8取字符串的部分内容string.charAt(n) //取第n个字符xx = "abcd".charAt(2) //xx的值为: "c"xx = "静坐常思自己过".charAt(2) //xx的值为: "常"string.substring(from,to) //取从from到to的字符串(不包含第to个字符)string.substring(from) //取从from开始到最后的字符串 //注:负数当作0处理,超过长度时,超过部分忽略不计。dd = "静坐常思自己过".substring(2) //xx的值为: "常思自己过"dd = "静坐常思自己过".substring(0,2) //xx的值为: "静坐"dd = "静坐常思自己过".substring(-5,2) //xx的值为: "静坐"dd = "静坐常思自己过".substring(0,-2) //xx的值为: ""dd = "静坐常思自己过".substring(2,20) //xx的值为: "常思自己过"dd = "静坐常思自己过".substring(2,-7) //xx的值为: "静坐"string.substr(from, len) //取从from的len个字符串 //注:from是负数时,则从右向左取数。len为负数时作0处理。dd = "静坐常思自己过".substr(2) //xx的值为: "常思自己过"dd = "静坐常思自己过".substr(1,3) //xx的值为: "坐常思"dd = "静坐常思自己过".substr(-2) //xx的值为: "己过"dd = "静坐常思自己过".substr(1,12) //xx的值为: "坐常思自己过"dd = "静坐常思自己过".substr(1,-2) //xx的值为: ""string.slice(from [, to]) //注:当from为0或正数时,与substring完全相同。from为0或负数时,则从右向左取数。dd = "静坐常思自己过".substring(2) //xx的值为: "常思自己过"dd = "静坐常思自己过".substring(-1,3) //xx的值为: "自己"字符串的分割与连接string.split(sep [,limit]) //将字符串按sep分割limit次。 //注:sep不指定时,返回整个字符串,limit为负数时,等同不指定。xx = "aa:bb:cc:dd:ee:ff".split(":"); //结果: xx[0] = "aa"; xx[1] = "bb"; xx[2] = "cc"; // xx[3] = "dd"; xx[4] = "ee"; xx[5] = "ff";xx = "aa:bb:cc:dd:ee:ff".split(":", 2); //结果: xx[0] = "aa"; xx[1] = "bb";xx = "aa:bb:cc:dd:ee:ff".split(":", -2); //结果: xx = "", 等同于split(":",0)。string.concat(string2) //连接字符串,与+功能相同。xx = "谦受益".concat("满招损"); //等价于: xx = "谦受益"+"满招损";字符串的查找string.indexOf(key[,from]) //从from个字符开始查找字符串按key。 //注:若找不到,则返回-1。找到则返回所在的位置。xx = "abcdefABCDEF".indexOf("CD"); //xx的值为: 8xx = "abcdefABCDEF".indexOf("cd",2); //xx的值为: 2xx = "abcdefABCDEF".indexOf("cd",3); //xx的值为: -1string.lastIndexOf(key[,from]) //从from个字符开始向左查找字符串按key。 //注:若找不到,则返回-1。找到则返回所在的位置。xx = "abcdefabcdef".lastIndexOf("cd"); //xx的值为: 8xx = "abcdefabcdef".lastIndexOf("cd",7); //xx的值为: 2xx = "abcdefabcdef".lastIndexOf("cd",0); //xx的值为: -1字符串的替换string.replace(regexp,newString) //string的内容中与regexp正则表达式相符的部分替换成newString。 //注:必须具备正则表达式的知识。xx = "abcdefABCDEF".replace("def","xyz"); //xx的值为: "abcxyzABCDEF"string.toUpperCase() //英文大写string.toLowerCase() //英文小写xx = "abcdefABCDEF".toUpperCase(); //xx的值为: ABCDEFABCDEFxx = "abcdefABCDEF".toLowerCase(); //xx的值为: abcdefabcdef正则表达式的使用string.match(regexp) //返回与正则表达式匹配的字符串xx = "abcdefABCDEF".match(/def/i); //xx的值为: "def"xx = "abcdefABCDEF".match(/xyz/i); //xx的值为: nullstring.match(regexp) //返回与正则表达式匹配的字符串的位置,找不到返回-1xx = "abcdefABCDEF".match(/def/i); //xx的值为: 3xx = "abcdefABCDEF".match(/xyz/i); //xx的值为: -1字符串与字符的变换string.charCodeAt(n) //取第n个字符xx = "abcdefABCDEF".charCodeAt(2); //xx的值为: "c"xx = "abcdefABCDEF".charCodeAt(-1); //xx的值为: NaNxx = "abcdefABCDEF".charCodeAt(20); //xx的值为: NaNString.fromCharCode(num1, ... , numN) //将N个字符转换为字符串xx = String.fromCharCode(0x41, 0x42, 0x43); //xx的值为: "ABC"xx = String.fromCharCode("A", "B", 0x43); //JavaScript出错字符串与其它类型的变换ParseInt(string) //字符串转换为整型ParseFloat(string) //字符串转换为浮点型Eval(string) //取第n个字符xx = "abcdefABCDEF".charCodeAt(2); //xx的值为: "c"xx = "abcdefABCDEF".charCodeAt(-1); //xx的值为: NaNxx = "abcdefABCDEF".charCodeAt(20); //xx的值为: NaNString.fromCharCode(num1, ... , numN) //将N个字符转换为字符串xx = String.fromCharCode(0x41, 0x42, 0x43); //xx的值为: "ABC"xx = String.fromCharCode("A", "B", 0x43); //JavaScript出错字符串转换成带Tag修饰string.bold() //<b>string</b>string.italics() //<i>string</i>string.fixed() //<tt>string</tt>string.big() //<big>string</big>string.small() //<small>string</small>string.blink() //<blink>string</blink>string.strike() //<strike>string</strike>string.sup() //<sup>string</sup>string.sub() //<sub>string</sub>string.fontcolor(color) //<font color=color>string</font>string.fontsize(size) //<font size=size>string</font>string.anchor(name) //<a name=name>string</a>string.link(name) //<a href=name>string</a>xx = "abcdefABCDEF".fixed(); //xx的值为: "<fix>abcdefABCDEF</fix>"07章 日期类型同样,日期类型也是非常重要的数据类型,必须熟练掌握。新建日期date = new Date(...); //...部分是:“年、月、日、时、分、秒”的组合,数字和字符串皆可。 //注:月份是0~11,而不是1~12。 //全部缺省,则表示当前年月日时分秒 //只有年份,则表示1970年01月01日 09:00:00 //只有年月,则日用01表示,时分秒则用00:00:00表示 //只有年月日,则时分秒则用00:00:00表示dd = new Date(0,0); //dd的结果: Mon Jan 1 00:00:00 UTC+0900 1900dd = new Date(99,12); //dd的结果: Thu Jan 1 09:00:02 UTC+0900 1970 (年份无效)dd = new Date("2004",10); //dd的结果: Mon Nov 1 00:00:00 UTC+0900 2004dd = new Date(2004,10,21);//dd的结果: Sun Nov 21 00:00:00 UTC+0900 2004注:年份为0~99时,则年份自动加上1900,变成:1900~1999dd = new Date(0,0); //dd的结果: Sun Nov 21 21:16:38 UTC+0900 2004dd = new Date(99,11); //dd的结果: Wed Dec 1 00:00:00 UTC+0900 1999dd = new Date(99,0); //dd的结果: Fri Jan 1 00:00:00 UTC+0900 100dd = new Date(9999,11); //dd的结果: Wed Dec 1 00:00:00 UTC+0900 9999注:时刻省略时,则用0代替,微秒也可以表示。dd = new Date(2004,0,1,23); //dd的结果: Thu Jan 1 23:00:00 UTC+0900 2004dd = new Date(2004,0,1,23,59); //dd的结果: Thu Jan 1 23:59:00 UTC+0900 2004dd = new Date(2004,0,1,23,59,59); //dd的结果: Thu Jan 1 23:59:59 UTC+0900 2004dd = new Date(2004,0,1,23,59,59,999);//dd的结果: Thu Jan 1 23:59:59 UTC+0900 2004字符串的日期格式dd = new Date("1999/12/31 23:59:59"); //1999年11月31日 星期5 23:59:59dd = new Date("Dec 31, 1999 23:59:59"); //同上dd = new Date("December 31, 1999 23:59:59"); //同上dd = new Date("1999-12-31 23:59:59"); //不正确,这与Windows控制面板中的设置有关日期信息的取得和设置date.getFullYear() //取得日期的年(YYYY)date.setFullYear(year) //date.getYear() //取得日期的年:1900~1999年,则返回YY,其它返回YYYYdate.setYear(year) //date.getMonth() //取得日期的月(MM)date.setMonth(mon) //date.getDate() //取得日期的日(DD)date.setDate(date) //date.getDay() //取得日期的星期(WEEK)date.getHours() //取得日期的时(HH)date.setHours(hour) //date.getMinutes() //取得日期的分(MI)date.setMinutes(min) //date.getSeconds() //取得日期的秒(SS)date.setSeconds(sec) //date.getMilliseconds() //取得日期的微秒(MS)date.setMilliseconds(msec) //dd = new Date(1985,4,19,23,59,30,999);yyyy = date.getFullYear() 了 //结果为: 1985yy = date.getYear() //结果为: 85mm = date.getMonth() //结果为: 4 (五月)dd = date.getDate() //结果为: 19ww = date.getDay() //结果为: 0 (星期日)hh = date.getHours() //结果为: 23mi = date.getMinutes() //结果为: 59ss = date.getSeconds() //结果为: 30ms = date.getMilliseconds() //结果为: 999dd.setFullYear(2004); //结果为: Wed May 19 23:59:30 UTC+0900 2004国际标准时的取得和设置date.getUTCFullYear() //取得日期的年(YYYY)date.setUTCFullYear(year)date.getUTCYear() //取得日期的年:1900~1999年,则返回YY,其它返回YYYYdate.setUTCYear(year)date.getUTCMonth() //取得日期的月(MM)date.setUTCMonth(mon)date.getUTCDate() //取得日期的日(DD)date.setUTCDate(date)date.getUTCDay() //取得日期的星期(WEEK)date.getUTCHours() //取得日期的时(HH)date.setUTCHours(hour)date.getUTCMinutes() //取得日期的分(MI)date.setUTCMinutes(min)date.getUTCSeconds() //取得日期的秒(SS)date.setUTCSeconds(sec)date.getUTCMilliseconds() //取得日期的微秒(MS)date.setUTCMilliseconds(msec)dd = new Date(1985,4,1,1,59,30,999);d1 = dd.getMonth()+"月"+dd.getDate()+"日 星期"+dd.getDay() //4月1日 星期3t1 = dd.getHours()+":"+dd.getMinutes()+":"+dd.getSeconds() //1:59:30d2 = dd.getUTCMonth()+"月"+dd.getUTCDate()+"日 星期"+dd.getUTCDay() //3月30日 星期2t2 = dd.getUTCHours()+":"+dd.getUTCMinutes()+":"+dd.getUTCSeconds() //16:59:30国际时差date.getTimezoneOffset()返回日期对象采用的时区与格林威治时间所差的分钟数。在格林威治东方的市区,该值为负,例如:中国时区(GMT+0800)返回“-480”。 注:Date 日期对象。这个对象可以储存任意一个日期,从 0001 年到 9999 年,并且可以精确到毫秒数(1/1000 秒)。 在内部,日期对象是一个整数,它是从 1970 年 1 月 1 日零时正开始计算到日期对象所指的日期的毫秒数。 如果所指日期比 1970 年早,则它是一个负数。所有日期时间,如果不指定时区,都采用“UTC”(世界时)时区, 它与“GMT”(格林威治时间)在数值上是一样的。(GMT-12:00) 国际换日线以西, 瓜加林岛(GMT-11:00) 中途岛, 萨摩亚(GMT-10:00) 夏威夷(GMT-9:00) 阿拉斯加(GMT-8:00) 太平洋時区 (美 & 加)(GMT-7:00) 山区時間 (美 & 加)(GMT-6:00) 中央時間 (美 & 加), 墨西哥(GMT-5:00) 东部時間 (美 & 加), 波哥大, 利马, 基多(GMT-4:00) 大西洋 時区 (加), 卡拉卡斯(委內瑞拉), 拉巴斯(玻利维亚)(GMT-3:30) 纽芬兰(GMT-3:00) 巴西利亚, 布宜諾艾利斯, 佐治敦(GMT-2:00) 大西洋中部(GMT-1:00) 亚速尔群岛, 维德角群岛(GMT) 格林威治中央標準時間, 伦敦, 都柏林, 里斯本, 卡萨布兰卡, 蒙罗维亚(GMT+1:00) 中西非, 柏林, 罗马, 斯德哥尔摩, 布魯賽尔, 马德里, 巴黎(GMT+2:00) 布加勒斯特, 哈拉雷, 皮托里, 耶路撒冷, 开罗, 南非(GMT+3:00) 巴格达, 科威特, 利雅德, 莫斯科, 聖彼得堡(GMT+3:30) 德黑兰(GMT+4:00) 巴库, 第比利斯, 葉里溫, 阿布达比(GMT+4:30) 喀布尔(GMT+5:00) 伊卡特林堡, 伊斯兰马巴德, 克洛其, 塔什干(GMT+5:30) 辰內, 加尔各答, 孟拜, 新德里(GMT+6:00) 阿马提, 达卡, 可伦坡(GMT+7:00) 曼谷, 河內, 雅加达(GMT+8:00) 北京,台湾,香港,新加坡,伯斯,乌兰巴突(GMT+9:00) 东京, 汉城, 大阪, 札幌, 亚库次克(GMT+9:30) 爱德蓝, 达尔文(GMT+10:00) 布里斯本, 坎培拉, 墨尔本, 雪梨, 海参威(GMT+11:00) 马加丹, 所罗門群岛, 新加勒多尼亚(GMT+12:00) 奧克兰(纽西兰),威灵頓(纽西兰首都),斐济,堪察加半岛,马绍尔群岛现在当地时间: 2021.06.19 星期一 1:26:07日期与字符串的转换date.toString() //转换为字符串,这与自动转换结果相同 date.toLocaleString() //转换为当地格式的字任串 date.toGMTString() //转换为GMT格式的字任串 date.toUTCString() //转换为UTC格式的字任串dd = new Date("1999/12/31 23:59:59");xx = dd.toString() //xx的值为: "Fri Dec 31 23:59:59 UTC+0900 1999"xx = dd.toLocaleString() //xx的值为: "1999年12月31日 23:59:59"xx = dd.toGMTString() //xx的值为: "Fri, 31 Dec 1999 14:59:59 UTC"xx = dd.toUTCString() //xx的值为: "Fri, 31 Dec 1999 14:59:59 UTC"日期与数的转换为了说明方便,此处将“1970年1月1日0时0分0秒(UTC)开始的微秒数”称为“绝对时间”date.getTime() //取得“绝对时间”date.setTime(time) //设置“绝对时间”date.UTC(year,mon,day,hour,min,sec) //取得指定日期的“绝对时间”date.parse(string) //转换“绝对时间”成日期dd = new Date("1970/1/1 00:00:59");xx = dd.getTime() //xx的值为: -32341000xx = dd.setTime(24*3600) //xx的值为: "Fri Jan 2 09:00:00 UTC+0900 1970"08章 数组JavaScript中没有多维数组,只有一维数组。因为数组成员的类型是任意,所以,可以对每一个数组成员再赋给它一个数组的方式来解决。数组的基数从0开始。新建数组array = new Array() //定义一个数组。其元素个数为0array = new Array(n) //定义一个数组。其元素个数为narray = new Array(e1, e2, ...) //定义一个数组,对其每个元素赋上初值 //注:JavaScript中数组元素的个数可以任意增加xx = new Array(); //xx的长度是0xx[0] = "January"; //xx的长度变为1xx[1] = "February"; //xx的长度变为2xx[11] = "December"; //xx的长度变为12也可以在新建数组时直接赋值yy = new Array("January", "February", null, null, null, null, null, null, null, null, null, "December");//结果与上例相同//数组的序号也可以用字符串代替, 但排序可能有问题xx = new Array();xx["Jan"] = "January";xx["Feb"] = "February";xx["Dec"] = "December";数组的元素再定义成数组, 便可以产生多维数组或树形数组xx = new Array(3); //结果:for (i = 0; i < xx.length; i++) { //xx[0][0]=0 xx[1][0]=10 xx[2][0]=20 xx[i] = new Array(4); //xx[0][1]=1 xx[1][1]=11 xx[2][1]=21 for (j = 0; j < xx[i].length; j++) { //xx[0][2]=2 xx[1][2]=12 xx[2][2]=22 xx[i][j] = i * 10 + j; //xx[0][3]=3 xx[1][3]=13 xx[2][3]=23 } //} //--------------------------------------------------------------------------------------//以下是九九乘法表的例子xx = new Array(9);for (i = 0; i < xx.length; i++) { xx[i] = new Array(i+1); for (j = 0; j < i+1; j++) { xx[i][j] = (i+1) * (j+1); }}数组长度的取得array.lengthyy = new Array("Sun", "Mon", "Thu");len = yy.length; //len的值为: 3数组的连结array.concat(array2, ...) //两个数组的连接xx = new Array("Sun", "Mon", "Tue", "Wed");yy = new Array("Thu", "Fri", "Sat");zz = xx.concat(yy); //zz的值: "Sun", ...., "Sat"array.join([separator]) //用分隔符将数组个元素连接起来xx = new Array("2004", "12", "07");yy = xx.join("/"); // yy的值: "2004/12/07"数组的排序array.sort(); //按升序排序array.reverse(); //按降序排序xx = new Array(9,1,7,3);xx.sort(); //xx的结果是: 1,3,7,9xx.reverse(); //xx的结果是: 9,7,3,1array.sort([func]); //这是一个让人笑掉大牙的排序function sortMethod(a, b) { //先定义一个函数,函数名任意起名 return a - b; //参数必须2个,参数名任意起名} //数组内部比较时根据return值来决定//其它资料说:“正数:升序 0:不排序 负数:降序” --错误的说法//“参数1-参数2:升序 0:不排序 参数2-参数1:降序” --正确的说法xx = new Array(9,1,7,3);xx.sort(sortMethod); //xx的结果是: 1,3,7,9//将上面改成: return b-a; //xx的结果是: 9,7,3,1//将上面改成: return b-b; //xx的结果是: 9,1,7,3取数组的子集array.slice(start [, end]) //start到end的子集,end没有则到最后xx = new Array("A", "B", "C", "D""E", "F", "G");xx.slice(3); //xx的结果: "D", "E", "F", "G"xx.slice(1,3); //xx的结果: "B", "C", "D"序列化array.toString() //所有的类几乎都有toString方法。xx = new Array("A", "B", "C", "D", "E", "F", "G");xx.toString(); //xx的结果: "A, B, C, D, E, F, G"09章 数学函数JavaScript的数学函数全部封装在Math类里面,虽然使用频率不是太高,但却是必不可少的。常量Math.PI //圆周率:3.14159265Math.E //自然对数的底:2.718Math.SQRT2 //2的平方根:1.414Math.SQRT1_2 //1/2的平方根:0.707Math.LN2 //2的自然对数:0.693Math.LN10 //10的自然对数:2.302Math.LOG2E //2为底e的对数:1.442Math.LOG210E //10为底e的对数:0.434随机数Math.random() //产生一个大于等于0小于1的随机数xx = Math.floor(Math.random() * 12); //产生一个大于等于0小于12的随机数小数部分的舍入Math.ceil() //小数部分不为0,则强行进1Math.floor() //小数部分强行舍去,即取整Math.round() //小数部分四舍五入xx = Math.ceil(3.0); //xx的值为3xx = Math.ceil(2.001); //xx的值为3xx = Math.floor(3.99); //xx的值为3xx = Math.round(2.5); //xx的值为3xx = Math.round(3.49); //xx的值为3最大、最小、绝对值Math.max(x,y); //取最大值Math.min(x,y); //取最小值Math.abs(x); //取绝对值xx = Math.max(-20,3); //xx的值为3xx = Math min(23,3); //xx的值为3xx = Math.abc(-3); //xx的值为3乘方、开平方、对数Math.pow(n, m); //n的m次乘方Math.exp(m); //e的m次乘方Math.sqrt(n); //n的平方根Math.log(n); //e为底n的对数 //注: 开n次方的函数没有,但可以根据对数求得。xx = Math.pow(2,10); //xx的值为: 1024xx = Math.exp(3); //xx的值为: 20.085536923187668xx = Math.sqrt(10); //xx的值为: 3.1622776601683795xx = Math.log(10); //xx的值为: 2.302585092994046三角函数Math.sin(m); //正弦: (-1~1)Math.cos(m); //余弦: (-1~1)Math.tan(m); //正切: (-∞~∞) //注: 度数采用的是弧度,180度应转化为π(即Math.PI),36度也就是36/180*Math.PI。 //没有余切函数,余切为正切的倒数。xx = Math.sin(30/180*Math.PI); //xx的值为: 0.49999999999999994yy = Math.cos(30/180*Math.PI); //yy的值为: 0.8660254037844387zz = Math.tan(45/180*Math.PI); //zz的值为: 0.9999999999999999ww = eval(Math.pow(xx,2)) + eval(Math.pow(yy,2)); //zz的值为: 1Math.asin(m); //反正弦: (-π/2~π/2)Math.acos(m); //反余弦: (0~π)Math.atan(m); //反正切: (-π/2~π/2)xx = Math.asin(0.5)*180/Math.PI; //xx的值为: 30.000000000000003yy = Math.acos(0.8660254037844387)*180/Math.PI; //yy的值为: 29.999999999999993zz = Math.atan(1)*180/Math.PI; //zz的值为: 45Math.atan2(y,x); //根据(x,y)的坐标求弧度: (-π~π) //注: 参数是反过来写的。xx = Math.atan2(1, 1.732) //xx的值为: 0.5236114777699694 //即: (1.732,1)坐标的度数为: 30度取最大最小值Math.max(x,y); //取x和y的最大值Math.min(x,y); //取x和y的最小值xx = Math.max(23, -100); //xx的值为: 23xx = Math.min(23, -100); //xx的值为: -10010章 函数在JavaScript中函数的定义比其他语言自由的多,过程也是函数。函数可以给他一个返回值,也可以不给。参数即可以显式定义,也可以不定义而在调用时直接传递。注意,JavaScript中函数变成了对象,这样一来可以解决许多疑难杂症,不过,使用时要当心。关于参数传递,即形式参数还是值参数。JavaScript和Java是完全相同,是值传递参数,也就是说,在函数体中,不管参数如何被修改,都不影响调用处变量的值。当参数是对象时,该对象的属性值被修改时,外面调用处的内容也同时被修改。因为值传递参数时,所传送的实际上是地址,也就是函数外面的对象地址被传经来了,所以函数里面和外面用的是同一对象。(初学者可以只记住现象。)函数定义//标准函数的写法function funcName (arg1, arg2, ...) { ··· return retValue;}xx = funcName(para1, para2, ...);//没有返回值的函数写法function funcName (arg1, arg2, ...) { ··· //return retValue;}funcName(para1, para2, ...);//如果硬要写成以下格式,则xx的结果为: "undefined"。xx = funcName(para1, para2, ...); //xx的结果为: "undefined"//隐式使用参数的函数写法function funcName () { //用法参考 for (i=0; i<funcName.arguments.length; i++) { alert(funcName.arguments[i]); } ···}xx = funcName("aaa",123); //结果显示2次对话框//作为对象的函数写法//和上面的方法相同,这种写法不常见funcName = function(arg1, arg2, ..., statements) { ···}//一次性被使用的函数写法//这是上面方法的引申,一般没有参数,函数名也不需要。例如:window.onbeforeunload = function() { ···}参数传递//下例传递3种类型的数据(注意:初学者不要深究)function testPara(objX1, objX2, strY, intZ) { objX1.value = "对象1内容已经被修改"; objX2 = objX1; //注意和上一句的区别 strY = "字符串没有被修改"; intZ = 9876;}<!--以下是HTML文中的例子--><input id="id1" value="原先的对象1内容"><input id="id2" value="原先的对象2内容"><script type="text/javascript"><!--var objA1 = document.getElementById("id1");var objA2 = document.getElementById("id2");var strB = "原先的字符串";var intC = 1234;testPara(objA1, objA2, strB, intC);alert(objA1.value); //显示: 对象1内容已经被修改alert(objA2.value); //显示: 原先的对象2内容alert(strB); //显示: 原先的字符串alert(intC); //显示: 1234// --></script>参数的取得func.arguments //结果是数组,数组长度就是参数个数11章 对象JavaScript中的对象有2部分,一是HTML文中定义的对象,可以直接使用。一是用JavaScript语句新产生的对象。本章讲述的是后一种的特例,即定义一个新的类以及类的属性、方法。上一章讲到函数也是对象,准确地说应该叫类,只不过权威资料上既然那么写,大家便一直这么称呼。类的定义类的构造函数function MyClass() { //和普通的函数定义完全相同 ··· //构造函数的参数是任意的}类的属性function MyClass(para1, para2, ...) { //类的所有属性必须在构造函数中 this.att1 = para1; //用this指定,并赋上初始值。 this.att2 = "." + para2; //不需要赋值的属性可以赋null。}类的方法function methodOfMyClass() { //事先定义一个函数备用, alert(this.att1 + this.att2); //然后在下面的构造函数中指定。} //用到当前类的属性时,this不可缺。function MyClass(para1, para2, ...) { //构造函数中不指定一下,上面的函数就变成了普通函数,而不是类的方法this.att1 = para1; //属性1this.att2 = "." + para2; //属性2this.method1 = methodOfMyClass; //构造函数中指定前面定义的函数名} //这是回调函数的用法类的实例(被使用)function test(){ var obj = new MyClass("诸葛", "孔明"); obj.method1(); //结果显示对话框:“诸葛.孔明” alert(obj.att1); //结果显示对话框:“诸葛”}生成一个对象实例object = new Object(); //变量先赋于一个既存对象的实例。var obj = new Date();var myobj = new MyClass("1989","06");取类的构造函数定义object.constructor; //取类的定义程序,注意:这是属性,不是方法//例子1:JavaScript已经定义好的类var now = new Date(); //xx的内容: function Date() {xx = now.constructor; // [native code] // }//例子2:自定义的类function myClass(){ //这3行内容显示在下面的对话框中 this.id = Math.random(); //} //var myobj = new MyClass();alert(myobj.constructor); //对话框中显示上面3行类属性的增加Object.prototype.newAttName; //对已经定义的类增加新的属性Date.prototype.DC = "公元前";xx = new Date();alert(xx.DC); //显示:"公元前"xx.DC = "公元后";alert(xx.DC); //显示:"公元后"序列化object.toString(); //类都有toString()方法,也可覆盖它function myToString() { //事先定义一个函数,以备下面的类的方法用 return this.id + this.Name;}function myClass(){ this.id = "abc"; this.name = "xyz" this.toString = myToString; //将上面定义的函数变成序列化的方法}var myobj = new MyClass();alert(myobj.toString()); //对话框中显示: "abcxyz"求值object.valueOf(); //根据类型求值 //注: Number型,返回数值; String型,返回字符串; //日期型,返回getTime()var strX = "abcd";var intX = 123;var dateX = new Date();alert(strX.valueOf()); //对话框中显示: "abcd"alert(intX.valueOf()); //对话框中显示: 123alert(dateX.valueOf()); //对话框中显示: 110252046314012章 正则表达式正则表达式由来已久,查找替换功能非常强大,但模板难记复杂。 JavaScript中String对象的match()、replace()这2个方法都要使用正则表达式的模板。 当模板内容与字符串不相匹配时,match()返回null,replace()返回原字符串。正则表达式的模板对象//标准写法regexp = new RegExp(pattern[, flag]); pattern: 模板的用法是关键,也是本章的主要内容。 flag: "i"(ignore)、"g"(global)、"m"(multiline)的组合 i-忽略大小写,g-反复检索,m-多行检索flag中没有g时,返回字符串,有g时返回字符串数组var reg = new RegExp("飞雪","g");var str = "风雨送春归飞雪迎春到,飞雪连天向天横";var xx = str.(str.match(reg)); //xx的结果: xx[0]="飞雪"alert(xx); // xx[1]="飞雪"//常用写法regexp = new RegExp(/pattern /[flag]); //去掉引号逗号改用“/”ar reg = new RegExp(/飞雪/g);var str = "风雨送春归飞雪迎春到,飞雪连天向天横";var xx = str.(str.match(reg)); //xx的结果: xx[0]="飞雪"alert(xx); // xx[1]="飞雪"//省略写法string.match(/pattern/flag);整个模板对象省略,让JavaScript自动生成//var reg = new RegExp(/飞雪/g);var str = "风雨送春归飞雪迎春到,飞雪连天向天横";var xx = str.(str.match(/飞雪/g)); //xx的结果: xx[0]="飞雪"alert(xx); // xx[1]="飞雪"模板的语法(即正规表现)//字符串相匹配(包括单个字符)【字符串】reg = new RegExp(/abc/ig); //匹配字符串"abc",多次,大小写不计reg = new RegExp(/abc/ig);xx = "123ABCxyzbcaLMNAbC".match(reg); //xx为: ABC,AbC 注;bca不符合//多个字符串中任意一个相匹配【|】reg = new RegExp(/abc|xyz/ig); //字符串abc或xyz之间用|分割 注: 【|】不适用于下面的[...]内容reg = new RegExp(/abc|xyz/ig);xx = "123ABCxyzbcaLMNAbC".match(reg); //xx为: ABC,xyz,AbC//字符串中任意一个字符相匹配【[...],[.-.]】reg1 = new RegExp(/[abc]/ig); //匹配任意一个字符用[...]reg2 = new RegExp(/[m-p]/ig); //连续字符串可用减号[.-.]reg3 = new RegExp(/[0-9]/g); //判断是否包含数字reg4 = new RegExp(/[a-z]/ig); //判断是否包含英文字母 //注: 【-】只是用于[...]中reg1 = new RegExp(/[abc]/ig);xx = "123ABCopqbcaLMNAbC".match(reg1); //xx为: A,B,C,b,c,a,A,b,Creg2 = new RegExp(/[m-p]/ig);yy = "123ABCopqbcaLMNAbC".match(reg2); //yy为: o,p,M,N//字符串中任意一个字符不包含匹配【[^...]】reg1 = new RegExp(/[^abc]/ig); //匹配任意一个字符都不被包含用^reg2 = new RegExp(/[^m-p]/ig); //不包含mnop的任一字符reg3 = new RegExp(/[^0-9]/g); //判断是否不包含数字reg4 = new RegExp(/[^a-z]/ig); //判断是否不包含英文字母 注: 【^】是在[...]的里面,不是后面所说的【^】在[...]外面reg1 = new RegExp(/[^abc]/ig);xx = "123ABCopqbcaLMN".match(reg1); //xx为: 1,2,3,o,p,q,L,M,Nreg3 = new RegExp(/[^0-9]/g);yy = "123opqLMN".match(reg3); //yy为: o,p,q,L,M,N//多个重复字符相匹配【{m,n}】说明: {m,n}表示从m到n次重复字符相匹配,m,n为大于等于0的整数。{m}和{m,}都是正确的,{ ,n}语法不错,但永远不能匹配reg1 = new RegExp(/abc{2}/ig); //等价于“/abcc/ig”reg2 = new RegExp(/abc{1,2}/ig); //等价于“/abc|abcc/ig”reg3 = new RegExp(/abc{0,2}/ig); //等价于“/ab|abc|abcc/ig”reg4 = new RegExp(/abc{0,}/ig); //匹配ab后面跟任意个creg5 = new RegExp(/abc{1,}/ig); //匹配ab后面跟一个以上的c 注: 【{m,n}】不适用于[...]中reg1 = new RegExp(/abc{2}/ig);xx = "abcABCCabccc".match(reg1); //xx为: ABCC,abccreg3 = new RegExp(/abc{0,2}/ig);yy = "abxABCCabccc".match(reg3); //yy为: ab,ABC,abcczz = "abA Ba bA b".match(/a {0,}b/ig); //匹配ab之间任意空格。zz为: ab,A B,a b,A bww = "aa1bb22cc321dd9876".match(/[0-9]{2}/g); //匹配2位数字。ww为:22,32,98,76//子表达式即字符串的一部分相匹配【(...)】说明: 对字符串的一部分进行操作,可以用()括起来reg1 = new RegExp(/abc{2}/ig); //等价于“/abcc/ig”,c被重复了2遍reg2 = new RegExp(/a(bc){2}/ig); //等价于“/abcbc/ig”,bc被重复了2遍reg1 = new RegExp(/abc{2}/ig);xx = "abcABCbccc".match(reg1); //xx为: nullreg2 = new RegExp(/a(bc){2}/ig);yy = "abcABCbccc".match(reg2); //yy为: ABCbc通配符//匹配单个任意字符(不包括\n)【.】xx = "at act ant amount".match(/a.t/gi); //a与t之间有1个字符。xx=act,antxx = "at act ant amount".match(/a....t/gi); //a与t之间有4个字符。xx=amount//任意匹配字符或字符串【*】等价于{0,} “*”星号前面至少必须有一个字符,任意匹配时可以用“.”代替字符 “*”星号前面不能用限定符{...}及其简写形式xx = "at act ant amount".match(/a*t/gi); //t前面任意个a。xx=at,t,t,txx = "at act ant amount".match(/a.*t/gi); //a与t之间任意个字符。xx=at,act,ant,amountxx = "at act ant amount".match(/*t/gi); //语法出错(*前面无字符)xx = "at act ant amount".match(/a{1}*/gi); //语法出错(*前面不能有限定符)(ie上虽不出错,按字符个数匹配)xx = "at act ant amount".match(/.*ou/gi); //ou前面任意个字符。xx=at act ant amouxx = "at act ant amount".match(/.*/gi); //与原字符串相同。xx=at act ant amount//子表达式的任意匹配【?】等价于{0,1} “?”问号前面至少必须有一个字符,任意匹配时可以用“.”代替字符 “?”问号前面没有用(...)将子表达式括起来,“?”相当于“*”,而不是“.” “?”问号的主要作用是对(...){.,.}操作xx = "at act,ant amount".match(/a?t/gi); //t前面有0个或1个a。xx=at,t,t,txx = "at act,ant amount".match(/?t/gi); //语法出错(*前面无字符)xx = "at act,ant amount".match(/a{1}?/gi); //对“a{1}”的结果匹配。xx=a,a,a,a//子表达式的1次以上匹配【+】等价于{1,} “+”加号前面至少必须有一个字符,也可以用“.”代替字符 “+”加号前面没有用(...)将子表达式括起来,“+”相当于“?”或“*”,而不是“.”xx = "at act,ant amount".match(/a+t/gi); //t前面有1个以上的a。xx=atxx = "at act,ant amount".match(/+t/gi); //语法出错(*前面无字符)xx = "at act,ant amount".match(/a{1}+/gi); //对“a{1}”的结果匹配。xx=a,a,a,a//通酡符小结 “.”匹配的字符是任意的,与符号前面的字符没有关系 “?”匹配的字符或字符串与其前面字符或子表达式有关 “.”匹配一个字符,而与“*”、“+”和“?”结合后,能匹配0个或多个 “?”前面没有(...)子表达式时,匹配的是前一个字符 “?”前面有(...)子表达式时,匹配的是前一个子表达式 “?”前面有{m,n}限定符时,匹配的个数就是{m,n}指定的个数xx = "at act,ant amount".match(/a.t/gi); //xx=act,antxx = "at act,ant amount".match(/a?t/gi); //xx=at,,a,,t,,a,,t,,a,,,,,t,xx = "at act,ant amount".match(/a*t/gi); //xx=at,t,t,txx = "atat fatt,gatAT amount".match(/at?/gi); //x=at,at,at,at,AT,axx = "atat fatt,gatAT amount".match(/(at)?/gi); //xx=at,at,,,at,,,,at,AT,,,,,,,,xx = "atat fatt,gatAT amount".match(/(at){2}?/gi);//xx=atat,atAT定位符开始【^】和结束【$】位置如果有\n或\r时,要与multiLine配合使用xx = "I am a student".match(/^s/i); //xx=nullxx = "I am a student".match(/^i/i); //xx=Ixx = "I am a \nstudent".match(/^s/i); //xx=nullxx = "I am a \nstudent".match(/^s/mi); //xx=sxx = "I am a student".match(/m$/i); //xx=nullxx = "I am a student".match(/m$/i); //xx=mxx = "I am a\n student".match(/a$/i); //xx=nullxx = "I am a\n student".match(/a$/mi); //xx=axx = "I am a student".match(/^s/i); //xx=nullxx = "I am a student".match(/^i/i); //xx=Ixx = "I am a \nstudent".match(/^s/i); //xx=nullxx = "I am a student".match(/^i.*t$/i); //xx=I am a student转义字符\b 匹配一个【单词边界】(例:回车、换行、空格、逗号)。\B \b除外xx = "I am a student".match(/stu\b/i); //xx=nullxx = "I am a student".match(/\bstu/i); //xx=stuxx = "I am a student".match(/ent\b/i); //xx=entxx = "I am a student".match(/ent\B/i); //xx=nullxx = "我是学生".match(/学生\B/i); //xx=nullxx = "我是(student)学生".match(/ent\B/i); //xx=entxx = "我是student学生".match(/ent\B/i); //xx=ent\cA 匹配一个【Ctrl+A】字符。\d 匹配一个【数字】。等价于[0-9]。\D \D除外\f 匹配一个【换页符】字符。等价于 \x0c 和 \cL。\n 匹配一个【换行符】。等价于 \x0a 和 \cJ。\r 匹配一个【回车符】。等价于 \x0a 和 \cJ。\s 匹配一个【空白符】。包括空格、制表符、换页符等。等价于[\f\n\r\t\v]。\S \D除外\t 匹配一个【制表符】。等价于 \x09 和 \cI。\v 匹配一个【垂直制表符】。等价于\x0b 和 \cK。\w 匹配一个【英文数字】。等价于[A-Za-z0-9]。\W \w除外\onnn 匹配一个【8进制数字】。\xnnn 匹配一个【16进制数字】。(略)\其它字符(正则表达式使用的符号和单双引号) 【\(】【\)】【\[】【\]】【\{】【\}】 【\"】【\'】【\^】【\$】【\\】【\/】(略)