第五章 引用类型

引用类型的值(对象)是引用类型的一个实例。
引用类型是一种数据结构,用于将数据和功能组织在一起。
引用类型不具备传统的面向对象语言所支持的类和接口等基本结构,,因此引用类型有时候也被成为对象定义,因为它们描述的是一类对象所具有的属性和方法。
新对象使用new操作符后跟一个构造函数来创建,构造函数本身就是一个函数,只不过该函数是出于创建新对象的目的而定义的。
eg:
var person = new Object();

Object类型

创建Object实例有两种方法:

  • 方法一:使用new操作符
var person = new Object();
person.name = "Nicholas";
person.age = 29;
  • 方法二:对象字面量
var person = {
    name : "NIcholas",
    age : 29
};

在对象字面量中,使用逗号类分隔不同的属性。在最后一个属性后面添加逗号,会在IE7及更早版本和Opera中导致错误。
在使用字面量语法时,属性名可以使用字符串:

var person = {
    "name" : "Nicholas",
    "age" : 29,
    5 : true
};

上面代码中的数值属性名会自动转换为字符串。
使用独享字面量语法时,如果留空其花括号,可以定义只包含默认属性和方法的对象:

var person = {};            // 与new Object()相同
person.name = "Nicholas";
person.age = 29;

推荐只在考虑对象属性名的可读性时使用以上形式。
对象字面量是向函数传递大量可选参数的首选方式:

function displayInfo(args) {
    var output = "";

    if (typeof args.name == "string") {
        output += "Name: " + args.name + "\n";
    }

    if (typeof args.age == "number") {
        output += "Age: " + args.age + "\n";
    }

    alert(output);
}

displayInfo({
    name : "Nicholas",
    age: 29
});

displayInfo({
    name: "greg"
});

javascript也可以使用方括号表示法来访问对象的属性,使用方括号语法时,应该将要访问的属性以字符串的形式放在方括号中。方括号语法的主要优点是可以通过变量来访问属性:
var propertyName = "name";
alert(person[propertyName]); // "Nicholas"
如果属性名中包含会导致语法错误的字符(如空格),或者属性名使用的是关键字或保留字,也可以使用方括号表示法。

Array类型

ECMAScript数组的每一项可以保存任何类型的数据,也就是说,第一个位置可以保存字符串,第二个位置可以保存数值等。
ECMAScript数组的大小是可以动态调整的,即可以随着数据的添加自动增长以容纳新增数据。
创建数组的两种方式:

  • 方式一:使用Array构造函数:
    var colors = new Array();
    使用Array构造函数时也可以省略new操作符。
  • 方式二:数组字面量表示法。数组字面量由一对包含数组想的方括号表示,多个数组项之间以逗号隔开:
    var colors = ["red", "blue", "green"]; //创建一个包含3个字符串的数组
    var names = []; //创建一个空数组
    var values = {1, 2,]; //不要这样!这样会创建一个包含2或3项的数组
    var options = [,,,,,]; // 不要这样!这样会创建一个包含5或6项的数组

读取和设置数组的值时,要使用方括号并提供响应值的基于0的数字索引。
数组的length属性不是只读的,因此,可以通过设置这个属性,来从数组末尾移除项或向数组中添加新项:

检测数组

使用instanceof操作符可以确定一个对象是否是数组,它假定单一的全局执行环境。当存在两个以上全局执行环境时,该操作符不适用。
ECMAScript5新增了Array.isArray()方法,该方法可以在多个全局执行环境时判断某个值是否是数组。
支持Array.isArray()方法的浏览器有:IE9+、Firefox 4+、Safari 5+、Opera10.5+和Chrome。

转换方法

调动toString()方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串。
调用vlueOf()返回的还是数组。
eg:

var colors = ["red", "blue", "green"];          //创建一个包含3个字符串的数组
alert(colors.toString());                       // red,blue,green
alert(colors.valueOf());                        // red, blue, green
alert(colors);                                  // red, blue, green

