5引用类型

5.1Object类型

创建Object实例的方式有两种。第一种是使用new操作符后跟Object构造函数。另一种方式是使用对象字面量表示法。对象字面量是对象定义的一种简写形式,目的在于简化创建包含大量属性的对象的过程。在对象字面量中,用逗号来分隔不同的属性。开发人员更青睐对象字面量语法,因为这种语法要求的代码量少,而且能够给人封装数据的感觉。对象字面量也是向函数传递大量可选参数的首选方式。

一般来说,访问对象属性时使用的都是点表示法(建议用点表示法)。不过,在JavaScript也可以使用方括号表示法来访问对象的属性。方括号语法的主要优点是可以通过变量来访问属性。

5.2Array类型

ECMAScript数组中的每一项可以保存任何类型的数据。而且ECMAScript数组的大小是可以动态调整的,即可以随着数据的添加自动增长以容纳新增数据。创建数组的基本方式有两种,第一种是使用Array构造函数,第二种是使用数组字面量表示法。数组的项数保存在length属性中,这个属性不是只读的。通过设置length属性,可以从数组的,末尾移除项或向数组中添加新项。利用length属性也可以方便地在数组末尾添加新项。

Array.isArray()方法的目的是最终确定某个值到底是不是数组,而不管它是在哪个全局执行环境中创建的。

数组继承的toLocalString()、toString()和valueOf()方法,在默认情况下会以逗号分隔的字符串的形式返回数组项。而如果使用join()方法,则可以使用不同的分隔符来构建这个字符串。join()方法只接收一个参数,即用作分隔符的字符串,然后返回包含所有数组项的字符串。

push()和pop()方法可以使得数组表现得像栈一样。栈是一种LIFO(后进先出)的数据结构,在栈中项的插入(或叫推入)和移除(叫做弹出)。只发生在一个位置——栈的顶部。push()方法可以接收任何数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。而pop()方法则从数组末尾移除最后一项,减少数组的length值,然后返回移除的项。 

用shift()和push()可以像用队列一样使用数组。队列数据结构的访问规则是FIFO(先进先出),队列在列表的末端添加项,从列表的前端移除项。shift()能够移除数组中的第一个项并返回该值,同时将数组长度减1。unshift()和shift()的用途相反:它能在数组前端添加任意个项并返回新数组的长度。用unshift()和pop方法,可以用相反的方向来模拟队列,即在数组的前端添加项,从数组末端移除项。

reverse()方法会反转数组项的顺序。sort()方法按升序排列数组项。sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串。sort()方法可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。

concat()方法可以基于当前数组中的所有项创建一个新数组。具体来说,这个方法会先创建当前数组的一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组。slice()方法能够基于当前数组中的一或多个项创建一个新数组。slice()方法可以接受一或两个参数,即要返回项的起始和结束位置。splice()可以删除,插入(最常用)和替换项,第一个参数表示起始位置,第二个参数表示要删除的项数,第三个参数表示要插入的项。

indexOf()和lastIndexOf()方法都接收两个参数,要查找的项和(可选的)表示查找起点位置的索引。indexOf()方法从数组的开头(位置0)开始向后查找,lastIndexOf()方法则从数组的末尾开始向前查找。

ECMAScript5为数组定义了5个迭代方法。每个方法都接收两个参数:要在每一项上运行的函数和(可选的)运行改函数的作用域对象——影响this的值。every()、filter()、forEach()、map()、some()。

reduce()和reduceRight()都是缩小数组的方法。reduce()方法从第一项开始,逐个遍历到最后。reduceRight()则从数组的最后一项开始,向前遍历到第一项。这两个方法都接收两个参数:一个在每一项上调用的函数和(可选的)作为缩小基础的初始值。传给reduce()和reduceRight()的函数接收4个参数:前一个值、当前值、项的索引和数组对象。

5.3Date类型

要创建一个日期对象,使用new操作符和Date构造函数即可。在调用Date构造函数而不传递参数的情况下,被创建的对象自动获得当前日期和时间。参数也可以是日期的毫秒数(即从UTC时间1970年1月1日午夜起至该日期止经过的毫秒数)。Date.parse()方法接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数。Date.UTC()方法同样也返回表示日期的毫秒数,参数分别是年份、基于0的月份(一月是0,二月是1,以此类推)、月中的哪一天(1到31)、小时数(0到23)、分钟、秒以及毫秒数。Date.now()方法返回调用这个方法时的日期和时间的毫秒数。

Date类型的toLocalString()方法会按照与浏览器设置的地区相适应的格式返回日期和时间。而toString()方法则通常返回带有时区信息的日期和时间。

日期格式化方法,toDateString()、toTimeString()、toLocalDateString()、toLocalTimeString()、toUTCString()。

5.4RegExp类型

