《JavaScript高级程序设计》读书笔记--5-引用类型

object类型

创建objet实例有两种方式,new操作符后跟object构造函数和使用对象字面量表示法。

//new
var person = new Object();
person.name = "Nicholas";
person.age = 26;

//对象字面量表示法(推荐这种方法)
var person = {
    name : "Nicholas",
    age : 26
}

//两者结合
var person = {};//与new Object()相同
person.name = "Nicholas";
person.age = 26;

对必需值使用命名参数,而使用对象字面量来封装多个可选参数。
访问对象属性时使用的都是点表示法,js中也可以使用方括号表示法来访问对象的属性。

alert(person["name"]);
alert(person.name);//两者都输出"Nicholas"

方括号的优点是可以通过变量来访问属性,如:

var propertyName = "name";
alert(person[propertyName]);//"Nicholas"

建议使用点表示法,除非必须使用变量来访问属性。

Array类型

数组大小是可以动态调整的。

var colors = new Array();//创建数组方法1,new操作符法
var colors = Array();//也可以省略new操作符
//如果括号中的值为数值则会创建一个长度为该数值的数组
//如果为其他类型的参数则会创建包含该参数的只有一项的数组

var colors = ["red", "blue", "green"];//创建数组方法2,数组字面量表示法
var name = [];//创建空数组

在读取和设置数组的值时,要使用方括号并提供相应值的基于0的数字索引。
数组的项数保存在其length属性中,这个属性始终返回0或者更大的值。可以通过设置length属性从数组的尾端移除或者向数组中添加新项。

var colors = ["red", "blue", "green"];
colors.length = 2;//移除第二项之后的值
//若设置length大于数组项数,则新增项的值都为undefined
alert(colors[2]);//undefined

在数组尾部添加新项

var colors = ["red", "blue", "green"];
colors[colors.length] = "black";//在位置3添加black
colors[99] = "brown";
alert(colors.length);//100

数组的最后一项的索引始终都是length-1,因此新项的位置就是length。
向数组的位置99插入一个值,数组的新长度变为100,而4-98实际上都不存在,访问他们都将返回undefined。
数组最多可以包含4294967295个项,超出这个上限就会发生异常。
检测数组

if(value instanceof Array){
    //对数组执行某些操作
}
if(Array.isArray(value)){
    //对数组执行某些操作
}

转换方法
所有对象都具有toLocaleString()、toString()和valueOf()方法,其中,调用数组的toString()方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串。而调用value()方法返回的还是数组。toLocaleString()方法也会创建一个数组值的以逗号分隔的字符串,而与前两个不同之处在于,为了取得每一项的值,调用的是每一项的toLocaleSting()方法而不是toString()方法。
join()方法可以使用不同的分隔符来构建字符串,他只接受一个参数,即用作分隔符的字符串,然后返回包含所有数组项的字符串。

var colors = ["red", "blue", "green"];
alert(colors.join(","));//red,blue,green
alert(colors.join("||"));//red||blue||green

如果不给join()传递任何参数或者给他传入undefined,则默认使用逗号作为分隔符。
如果数组中有null项,则上述所有方法返回的结果中以空字符串表示该项的值。
栈方法
LIFO,后进先出
push()方法可以接收任意数量的参数,把他们逐个添加到数组的末尾,并返回修改后数组的长度。而pop()方法则从数组末尾移除最后一项,减少数组的length值,然后返回移除的项。

var colors = new Array();
var count = colors.push("red","green");//推入两项
alert(count);//2
count = colors.push("black");
alert(count);//3
var item = colors.pop();//取得最后一项
alert(item);//"black"
alert(colors.length);//2

队列方法
FIFO,先进先出
shift()是能够移除数组中的第一个项并返回该项,同时数组的长度减1.
结合shift()和push()方法,可以像使用队列一样使用数组。

var colors = new Array();
var count = colors.push("red", "green");
alert(count);//2
count = colors.push("black");//从末尾添加
alert(count);//3
var item = colors.shift();//取得第一项,移除首项
alert(item);//"red"
alert(colors.length);//2

unshift()与shift()的用途相反,它能在数组的前端添加任意个项并返回新数组的长度。使用上述两种方法可以在数组的前端添加项,在数组的末端移除项。

var colors = new Array();
var count = colors.unshift("red", "green");//推入两项
alert(count);//2
count = colors.unshift("black");//在数组前端添加black
alert(count);//3
var item = colors.pop();//从末尾移除
alert(item);//"green"
alert(colors.length);//2

重排序方法
reverse()方法会对数组项的顺序进行反转。
sort()方法按升序排列数组项–即最小的置位于最前面,最大的值位于最后面。sort()方法比较的是数组中每一项的字符串形式,先将每个数组项toString()转型,再比较得到的字符串。sort()中比较5和10,会将10放在5的前面。
这种情况下sort()方法可以接收一个比较函数作为参数,以便指定哪个值位于哪个值的前面,比较函数接收两个参数,若第一个参数应该位于第二个参数之前则返回一个负数,若两个参数相等则返回0,若第一个参数应该位于第二个参数之后则返回一个正数。