使用join()方法,可以使用不同的分隔符来构建数组字符串表示

var colors = ["red", "blue", "green"];          //创建一个包含3个字符串的数组
alert(colors.join(","));                       // red,blue,green
alert(colors.join("||"));                        // red||blue||green
alert(colors);                                  // red, blue, green

如果数组中的某一项的值是null或者undefined,则该值在Join()、toLocale-string()、toString()和valueOf()方法回回的结果中以空字符串表示。

栈方法

栈是一种LIFO(Last-In-First-Out,后进先出)的数据结构,最新添加的项最早被移除。
ECMAScript为数组提供了pop()和push()方法。
push()方法可以接受任意数量的参数,把他们逐个添加到数组末尾,并返回修改后数组的长度。

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);                                //"balck"
alert(colors.length);                       //2

队列方法

队列数据结构的访问规则是FIFO(First-In-First-Out,先进先出)。
方法shift()能够移除数组中的第一个项并返回该项,同时将数组长度减1.结合使用shift()和push()方法,可以实现队列的功能。
unshift()方法在数组前端添加任意个项并返回新数组的长度。同时使用unshift()和pop()方法可以实现反向队列。

重排序方法

reverse()和sort()方法可以实现数组的排序,其中reverse()方法反转数组项的顺序。
默认情况下sort()方法按升序排列数组项。
sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,及时数组中的每一项都是数值,sort()方法比较的也是字符串。
sort()方法可以接受一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。比较函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回0,如果第一个参数应该位于第二个之后则返回一个正数。
sort()和reverse()方法的返回值是经过排序之后的数组。

操作方法

concat()方法基于当前数组中的所有项创建 一个新数组。在没有给concat()方法传递参数的情况下,它只是赋值当前数组并返回副本。
如果给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()方法基于当前数组中的一或多个项创建一个新数组,该方法接收一个或两个参数,即要返回项的起始和结束为止,只有一个参数时,该方法返回从改参数指定位置开始到当前数组末尾的所有项,如果有两个参数,该方法返回起始和结束位置之间的项,但不包括结束位置。

var colors = ["red", "green", "blue", "yellow", "purple"];
var colors2 = colors.slice(1);
var colors3 = colors.slice(1, 4);

alert(colors2);             //green,blue,yellow,purple
alert(colors3);             //green,blue,yellow

slice()方法的参数如果为负数,则用数组长度加上该数来确定相应的位置,如对于以上例子:slice(-2, -1)=slice(3, 4),如果结束为止小于起始位置,则返回空数组。

splice()方法向数组的中部插入项,该方法有如下3中使用方式

  • 删除:可以删除任意数量的项,只需指定2个参数:要删除的第一项的位置和要删除的项数。eg:splice(0,2)会删除数组中的前两项
  • 插入:可以向指定位置插入任何数量的项,只需提供3个参数:起始位置、0(要删除的项数)和要插入的项。如果要插入多个项,可以再传入第四、第五,以致任何多个项。eg:splice(2, 0, "red", "green")会从当前数组的位置2开始插入字符串"red"和"green"。
  • 替换:可以向指定位置插入任意数量的项,同时删除任意数量的项,只要指定3个参数:起始位置、要删除的项和要插入的任意数量的项,插入的项不必与删除的项数相等。eg:splice(2, 1, "red", "green")会删除当前数组位置2的项,然后再从位置2开始插入字符串"red"和"green"。
    splice()方法始终返回一个数组,包含从原始数组中删除的项(如果没有删除任何项,则返回一个空数组)

位置方法

indexOf()和lastIndexOf()两个方法都接受两个参数:要查找的项和(可选的)表示查找起点位置的索引。indexOf()方法从数组开头开始向后查找,lastIndexOf()从数组的末尾向前查找。没有找到的情况下返回-1.比较时使用全等操作,要求查找的项必须严格相等。
支持这两个方法的浏览器包括:IE9+、Firefox 2+、Safari3+、Opera9.5+和Chrome。

