Javascript学习指南(第2版)笔记(二) 对象、正则表达式、函数


1、字符串基本类型和字符串对象的相互转换
2、String对象
3、正则表达式
4、数组
5、函数
6、匿名函数
7、函数字面量




1、字符串基本类型和字符串对象的相互转换


     如果创建的是字符串基本类型,却又以对象的行为访问,那么 JavaScript会将该基本类型自动转换成对象,但是转换成的 String对象只是一个临时变量,并且在属性操作后销毁该对象,所以这种操作不够有效,多了一次转换的过程而已。

var strName = "Shelley"; //字符串基本类型
alert(strName.length);  //隐式创建 String对象,数值与 strName相同,并执行 length方法




2、String对象


本节内容引自:JavaScript String 对象参考手册
http://www.w3school.com.cn/js/jsref_obj_string.asp

var sObject = new String("Sample string");

     字符串是 JavaScript 的一种基本的数据类型。String 对象的 length 属性声明了该字符串中的字符数。String 类定义了大量操作字符串的方法,例如从字符串中提取字符或子串,或者检索字符或子串。

     需要注意的是,JavaScript 的字符串是不可变的(immutable),String 类定义的方法都不能改变字符串的内容。像 String.toUpperCase() 这样的方法,返回的是全新的字符串,而不是修改原始字符串。

     在较早的 Netscape 代码基的 JavaScript 实现中(例如 Firefox 实现中),字符串的行为就像只读的字符数组。例如,从字符串 s 中提取第三个字符,可以用 s[2] 代替更加标准的 s.charAt(2)。此外,对字符串应用 for/in 循环时,它将枚举字符串中每个字符的数组下标(但要注意,ECMAScript 标准规定,不能枚举 length 属性)。因为字符串的数组行为不标准,所以应该避免使用它。


 

3、正则表达式

     正则表达式是由字符串所组成的表达式,用于匹配、替换或者查找特定的字符串。通过 RegExp对象可以显式地创建正则表达式:
var searchPatten = new RegExp('s+');

也可以使用文字量方式创建正则表达式:
var searchPatten = /s+/;

test方法

     test方法将判断以参数传入的字符串是否与正则表达式相匹配。

var re = /Javascript rules/i;
/* var re = new RegExp('s+', 'g');    //对象实例,第二个参数表示匹配选项 */
var str = "Javascript rules";
if (re.test(str))    document.writeln("I guess it does rule");


其中修饰符
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。

exec方法

var re = new RegExp("JS*""ig");
var str = "cfdsJS *(&YJSjs 888JS";
var resultArray = re.exec(str);
while (resultArray) {
    document.writeln(resultArray[
0]);
    document.writeln(
"next match starts at " + re.lastIndex + "<br />");
    
    resultArray 
= re.exec(str);
}

/*
由于设置选项 g,RegExp中的 lastIndex属性会设置为上一次匹配的位置,所以每次 exec调用都会查找下一个匹配。该示例中总共找到4次匹配,当没有匹配时,将会返回的数值是空值 null,当数组为空值时循环自动结束。 

输出:
JS next match starts at 6
JS next match starts at 13
js next match starts at 15
JS next match starts at 21

*/

exec方法将返回一个数组,但是数组并不是所有匹配项,而是当前匹配项和所有带圆括号的子字符串。如果在表达式中使用圆括号引用正则表达式的某部分,那么匹配的时候,这些括号所匹配的字符串也会体现在返回的数组中。

var re = /(ds)+(j+s)/ig;
var str = "cfdsJS *(&dsjjjsYJSjs 888dsdsJS";
var resultArray = re.exec(str);
while (resultArray) {
    document.writeln(resultArray[
0]);
    document.writeln(
"next match starts at " + re.lastIndex + "<br />");
    
for (var i=1; i<resultArray.length; i++)
    {
        document.writeln(
"substring of " + resultArray[i] + "<br />");
    }
    document.writeln(
"<br />")
    
    resultArray 
= re.exec(str);
}

/*

输出:
dsJS next match starts at 6
substring of ds
substring of JS

dsjjjs next match starts at 16
substring of ds
substring of jjjs

dsdsJS next match starts at 31
substring of ds
substring of JS

*/


