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 种标志:
- g : 整个字符串匹配,而非遇到第一个满足的子串就结束
- i : 匹配时忽略大小写
- 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
类型的实例,而且和其他 引用类型 一样具有 属性和方法,并且由于函数也是 对象,所以函数名实际上是指向 函数对象 的指针,而不是和某个特定的函数绑定的
函数的几种创建方式:
- 函数声明 :
function test(){ ...... }
- 函数表达式 :
var test = function [name](){ ...... }; // => 函数名 name 可有可无
- 使用
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进行解码