天天看点

JS -- 高程 - chapter5( 引用类型 )

Object类型

创建

Object

类型的实例有两种方式,一是使用构造函数

var person = new Object()

二是使用对象字面量

var person = { }

,通过字面量创建对象时,不会调用

Object

的构造函数

Array类型

创建

Array

类型对象的方式有两种,一种是使用构造函数,二是使用字面量 ,使用字面量时不会调用

Array

构造函数

构造函数:

var arr = new Array() // 创建一个空数组

var arr = new Array(3) // 创建一个长度为 3 的数组

var arr = new Array(1,2) // 创建数组长度为 2 ,值为 1、2 的数组(注意和上方的不同)

字面量:

var arr = [1,2]

var arr = []

var arr = [1,2,] // 不建议

var arr = [ , , , ] // 不建议

数组对象的长度保存在

length

属性上,这个属性不是只读的,可以通过改变它来实现数组的删除和扩容( 数组末尾 )

2.1 转换方法

数组的

valueOf

方法,返回自身

如果数组中的某一项是

undefined

或者

null

,则

toString、toLocalString、valueOf

使用 空字符串 表示这两个值

2.2 栈方法

ECMA 为数组实现了

push、pop

方法,可实现类似栈的行为

push

: 可以向数组中从末尾推入任意数量的值,若值为数组,将整个数组推入当成一个元素,返回添加后的数组长度

pop

: 从数组的末尾弹出一个元素,并将数组的

length

属性值 减 1,返回被弹出的元素

2.3 队列方法

shift

方法可以获得数组第一项的值,

unshift

方法则与之相反,是向数组头部插入任意数量个元素

shift

: 将数组头部的元素弹出数组,并返回其值,同时将数组长度减 1

unshift

: 向数组头部插入任意数量个元素,并返回插入后数组的长度

2.4 排序方法

reverse

方法会反转元素在数组中的顺序,

sort

则可以对数组中的元素根据某种规则进行排序,两个方法都返回排序后的数组

sort

: 默认情况下,按照升序顺序排序,会对每个元素调用

toString

方法,然后对其排序,其可以接受一个函数来自定义排序规则( 函数有两个参数,分别为需要比较的两个元素 )

比较函数返回规则:如果 元素1 应该位于 元素2 之前,则返回负数,反之则返回正数,相同返回 0

(a, b) => a - b // 升序排列(a<b, 则 a 在前)

(a, b) => b - a // 降序排列(a<b, 则 a 在后)

2.5 操作方法

concat

: 该方法可以基于当前数组中的所有元素创建一个新数组。该方法会先创建当前数组的一个副本,然后将参数中的项添加到副本的数组末尾,然后返回这个副本数组,如果参数为数组,则将数组中的每一项添加到复制数组中

**

slice

:**基于当前数组的一个或多个元素创建一个新数组,可以接收两个参数,表示从第一个参数位置开始,截取到第二个参数位置( 不包括 )的所有元素,如果只传第一个参数,则从第一个参数位置开始,截取到数组末尾。

两个参数都可以为负值

第一个参数为负值的时候,会从

数组长度 + 第一个参数

的位置开始截取元素,若参数的绝对值 >= 数组长度,则返回整个数组的副本

[1,2,3].slice(-1) // => [3]

[1,2,3].slice(-4) // => [1,2,3]

第二个参数为负值的时候,会截取第一个参数开始,到

数组长度 + 第二个参数

的位置的元素,若

数组长度 + 第二个参数

的值 <= 第一个参数,则返回一个空数组

[1,2,3].slice(1,-1) // => [2]

[1,2,3].slice(1,-3) // => []

两个参数都为负值的时候,从

数组长度 + 第一个参数

截取到

数组长度 + 第二个参数

的位置

[1,2,3].slice(-2,-1) // => [2]

**

splice

:**该方法可以 删除、插入、替换 当前数组元素,始终返回一个数组,该数组包含了从原数组中 删除 的元素,没有则返回空数组

  • 删除 : 可以删除任意数量的元素,需要指定 两个参数,第一个参数表示开始删除的位置,第二个参数表示要删除的元素的数量。

    [1,2,3,4].splice(1,1) // => [2]

  • 插入 : 可以向指定位置插入任意数量元素,需要指定 至少三个参数 ,起始位置、0( 要删除的元素数量 )、要插入的元素( rest )。

    [1,2,3].splice(1,0,4,5,6) // => arr: [1,4,5,6,2,3]

  • 替换 : 可以将指定位置开始的 n 个元素替换为其他元素( 数量不一定相等 ),需要指定 至少三个参数,起始位置、n ( 需要替换的元素个数 )、替换的元素( rest )。

    [1,2,3].splice(1,1,4) // => arr: [1,4,3]

