首页 > 其他 > 详细

第5章 引用类型

时间:2020-02-25 21:19:48      阅读:99      评论:0      收藏:0      [点我收藏+]

第5章 引用类型

5.1 Object 类型

5.2 Array 类型

5.2.1 检测数组

5.2.2 转换方法

5.2.3 栈方法

5.2.4 队列方法

5.2.5 重排序方法

5.2.6 操作方法

5.2.7 位置方法

5.2.8 迭代方法

5.2.9 缩小方法

5.3 Date 类型

5.3.1 继承的方法

5.3.2 日期格式化方法

5.3.3 日期/时间组件方法

5.4 RegExp 类型

5.4.1 RegExp 实例属性

5.4.2 RegExp 实例方法

5.4.3 RegExp 构造函数属性

5.4.4 模式的局限性

5.5 Function 类型

5.5.1 没有重载(深入理解)

5.5.2 函数声明与函数表达式

5.5.3 作为值的函数

5.5.4 函数内部属性

5.5.5 函数属性和方法

5.6 基本包装类型

5.6.1 Boolean 类型

5.6.2 Number 类型

5.6.3 String 类型

5.7 单体内置对象

5.7.1 Global 对象

5.7.2 Math 对象

5.8 小结

章节内容详解

5.2 Array 类型

创建数组的基本方式有两种。第一种是使用Array 构造函数。如:

var colors = new Array();
console.log(colors);  // []

如果预先知道数组要保存的项目数量,也可以给构造函数传递该数量,而该数量会自动变成length属性的值。如:

var colors = new Array(20);
console.log(colors.length);  // 长度是20,只不过数组每一项都是空的没有值

也可以像Array构造函数传递数组中应该包含的项。以下代码创建了一个包含三个字符串值的数组:

var colors = new Array("red","blue","green");
console.log(colors);  // ["red","blue","green"]

给构造函数传递一个值也可以创建数组。但这时候问题就复杂一点了。因为如果传递的数值,则会按照该数值创建包含给定项数的数组;而如果传递的是其他类型的参数,则会创建包含那个值的只有一项的数组。如:

var colors = new Array(3); //[,,]
var names = new Array("red");//["red"]

5.2.2 转换方法

所有对象都具有toLocaleString()、toString()和valueOf()方法。其中调用数组的toString()方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串。而调用valueOf()返回的还是数组。实际上,为了创建这个字符串会调用数组每一项的toString()方法。

toLocaleString()方法经常也会返回与toString()和valueOf()方法相同的值,但也不总是如此。当调用数组的toLocaleString()方法时,它也会创建一个数组值的以逗号分隔的字符串。而与前两个方法唯一的不同之处在于,这个次为了取得每一项的值,调用的是每一项的toLocaleString()方法,而不是toString()方法。

join() 拼接方法
join()方法只接受一个参数,即用做分隔符的字符串,然后返回包含所有数组项的字符串。

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

如果不给join()方法传入任何值,或者给它传入undefined ,则使用逗号作为分隔符。IE7 及更早版本会错误的使用字符串"undefined"作为分隔符。

如果数组中的某一项的值是null或者undefined,那么该值在join()、toLocaleString()、toString()和valueOf()方法返回的结果中以空字符串表示。

5.2.5 重排序方法

reverse() : 反转数组项的顺序
sort() : 会按圣墟排列数组项(从小到大),这个方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值,sort()方法比较的也是字符串。如果sort()排序数值时可以传入比较函数作为参数,

reverse()和sort()方法的返回值都是经过排序之后的新数组

5.2.6 操作方法

concat() : 方法接受一个或多个参数,返回的是一个拼接完成的新数组,不会修改旧数组

slice(startIndex,endIndex) :没有endIndex 的情况下,返回从startIndex 到数组末尾的所有项。在两个参数都有的情况下,根据索引截取数组项,但是注意不包括endIndex 结束位置的项。并且slice() 方法不会影响原始数组。

如果slice()方法的参数中有一个负数,则用数组长度加上该数确定相应的位置。如果endIndex 小于 startIndex,则返回空数组

splice()方法可以用于数组的删除、插入、替换:

  • 删除:splice(startIndex,delNumber),要删除的第一项的位置和要删除的项数
  • 插入:splice(startIndex,delNumber,addTeam...),要插入的位置,要删除的项数,要添加的项目,可以添加一个或多个
  • 替换: splice(startIndex,delNumber,addTeam...),可以向指定位置插入任意数量的项,且同时删除任意数量的项

splice()方法始终都会返回一个新数组,该数组中包含从原数组中删除的项(如果没有删除任何项,则返回一个空数组),会修改旧数组。

5.2.6 操作方法

indexOf()和lastIndexOf(),这两个方法都接收两个参数:要查找的项和要查找的起点位置的索引(可选)。indexOf() 方法从左往右找,lastindexOf() 方法从右往左找,这两个方法都返回要查找的项在数组中的位置,或者在没有找到的情况下返回 -1 ,这里查找项目的时候使用的是全等操作符(===)。

5.3.3 日期/时间组件方法