支持正则表达式的 String 对象的方法
search 检索与正则表达式相匹配的值。
match 找到一个或多个正则表达式的匹配。
replace 替换与正则表达式匹配的子串。
split 把字符串分割为字符串数组。
 

参考:JavaScript RegExp 对象参考手册
http://www.w3school.com.cn/js/jsref_obj_regexp.asp




4、数组


     数组不一定是一维的,在 JavaScript中管理多维数组的方法是为每个数组元素创建一个新的数组。

var threedPoints = new Array();
threedPoints[0] = new Array(1.2, 3.33, 2.0);
threedPoints[1] = new Array(5.3, 5.5, 5.5);
threedPoints[2] = new Array(6.4, 2.2, 1.9);
var newZPoint = threedPoints[2][2];     //数组以索引方式访问

     数组的 concat 和 slice都不会改变原有数组,而只是创建一个新的数组以作为方法的返回值。

     在大多数情况下,数组元素的顺序并不重要,不过也有些需要维护数组元素顺序的场景,例如队列。数组维护队列的方法:
push 将元素添加到数组后面
unshift 将元素添加到数组最前面
pop 移除数组的最后一个元素
shift 移除第一个元素

数组的访问

//通过循环来遍历数组
for (var i=0; i<threedPoints[0].length; i++){
    alert(threedPoints[
0][i]);
}

//使用 forin 循环
for (var itemIndex in threedPoints[0]){
    document.writeln(threedPoints[
0][itemIndex] + "<br />");
}


根据逗号分隔的字符串方式创建数组

var animalString = "cats,dogs,birds,horse";
var animalArray = animalString.split(",");
alert(animalArray[
2]);  //alert box display birds



JavaScript Array 对象参考手册
http://www.w3school.com.cn/js/jsref_obj_array.asp




5、函数 

     JavaScript中函数和对象相似,你可以定义一个函数,创建一个新的函数,甚至输出一个函数。正是因为有了这个功能,你可以将一个函数给一个变量或数组元素,甚至可以将其作为参数传给另一个函数调用。

     在 JavaScript中有3种创建函数的方法:声明式的/静态的、动态的/匿名的、字面量式的。在使用它们之前,理解各种方法的效果是十分重要的。

     如果在一个函数中需要执行多个任务,可以考虑将这个函数拆分成几个更小的单元,这样做可提高复用性。在实际中,尽量让函数短小、使其特定于某个人物、尽量保持通用是应该遵守的规则。


 

6、匿名函数

     匿名/动态函数对于定义一个在运行时才能确定需求的函数而言是个很好的方法。匿名函数每次访问都会解析一次。使用匿名函数构造器:
var variable = new Function("param1", "param2",...,"paramn","function body");

/* 
用户将通过 alert对话框来设置定义函数所需的函数体及两个参数,
然后调用该函数,
将其生成的结果输出到页面上。

注:FF调试通过,IE7异常
*/

//提示输入函数体和参数
var func = prompt("Enter function body:");
var x = prompt("Enter value of x:");
var y = prompt("Enter value of y:");

//调用这个匿名参数
var op = new Function("x""y", func);
var theAnswer = op(x, y);       //function anonymous(x, y) {}

//输出函数执行结果
alert("Function is: ", func);
alert(
"x is: " + x + 
            
"; y is: " + y);
alert(
"The answer is: " + theAnswer);


/*
输入/输出:
Function is: return x * y;
x is : 33; y is : 11;
The answer is: 363;
*/



7、函数字面量

     函数字面量也称函数表达式,因为这样创建的函数将成为表达式的一部分,而不是一个特有类型的语句,他们像匿名函数一样没有定义函数名称,但函数字面量只会被解析一次,它是静态的。

     当你想实现如吧一个函数作为另一个函数的参数之类的扩展时,函数字面量的特色就会显示出来。

//将第三个参数作为函数来声明
function funcObject(x,y,z){
    alert(z(x,y));
}

//第三个参数是一个函数
funcObject(3, 4, function(x, y){ return x*y})

posted on 2010-05-26 16:29  黄小二  阅读(561)  评论(0编辑  收藏  举报