迭代方法

  • every():对数组中的每一项运行给定函数,如果该函数对没想都返回true,则返回true。
  • filter():对数据组中的每一项运行给定函数,返回该函数会返回true的项组成的数组。
  • forEach():对数组中的每一项运行给定函数。这个方法没有返回值。
  • map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
  • some():对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true。

以上方法都不会修改数组中的包含的值。

var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];

var everyResult = numbers.every(function(item, index, array) {
    return (item > 2);
});

alert(everyResult);                     // false

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

filter()函数利用指定的函数确定是否在返回的数组中包含的某一项,eg:返回一个所有数值都大于2的数组:

var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];

var filterResult = numbers.filter(function(item, index, array) {
    return (item > 2);
});

alert(filterResult);                //[3, 4, 5, 4, 3]

map()也返回一个数组,而这个数组的每一项都是在原始数组中的对应项上运行传入函数的结果。

var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];

var mapResult = numbers.map(function(item, index, array) {
    return item * 2;
});

alert(mapResult);       //[2, 4, 6, 8, 10, 8, 6, 4, 2]

支持这些迭代方法的浏览器有:IE9+、Firefox2+、Safari3+、Opera9.5+和Chrome。

缩小方法

reduce()和reduceRight()方法会迭代数组的所有项,然后构建一个最终返回的值。reduce()方法从数组的第一项开始,逐个遍历到最后。reduceRight()方法从最后一项开始,遍历到第一项。两个方法都接受两个参数:一个在每一项上调用的函数和(可选的)作为缩小基础的初始值。

Date类型

Date类型使用自UTC(Coordinated Universal Time,国际协调时间)1970年1月1日午夜(零时)开始经过的毫秒数来保存日期。
创建日期对象,使用new操作符和Date构造函数即可:
var now = new Date();
Date构造函数不传递参数时,新创建的对象自动获得当前日期和时间。传入参数为表示该日期的毫秒数。
Date.parse()方法接受一个表示日期的字符串参数,返回相应日期的毫秒数。此方法的行为因实现而异。如果传入参数不能表示日期,则返回NaN。
Date.UTC()方法接受的参数分别是年份、基于0的月份(一月是0,二月是1,以此类推)、月中的哪一天、小时数、分钟、秒以及毫秒。其中只有年和月是必须的,如果没有天数参数,则假设天数为1,其他参数省略时,默认值都为0.
Date.now()方法,返回表示调用这个方法时的日期和时间的毫秒数。

继承的方法

Date类重写了toLocaleString()、toString()和valueOf()方法。

日期格式化方法

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

日期/时间组件方法

方法说明
getTime()返回表示日期的毫秒数;与valueOf()方法返回的值相同
setTime(毫秒)以毫秒数设置日期,会改变整个日期
getFullYear()取得4位数的年份(如2007而非仅07)
getUTCFullYear()返回UTC日期的4位数年份
setFullYear(年)设置日期的年份。传入的年份值必须是4位数字(如2007而非07)
setUTCFullYear(年)设置UTC日期的年份。传入的年份值必须是4位数字(如2007而非07)
getMonth()返回日期中的月份,其中0表示一月,11表示十二月
getUTCMonth()返回UTC日期中的月份,其中0表示一月,11表示十二月
setMonth(月)设置日期的月份。传入的月份值必须大于0,超过11则增加年份
setUTCMonth(月)设置UTC日期的月份,传入的月份值必须大于0,超过11则增加年份
getDate()返回日期月份中的天数(1到31)
getUTCDate()返回UTC日期月份中的天数(1到31)
setDate(日设置日期月份中的天数。如果传入的值超过了该月中应有的天数,则增加月份
setUTCDate(日)设置UTC日期月份中的天数。如果传入的值超过了该月中应有的天数,则增加月份
getDaty()返回日期中星期的星期几(其中0表示星期日,6表示星期六)
getUTCDay()返回UTC日期中星期的星期几(其中0表示星期日,6表示星期六)
getHours()返回日期中的小时数(0到23)
getUTCHours()返回UTC日期中的小时数(0到23))
setHours(小时)设置日其中的小时数。传入的值超过了23则增加月份中的天数
setUTCHours(小时)设置UTC日其中的小时数。传入的值超过了23则增加月份中的天数
getMinutes()返回日期中的分钟数(0到59)
getUTCMinutes()返回UTC日期中的分钟数(0到59)
setMinutes(分)设置日期中的分钟数。传入的值超过59则增加小时数
setUTCMinutes(分)设置UTC日期中的分钟数。传入的值超过59则增加小时数
getSeconds()返回日期中的秒数(0到59)
getUTCSeconds()返回UTC日期中的秒数(0到59)
setSeconds(秒)设置日期中的秒数,传入值超过59则增加分钟数
setUTCSeconds(秒)设置UTC日期中的秒数,传入值超过59则增加分钟数
getMilliseconds()返回日期中的毫秒数
getUTCMilliseconds()返回UTC日期中的毫秒数
setMilliseconds(毫秒)设置日期中的毫秒数
setUTCMilliseconds(毫秒)设置UTC日期中的毫秒数
getTimezoneOffset()返回本地时间与UTC时间相差的分钟数。例如,美国东部标准时间返回300。在某地进入夏令时的情况下,这个会有所变化