function compare(value1,value2){
        return -1;
    }else if(value1 > value2){
        return 1;
    }else{
        return 0;
    }
}
var values = [0,1,5,10,15];
values.sort(compare);
alert(values);//0,1,5,10,15

若要降序排序,只要交换比较函数返回的值即可。
对于数值类型或者其valueOf()返回数值类型的对象类型,比较函数可以写成:

function compare(value1,value2){
    return value1-value2;//升序
    //return value2-value1;降序
}

操作方法
concat()方法可以基于当前数组中的所有项创建一个新数组,具体说就是会先创建当前数组的一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组。

var colors = ["red", "green", "blue"];
var colors2 = colors.concat("yellow", ["black", "brown"]);
alert(colors);//red,green,blue
alert(colors2);//red,green,blue,yellow,black,brown

slice()方法,能够基于当前数组中的一个或者多个项创建一个新数组,可以接受一个或者两个参数,即要返回项的起始和结束位置。在只有一个参数的情况下,返回从该参数指定位置开始到当前数组末尾的所有项,如果有两个参数则返回起始和结束位置之间的项但不包括结束位置的项。注意,该方法不会影响原始数组。
如果参数中有一个负数,则用数组长度加上该数来确定相应的位置,,如果结束位置小于起始位置,则返回空数组。
splice()方法,主要用途是向数组的中部插入项,3种使用方式:

  • 删除:可以删除任意数量的项,只需指定2个参数:要删除的第一项的位置和要删除的项数。splice(0,2)会删除数组中的前两项。
  • 插入:可以向指定位置插入任意数量的项,只需提供3个参数:起始位置、0(要删除的项数)和要插入的项。splice(2,0,”red”,”green”)会从当前数组的位置2开始插入字符串“red”和“green”。
  • 替换:可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定3个参数:起始位置、要删除的项数和药、要插入的任意数量的项。插入和删除数量不必相等。splice(2,1,”red”,”green”)会删除当前数组位置2的项然后再从位置2开始插入字符串”red”,”green”。
    splice方法始终返回一个数组,该数组包含从原始数组中删除的项(若没有删除项则返回空数组)。
    位置方法
    indexOf()方法从数组开头(位置0)开始向后查找。
    lastIndexOf()方法从数组的末尾开始向前查找。
    两种方法返回要查询项在数组中的位置,没找到则返回-1.
    迭代方法
  • every():对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true。
  • filter():对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组。
  • forEach():对数组中的每一项运行给定函数,没有返回值。
  • map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
  • some():对数组中的每一项执行给定函数,如果该函数对任一项返回true,则返回true。
    以上方法都不会修改数组中的包含的值。
var numbers = [1,2,3,4,5,4,3,2,1];
var everResult = numbers.every(function(item,index,array){
    return(item>2);
});
alert(everyResult);//false

var someResule = numbers.some(function(item,index,array){
    return(item>2);
});
alert(someResult);//true

var filterResult = numbers.filer(function(item,index,array){
    return(item>2);
});
alert(fliterResult);//[3,4,5,3]

var mapResult = numbers.map(function(item,index,array){
    return item*2;
});
alert(mapResult);//[2,4,6,8,10,8,6,4,2]

最后一个方法是forEach()方法,他只是对数组中的每一项运行传入的函数,没有返回值,本质上与使用for循环迭代数组一样。

numbers.forEach(function(item,index,array){
    //执行操作
});

缩小方法
reduce()方法从数组的第一项开始逐个遍历到最后。
reduceRight()方法则从数组的最后一项开始,向前遍历到第一项。
这两个方法都回迭代数组的所有项,然后构建一个最终返回的值。
使用reduce还是reduceRight,主要取决于从哪头开始遍历,其他完全相同。

var values = [1,2,3,4,5];
var sum = values.reduce(function(prev,cur,index,array){
    return pre + cur;
});
alert(sum);//15

解析:迭代函数的四个参数分别是前一个值、当前值、项的索引和数组对象。这个函数返回的任何值都回作为第一个参数自动传给下一项,第一次迭代发生在数组的第二项上,因此第一个参数就是数组的第一项,第二个参数就是数组的第二项。

Date类型

Date类型保存的日期能够精确到1970年1月1日之前或者之后的285616年。
创建一个日期对象

var now = new Date();

创建指定日期的一个日期对象

var someDate = new Date(Date.parse("May 25, 2004"));//创建2004年5月25日的日期对象
//也可以直接传递给Date构造函数
var someDate = new Date("May 25, 2004");

若字符串不能表示日期则返回NaN。
Date.now()方法表示调用这个方法时的日期和时间的毫秒数。
在不支持该方法的浏览器中可以使用+操作符把Date对象转换成字符串,也可以达到同样的目的。

var start = Date.now();
var start1 = +new Date();//两者都是取得开始时间,效果相同

