JavaScript高级程序设计(第2版) 之 引用类型
Object类型
所有引用类型的基类,有两种声明的方法;
1. Var o = new Object();
2. Var o = {};
一般以方式2进行可选参数的传递, 当然全部的参数也可以以方式二传递,依个人习惯而定。
function showinfo(person)
{
var info = "";
for ( var i in person )
{
info += i + ":" + person[i] + "\n";
}
alert(info);
}
showinfo({name:'xs', age:21, sex:'male'});
作为可选参数时我们通过typeof以确定参数是否存在,如下
function showinfo(name, age, options)
{
var info = "name:" + name + "\nage:" + age+"\n";
for ( var i in options )
{
if (typeof i != "undefined")
info += i + ":" + options[i] + "\n";
}
alert(info);
}
showinfo('song', 21, {sex:'male'});
Array类型
Array有多种声明方式,十分灵活,如下:
1. Var item = new Array;
2. Var item = new Array();
3. Var item = new Array(5); //指定初始元素的个数
4. Var item = new Array(1,32,45,r56,567,567,56); //指定初始元素,可以包含不同类型数据
5. Var item = [];
转换方法:
所有对象都具有toLocaleString()、toString()、valueOf()方法,数组的这几个转换方法总是先调用对象的相应方法然后再拼接在一起, 红字解释说明用例如下:
var man = {
toString:function(){
return 'a man';
},
toLocaleString:function(){
return 'a localeman';
}
};
var animal = {
toString:function(){
return 'a animal';
},
toLocaleString:function(){
return 'a localeanimal';
}
};
var items = Array(man, animal);
alert(items.toString()); //a man, a animal
alert(items.toLocaleString()); //a localeman, a localeanimal
栈方法:
1. push
可以接受任意个参数,把它们添加到数组末尾并返回修改后数组的元素个数
2. pop
移除数组末尾一位,并返回移除数据项
队列方法:
1. shift
移除数组的第一项,并返回移除数据值
2. unshift
在数组第一项前添加数据,可以接受任意个参数,除ie外其他浏览器均返回修改后数组的长度值(ie返回undefined)
重新排序方法:
1. reverse
反转数组元素顺序
2. sort
数组元素toString后进行排序,可以接受比较函数自定义自己的排序规则。比较函数规则:第一个参数在第二个参数前那么返回负数,相等则返回0, 第一个参数在第二个参数后面则返回正值。
操作方法:
1. Concat
基于当前数组创建一个新的数组;参数可以接受单个值或者数组
2. Slice
返回数组的一部分。接受两个参数1.起始位置 2.结束位置(不包含),如果参数为负数则加上数组长度进行转换
3. Splice
数组内部插入、删除元素方法
删除:2个参数,指定起始位置和删除元素的个数
插入:起始位置, 0(0代表插入), 插入的元素(可以是多个参数)
替换:起始位置,替换元素的个数, 替换元素
Date类型
构造:
Var d = new Date();默认返回当前时间;可以传递到utc时间的毫秒数作为参数。在javascript中提供了Date.parse及Date.UTC两个方法返回指定参数代表的毫秒数,如果参数无效那么返回NaN
RegExp类型
表达式格式:var exp = / pattern / flags;
Flags:
g:表示全局
i:不区分大小写
m:表示多行
RegExp实例属性:
Global:是否设置了g标志
ignoreCase:是否设置了i标志
lastIndex:搜索下一个匹配项的字符位置
multiline:是否设置了m
source:字符串形式的正则表达式
RegExp实例方法:
Exec
接受一个字符串,返回匹配项的信息
额外属性:
Index:匹配字符串的位置
Input:原字符串
返回值:是一个数组,第一项为匹配整个匹配项,随后为子匹配项
test()
只返回true或者false
RegExp构造函数属性
lastMatch, lastParen, leftContext 等提供了一些静态属性
另外还有9个属性用于房屋捕获组 方式:RegExp.$1…
Function类型
#!函数实际是一个指向函数对象的指针
声明方式:
方式一、
Function sum(n1, n2){
Return n1+n2;
}
方式二、
Var sum = function(n1, n2){
Return n1+n2;
}
方式三、
Var sum = new Function(“n1”, “n2”, “return n1 + n2”);
没有重载特性!
Function t1(){ return “t1”;}
Function t1(){ return “t2”;}
第一个声明始终会被第二个覆盖,实际上换另外一种方式更容易理解
Var t1 = function(){return “t1”;}
T1 = function(){return “t2”;}
同变量一样,后面的会覆盖掉前面的声明;
函数声明与变量表达式的区别:
对函数声明解析器会率先读取,并使其在任何代码之前可用;而函数表达式如同变量一样,只有解析到代码时才可用。
把函数作为参数传递
可作为参数,作为返回值等。正如Array类实例的sort方法可以接受一个有两个参数的函数,我们可以自定义一个函数,然后传进去,现在自定义一个函数,功能就是返回一个比较函数:
Function customsort()
{
Return function(a, b){
Return a - b;
}
}
函数的内部属性
Arguments包含函数的参数, arguments有个名叫callee的属性,其指向拥有该参数的函数(在递归中经常用到)
This函数在执行时所处的作用域
函数的属性和方法
Length定义了函数应该接受的参数个数
Prototype属性以后说明
每个函数都有apply(), call()两个方法,是在特定的作用域中调用函数,以改变函数内部this的指向。
唯一的区别就是接受的参数不同,apply接受一个作用域对象,一个参数数组;call接受一个作用域对象,和所有的参数