RegExp类型

语法:
var expression = / pattern / flags;
pattern(模式)可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。
每个正则表达式都可以带一个或朵儿标志(flags),用以表明正则表达式的行为,支持下列3个标志。

  • g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;
  • i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;
  • m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在于模式匹配的项。
    RegExp构造函数接收两个参数:一个是要匹配的字符串模式,另一个是可选的标志字符串。传递给RegExp构造函数的两个参数都是字符串,在某些情况下要对字符进行双重转义。

RegExp实例属性

RegExp的每个实例都具有下列属性:

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

RegExp实例方法

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

test()方法接受一个字符串参数,在模式与该参数匹配的情况下返回true;

RegExp构造函数属性

var text = "this has been a short summer";
var pattern = /(.)hort/g;

/*
注意:Opera不支持input、lastMatch、lastParent和Multiline属性
Internet Explorer不支持multiline属性
 */if (pattern.test(text)) {
    alert(RegExp.input);            //this has been a short summer
    alert(RegExp.leftContext);      //this has been a
    alert(RegExp.rightContext);     //summer
    alert(RegExp.lastMatch);        //short
    alert(RegExp.lastParen);        //s
    alert(RegExp.multiline);        // false
}

RegExp.$1、RegExp.$2……RegExp.$9,分别用于存储第一、第二……第九个匹配的捕获组。

模式的局限性

ECMAScript正则表达式不支持的特性:

  • 匹配字符串开始和结尾的\A和\Z锚
  • 向后查找(lookbehind)
  • 并集和交集类
  • 原子组(atomic grouping)
  • Unicode支持(单个字符除外,如\uFFFF)
  • 命名的捕获组
  • s(single,单行)和x(free-spacing,无间隔)匹配模式
  • 条件匹配
  • 正则表达式注释

Function类型

每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。
函数声明语法:
function sum (num1, num2) {
return num1 + num2;
}

没有重载

函数声明与函数表达式

作为值的函数

因为ECMAScript中的函数名本身就是变量,所以函数也可以作为值来使用。
可以从一个函数中返回另一个函数。

函数内部属性

在函数内部有两个特殊对象:arguments和this。arguments保存函数参数
callee属性是一个指针,指向拥有这个arguments对象的函数。

函数属性和方法

每个函数都包含两个属性:length和prototype。
length返回函数的参数个数,prototype保存它们所有实例方法的真正所在。
每个函数都包含两个非继承而来的方法:apply()和call().这连个方法在特定的作用域中调用函数。
apply()接收两个参数:在其中运行函数的作用域和参数数组
ECMAScript5定义了bind()方法,这个方法创建一个函数的实例,其this值会被绑定传给bind()函数的值。

基本包装类型

Boolean、Number、String

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值