getTime() : 返回表示日期的毫秒数;与valueOf()方法返回的的值相同
setTime(毫秒数) : 以毫秒数设置日期,会改变整个日期
getFullYear() : 取得四位数的年份
setFullYear(年) : 设置日期的年份。传入四位数字
getMoth() : 返回日期中的月份,其中 0 表示一月,11表示十二月
setMonth(月) : 设置日期中的月份,传入月份值必须大于0,超过11则增加年份
getDate() : 返回日期月份中的天数(1到31)
setDate(日) : 设置日期月份中的天数。如果传入的值超过了该月中应有的天数,则增加月份
getDay() : 返回日期中星期的星期几(其中0表示星期日,6表示星期六)
getHours() : 返回日期中的小时数(0到23)
setHours(时) : 设置日期中的小时数,传入的值超过了23则增加月份中的天数
getMinutes() : 返回日期中的分钟数(0到59)
setMinutes(分) : 设置日期中的分钟数。传入的值超过了59则增加小时数
getSeconds() : 返回日期中的秒数 (0到59)
setSeconds(秒) : 设置日期中的秒数,传入的值超过了59则会增加分钟数
getMilliseconds() : 返回日期中的毫秒数
setMilliseconds(毫秒) : 设置日期中的毫秒数

5.4 RegExp 类型

JavaScript的正则表达式,在使用字面量创建的时候,模式中使用的所有元字符都必须转义。正则表达式中的元字符包括:

( [ { \ ^ $ | ) ? * + . } ]

传递给RegExp构造函数的两个参数都是字符串(不能把正则表达式字面量传递给RegExp构造函数)。由于RegExp构造函数的模式参数是字符串,所以在某些情况下要对字符进行双重转义。所有原资费都必须双重转义,那些已经转移过的字符也是如此。

字面量模式 等价的字符串
/[bc]at/ "\[bc\]at"
/.at/ "\.at"
/name/age/ “name\/age”
/\d,\d{1,2}/ "\d.\d{1,2}"
/\w\hello\123/ "\w\\hello\\123"

使用正则表达式字面量和使用RegExp构造函数创建的正则表达式不一样。在ECMAScript3中,正则表达式字面量始终会共享一个RegExp实例,而使用构造函数创建的每一个新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。

ECMAScript 5明确规定,使用正则表达式字面量必须像调用RegExp构造函数一样,每次都创建新的RegExp实例。

5.4.1 实例属性

RegExp的每个实例都具有下列属性,通过这些属性可以取得有关模式的各种信息:

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

5.4.2 RegExp实例方法

reg.exec(str)

reg.exec(str) 接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回null。返回的数组虽然是Array 的实例,但包含两个额外的属性:index和input。其中index表示匹配项在字符串中的位置,而input表示应用正则表达式的字符串。在数组中,第一项是与整个模式匹配的字符串,其它项是与模式中的捕获组匹配的字符串(如果模式中没有捕获组,则该数组只包含一项)

对于exec()方法而言,即使在模式中设置了全局表示(g),它每次也只会返回一个匹配项。在不设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项的信息。而在设置全局标志的情况下,每次调用exec()则都会在字符串中继续查找新匹配项。

reg.test(str)

reg.test(str) 正则在字符串中是否可以匹配到,始终返回布尔值。

5.5.2 函数声明与函数表达式

解析器在想执行环境中加载数据时,会有一个函数声明提升的过程,这个过程就是把当前执行环境中的所有函数声明提升到顶部,并且防止源代码树的顶部,所以就算你当前任何地方都可以调用函数了。

但是函数表达式形式(就是把一个匿名函数赋值给一个变量的形式)就不会有这个函数声明提升的过程,只有解析到当前代码行才会有那个函数,如果提前调用函数就会报错。

5.5.4 函数内部属性

在函数内部有两个特殊的对象:arguents和this。

arguments.callee 始终指向当前函数
arguments.caller 指向调用当前函数的函数

严格模式下 访问arguments.callee会报错,ECMAScript5 还定义了arguments.caller属性,但是在一个模式下访问它也会导致错误,而在非严格模式下这个属性始终是undefined。

严格模式下还不能为函数的caller属性赋值,否则会导致报错

5.5.5 函数属性和方法

每个函数都包含两个属性:

  • length :定义函数时候需要传入的参数的个数
  • prototype : 保存所有实例方法

修改函数体内this对象的值的两个方法:apply()和call()。调用这两个方法的时候其实也就是执行函数了,只不过是调用函数的同时改变了函数内部的this指向。

apply()方法接受两个参数:一个是要指向的this,另一个是参数数组。第二个参数可以是Array的实例,也可以是arguments对象。

在严格模式下,未指定环境对象而调用函数,则this值不会转型为window。除非明确把函数添加到某个对象或者调用apply()或call(),否则this值将是undefined。

call()方法第一个参数是要指向的this,后面跟着多个要传递给函数的参数,多个参数需要都列出来

第5章 引用类型

原文:https://www.cnblogs.com/jiaoshou/p/12305688.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!