继承的方法
toLocaleString()和toString()方法返回带有格式的日期和时间。
valueOf()方法返回日期的毫秒表示。可以用来比较日期值的大小。
日期格式化方法

  • toDateString()–以特定于实现的格式显示星期几、月、日、年;
  • toTimeString()–以特定于实现的格式显示时分秒和时区;
  • toLocaleDateString()–以特定于地区的格式显示星期几月日年;
  • toLocaleTimeString()–以特定于实现的格式显示时分秒;
  • toUTCString()–以特定于实现的格式完整的UTC日期。

日期/时间组件方法
。。。看原书吧

RegExp类型

通过RegExp类型支持正则表达式

var expression = /pattern/flags;

其中的模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。每个正则表达式都可带有一个或者多个标志(flags)用以标明正则表达式的行为。

  • g表示全局模式,应用于所有字符串而非发现第一个匹配项是立即停止;
  • i表示不区分大小写模式;
  • 表示多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。
var pattern1 = /at/g;//匹配字符串中所有at的实例
var parrent2 = /[bc]at/i;//匹配第一个bat或者cat,不区分大小写
var parrent3 = /.at/gi;//匹配所有以at结尾的3个字符的组合,不区分大小写

正则表达式中的元字符包括:
()[]{}\^$|*?+.
若要匹配这些字符则必须要进行转义。
使用RegExp构造函数

var pattern1 = /[bc]at/i;//匹配第一个bat或者cat,不区分大小写
var pattern2 = new RegExp("[bc]at","i");//与pattern1一样!

regexp

var re = null,i;
for(i=0; i<10; i++){
    re = /cat/g;
    re.test("catastrophe");
}
for(i=0; i<10; i++){
    re = new RegExp("cat", "g");
    re.test("catastrophe");
}

在第一个循环中,实际上只为/cat/创建了一个RegExp实例。由于实例属性不会重置,所以在循环中再次调用test()方法会失败,这是因为第一次调用test找到了cat,但是第二次调用是从索引为3的字符开始的,座椅就找不到它了。由于测试会到字符串的末尾,所以下一次再调用test就又从头开始了。
第二个循环使用RegExp构造函数在每次循环中创建正则表达式,因为每次迭代都会创建一个新的RegExp实例,所以每次调用test都会返回true。
RegExp属性

  • global:布尔值,表示是否设置了g标志;
  • ignoreCase:布尔值,是否设置了i标志;
  • lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起;
  • multiline:布尔值,是否设置了m标志;
  • source:正则表达式的字符串表示,按字面量形式而非传入构造函数中的字符串模式返回。

RegExp实例方法
exec()方法,专门为捕获组而设计的,它接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回null。返回的数组虽然是Array实例,但包含两个额外的属性:index和input。index表示匹配项在字符串的位置,而input表示应用正则表达式的字符串。

test()方法,它接收一个字符串参数,在模式与该参数匹配的情况下返回true;否则,返回false。在只想知道目标字符串与某个模式是否匹配但不需要知道其文本内容的情况下使用这个方法很方便。

继承的toString和toLocaleString方法都会返回正则表达式的字面量。
RegExp构造函数属性
构造属性

Function类型

函数实际上可以理解为对象,每个函数都是Function类型的实例,而且有属性和方法。
函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变量没有什么不同,也就是一个函数可能会有多个名字。
没有重载
函数名相同的两个函数,后一个函数会覆盖掉前一个函数。
函数声明与函数表达式
解析器会率先读取函数声明,并使其在执行任何代码之前可用;至于函数表达式,则必须等到解析器执行到他所在的代码行,才会真正被解释执行。

alert(sum(10,10));
function sum(num1,num2){
    return num1+num2;
}
//可以正常运行

alert(sum(10,10));
var sum = function(num1,num2){
    return num1+num2;
}
//不能正常执行

作为值的函数

function callSomeFunction(someFunction,someArgument){
    return someFunction(someArgument);
}
function add10(num){
    return num+10;
}
var result = callSomeFunction(add10,10);
alert(result);//20

函数内部属性
arguments的主要用途是保存函数参数,但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。

function factorial(num){
    if(num<1){
        return 1;
    }else{
        return num * arguments.callee(num-1);
    }
}

这是阶乘函数的定义,若函数名字不变的情况也可以使用
return num*factorial(num-1);
但是,这个函数的执行就与函数名紧紧耦合在了一起,使用arguments.callee就消除了这种现象。

this对象,与Java大致类似,this引用的是函数据以执行的环境对象–或者也可以说是this值。

函数属性和方法
length表示接收参数的个数。
prototype
bind()
call()
apply()
扩充作用域

基本包装类型
String
Boolean
Number

单体内置对象

Global对象,不属于任何其他对象的属性和方法最终都是他的属性和方法。所有在全局作用域中定义的属性和函数都是Global对象的属性。
eval()方法

eval("alert('hello')");
alert("hello");//两者等价

Math对象
math对象
math方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值