ECMAScript通过RegExp类型来支持正则表达式。正则表达式的匹配模式支持3个标志,g表示全局模式,i表示不区分大小写模式,m表示多行模式。可以用字面量形式来定义正则表达式,也可以使用RegExp构造函数来定义正则表达式。

RegExp的每个实例都具有下列属性:global,布尔值,表示是否设置了g标志;ignoreCase,布尔值,表示是否设置了i标志;lastIndex,整数,表示开始收索下一个匹配项的字符位置,从0算起;multiline,布尔值,表示是否设置了m标志;sorcerer,正则表达式的字符串表示。

RegExp对象的主要方法是exec(),该方法是专门为捕获组而设计的。exec()包含两个属性:index和input。index表示匹配项在字符串中的位置,而input表示应用正则表达式的字符串。正则表达式的第二个方法是test(),它只接受一个字符串参数。在模式与该参数匹配的情况下返回true,否则,返回false。

RegExp构造函数属性:input、lastMatch、lastParen、leftContext、Multiline和rightContext。

5.5 Function类型

 函数实际上是对象,函数名实际上是一个指向函数对象的指针,不会与某个函数绑定。函数通常使用函数声明语法定义,也可以使用函数表达式定义,最后一种定义函数的方式是使用Funcation构造函数(不推荐)。使用不带圆括号的函数名是访问函数指针,而非调用函数。

函数没有重载。

解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。

因为ECMAScript中的函数名本身就是变量,所以函数也可以作为值来使用。可以像传递参数一样吧一个函数传递给另一个函数,也可以将一个函数作为另一个函数的结果返回。

在函数内部,有两个特殊的对象:arguments和this。arguments的主要用途是保存函数参数,这个对象还有一个名加callee的属性,改属性是一个指针,指向拥有这个arguments对象的函数。this引用的是函数据以执行的环境对象——或者也可以说是this值(当在网页的全局作用域中调用函数时,this对象引用的就是window)。ECMAScript5规范化了另一个函数对象的属性:caller。这个属性中保存着调用当前函数的函数的引用。

ECMAScript中的函数时对象,因此函数也有属性和方法。每个函数包含两个属性:length和prototype。length属性表示函数希望接收的命名参数的个数。每个函数包含两个非继承而来的方法,apply()和call()。这两个方法的用途都是在特定的作用域中调用这两个函数,实际上等于设置函数体内this对象的值。apply()方法接收两个参数,一个是在其中运行函数的作用域,另一个是参数数组。call()方法和apply()方法的作用相同,它们的区别仅在于接收参数的方式不同。使用call()方法时,传递给函数的参数必须逐个列举出来。传递参数并非apply()和call()的真正的用武之地,它们真正强大的地方是能够扩充函数赖以运行的作用域,使用它们来扩充作用域的最大好处就是对象不需要与方法有任何耦合关系。bind()方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。

5.6基本包装类型

引用类型和基本包装类型的主要区别就是对象的生存期。使用new操作符创建的应用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。可以显式地调用Beelean、Number和String来创建基本包装类型的对象。

Boolean类型是与布尔值对应的引用类型。要创建Boolean对象,可以调用Boolean构造函数并传入true或false值。Boolean对象容易造成误解,不建议使用。

Number类型是与数字值对应的引用类型。要创建Number对象,可以调用Number构造函数时向其中传递相应的数值。toFixed()方法会按照指定的小数位返回数值的字符串表示。toExponential()方法返回以指数表示法表示的数值的字符串形式。toPrecision()方法可能会会返回固定大小(fixed)格式,也可能返回指数(exponential)格式,具体规则是看哪种格式最合适。

String类型是字符串的对象包装类型,可以用String构造函数来创建。charAt()和charCodeAt()方法用来访问字符串中特定字符。concat()方法用于将一或多个字符串拼接起来。slice()、substr()和substring()这三个方法都会返回被操作字符的一个子字符串,而且都接收一或两个参数。slice()和substring()的第二个参数指定的是子字符串最后一个字符后面的位置。而substr()的第二个参数指定的则是返回的字符个数,当传入的参数是负数,slice()方法会将传入的负值与字符串的长度相加,substr()方法将负的第一个参数加上字符串的长度,而将负的第二个参数转化为0,substring()方法会将所有的负值参数都转化为0.indexOf()和lastIndexOf()可以从字符串中查找子字符串。toLowerCase()、toLocaleLowerCase()、toUpperCase()和toLocalUpperCase()用于大小写转换。match()、search()和split()用于在字符串中匹配模式。localeCompare()用于比较两个字符串。fromCharCode()的任务是接收一或多个字符编码,然后将它们转化成一个字符串。

5.7单体内置对象

不属于任何其他对象的属性和方法,最终都是Global对象的属性和方法。

ECMAScript还未保存数学公式和信息提供了一个公共位置,即Math对象。

 

posted on 2017-01-12 19:23  U201113877  阅读(113)  评论(0编辑  收藏  举报