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

返回的数组包含两个额外属性,indexinput,分别表示匹配到的 位置索引、匹配的字符串( 还有个 groups 属性 )

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

对于 exec 方法,即使设置了 g 标志,每次也只会返回一个匹配项,而每次对这个字符串执行 exec 方法,若设置了 g 标志,则会在上一次的基础上向后查询,否则一直返回第一个匹配项( 最后一次匹配之后再执行,会返回 null,因为没有匹配到,再执行就会从头开始)

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

 

构造函数属性

正则的构造函数属性:

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

还有 $1~9 表示捕获组,exectest 方法都会自动填充这几个属性

Function类型


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

 
函数的几种创建方式:

  1. 函数声明 : function test(){ ...... }
  2. 函数表达式 : var test = function [name](){ ...... }; // => 函数名 name 可有可无
  3. 使用 Functionvar test = new Function(arg1, args, "return arg1 + arg2"),该构造函数可以接收任意个数的参数,最后一个参数被视为函数体,前面的参数都视为函数参数,不推荐这种写法

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

 

函数内部属性

在函数内部,有两个特殊的属性 arguments、this,其中 arguments 对象不仅保存着函数的参数,其还有一个属性 callee 指向拥有该 arguments 对象的函数,this 引用的是函数执行的环境对象

 
函数对象还有一个属性 caller,它保存着调用当前函数的函数的引用( 函数调用时所在的函数 )

 

函数属性和方法
属性

每个函数都包含两个属性 length、prototypelength 属性表示函数的形参列表的参数个数,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进行解码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值