2.6 位置方法

indexOf、lastIndexOf

用于查找元素在数组中的位置,使用全等 ===,未找到则返回 -1 ,并且可以将第二个参数作为起始位置,开始查找,返回的是元素的下标

2.7 迭代方法

ES5 定义了 5 个迭代方法,都可以接收 两个参数, 第一个参数是要在每个元素上运行的函数,第二个参数是该函数内部的

this

值 ( 箭头函数的

this

值无法被绑定 ),运行函数可以接收三个参数,当前元素、元素索引、当前数组对象

every

: 对数组每个元素执行给定函数,每个元素执行结果都返回

true

,则返回

true

,只要元素执行返回

false

,就不会继续执行下去,立即返回

false

filter

: 对数组每个元素执行给定函数,返回执行给定函数时返回

true

的元素组成的 新数组

forEach

: 对数组每个元素执行给定函数,没有返回值,给定函数返回值不会影响原数组元素

map

: 对数组每个元素执行给定函数,返回每次函数调用的返回结果组成的 新数组

some

: 对数组每个元素执行给定函数,只要有一个元素执行返回

true

,就 立即 返回

true

,不会继续执行后面的元素

2.8 归并方法

reduce、reduceRight

都会迭代所有元素,并且构建一个最终的返回值,只是方向相反,

reduce

从数组头部开始执行,

reduceRight

从数组末尾开始执行

两个方法都接收 两个参数**:** 在每个元素上调用的函数、作为归并基础的初始值

调用函数可以接收 四个参数**:** 前一个值( 归并的值 )、当前元素、元素索引、当前数组对象

如果没有指定归并的初始值,则从第二个元素开始执行,执行函数的第一个参数为第一个元素,如果指定了归并的初始值,则从第一个元素开始执行,执行函数的第一个参数为初始值

####2.8 数组方法类型

数组的方法可以分为 变异方法 和 非变异方法,变异方法 即指 方法会 改变原数组,非变异方法则不会改变原数组

变异方法:

push、 pop、 shift、 unshift、 reverse、 sort、 splice

非变异方法:

concat、 slice、 forEach、 map、 filter、 every、 some

Date类型

ECMA 中的

Date

类型使用 UTC 1970年 1 月 1 日零时开始,到现在经过的毫秒数来保存日期

调用构造函数而不传参数时,新创建的对象会自动获得当前日期,若想根据特定日期、时间创建对象,必须传入该日期的毫秒数,或者传入类似

Date.parse、Date.UTC

方法的参数

Date

提供了

Date.parse、Date.UTC

两个方法来获取指定日期的毫秒数,

parse

会尝试将日期字符串参数解析为毫秒数,解析失败返回 NaN

Date.UTC

: 最多可以接收 七个参数,分别为 年份、月份(011)、天(131)、小时(0~23)、分钟、秒、毫秒,只有前两个参数是必须的,其他参数未传默认为 0 ( 创建的时间是GMT时间 )

Date.UTC(2018,0,20,18,30,20) // => 2018 年 1 月 20 日 18 点 30 分 20 秒

UTC 日期指的是没有时区偏差情况下的日期值

###RegExp

ECMA 可以通过类似 Perl 的语法创建正则表达式:

var reg = / parttern / flags

正则表达式的匹配模式支持以下 3 种标志:

  1.   g : 整个字符串匹配,而非遇到第一个满足的子串就结束
  2.   i : 匹配时忽略大小写
  3.   m: 多行匹配

三种标志可以同时使用

若想匹配元字符本身,模式( pattern )中所有元字符都必须转义,元字符包括:( )    { }   [ ]    \    *    .   ^   $   |   ?   +

第二种创建正则表达式的方式是使用

RegExp

构造函数,它接收两个参数,要匹配的模式字符串、可选的标志字符串

使用构造函数时,所有转义的元字符必须使用双重转义:

/\[a/ => "\\[a"

实例属性

  • global: 标识是否设置了 g 标志
  • ignoreCase: 标识是否设置了 i 标志
  • lastIndex: 表示开始搜索下一个匹配项的开始位置( 一开始为 0 )
  • mutiline: 标识是否设置了 m 标志
  • source: 返回该正则的字面量表示形式的模式

实例方法

exec

: 该方法专门为捕获组而设计,接收一个要匹配的字符串参数,返回包含第一个匹配项信息的数组,未匹配到返回 null

返回的数组包含两个额外属性,

index

input

,分别表示匹配到的 位置索引、匹配的字符串( 还有个 groups 属性 )

在数组中,第一项是与整个模式匹配的所有字符串,以空格分开,其他项是与模式中的捕获组匹配的字符串

对于

exec

方法,即使设置了 g 标志,每次也只会返回一个匹配项,而每次对这个字符串执行

exec

方法,若设置了 g 标志,则会在上一次的基础上向后查询,否则一直返回第一个匹配项( 最后一次匹配之后再执行,会返回 null,因为没有匹配到,再执行就会从头开始)

test

: 判断目标字符串中是否和正则表达式中的模式匹配,接收一个字符串参数,有匹配则返回

true

,否则返回

false

构造函数属性

正则的构造函数属性:

  • input: 最近匹配的字符串
  • lastMatch: 最近一次匹配的字符串
  • lastParen: 最近一次的捕获组
  • leftContext: 当前匹配的( lastMatch )左边的字符串
  • rightContext: 当前匹配的( lastMatch )右边的字符串

还有 $1~9 表示捕获组,

exec

test

方法都会自动填充这几个属性

Function类型

每个函数都是

Function

类型的实例,而且和其他 引用类型 一样具有 属性和方法,并且由于函数也是 对象,所以函数名实际上是指向 函数对象 的指针,而不是和某个特定的函数绑定的

函数的几种创建方式:

  1. 函数声明 :

    function test(){ ...... }

  2. 函数表达式 :

    var test = function [name](){ ...... }; // => 函数名 name 可有可无

  3. 使用

    Function

    var test = new Function(arg1, args, "return arg1 + arg2")

    ,该构造函数可以接收任意个数的参数,最后一个参数被视为函数体,前面的参数都视为函数参数,不推荐这种写法

函数表达式与函数声明: 解析器会先读取函数声明,并使其在执行任何代码前可用( 变量提升 ),而函数表达式则必须等到解析器执行到所在处代码,完成赋值之后,才可以被执行

函数内部属性

在函数内部,有两个特殊的属性

arguments、this

,其中

arguments

对象不仅保存着函数的参数,其还有一个属性

callee

指向拥有该

arguments

对象的函数,

this

引用的是函数执行的环境对象

函数对象还有一个属性

caller

,它保存着调用当前函数的函数的引用( 函数调用时所在的函数 )

函数属性和方法

属性

每个函数都包含两个属性

length、prototype

length

属性表示函数的形参列表的参数个数,

prototype

属性则指向函数的原型对象

方法

每个函数都包含两个非继承来的方法:

apply、call

,这两个方法的目的是改变函数体内的

this

指向

call

: 接收任意多个参数,第一个参数是执行函数时的

this

值,其余参数是执行时函数的参数

apply

: 接收两个参数,第一个参数是执行函数时的

this

值,第二个值是一个数组或者类数组对象,表示函数执行时用到的参数

使用

call、apply

时,函数会立即执行并返回结果

ES5 还定义了一个

bind

方法,该方法会创建一个函数实例,并且该实例内部的

this

指向

bind

方法传入的参数,该方法还支持传入多个参数( 类似

call

方法,但不会立即执行 )

基本包装类型

Object 构造函数会像工厂方法一样,根据传入值的类型返回对应包装类型的实例

Number类型

将数值格式化为字符串的方法:

  • toFixed

    : 按照参数指定的小数位( 支持 0~20 ),返回对应的字符串,会进行 四舍五入
  • toExponential

    : 返回指数表示法的字符串,接收一个参数指定小数位数,会进行 四舍五入
  • toPrecision

    : 根据情况返回

    toFixed

    的形式或者

    toExponential

    的形式,该方法接收一个参数,表示数值所有字数的位数( 一共几位 ),会进行 四舍五入

单体内置对象

内置对象:由 ECMA 提供实现,不依赖于宿主环境的对象

Global对象

URI编解码方法:

  • encodeURI : 主要用于整个URI,不会对URI 的特殊字符转义,例如 /   :  ?  #
  • encodeURIComponent: 主要用于URI的一部分,会对URI的特殊字符进行转义
  • decodeURI: 对使用 encodeURI 方法转义的URI进行解码
  • decodeURIComponent: 对使用 encodeURIComponent 方法转义的URI进行解码