分享

JavaScript教程

 sdxy 2021-07-19

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">

class

class是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进制的12345
1.23     // 实数的 1.23
1.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的值为: false
xx = (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进制的字符串: 7B
yy = 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 Infinity
avaScript是区分正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的值为: -1
string.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的值为: null
string.match(regexp)    //返回与正则表达式匹配的字符串的位置,找不到返回-1
xx = "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的值为: NaN
String.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的值为: NaN
String.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~1999
dd = 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.length
yy = 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,1
array.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的值为: 1
Math.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的值为: 45
Math.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的值为: -100

10章 函数


在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());    //对话框中显示: 1102520463140

12章 正则表达式


正则表达式由来已久,查找替换功能非常强大,但模板难记复杂。 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进制数字】。
(略)
\其它字符(正则表达式使用的符号和单双引号)  【\(】【\)】【\[】【\]】【\{】【\}】
  【\"】【\'】【\^】【\$】【\\】【\/】
(略)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多