注意: 本文章为 《重学js之JavaScript高级程序设计》系列第五章【JavaScript引用类型】。 关于《重学js之JavaScript高级程序设计》是从新回顾js基础的学习。前端
引用类型的值(对象)是引用类型的一个实例。在ES中,引用类型是一种数据结构,用于将数据和功能组织在一块儿,也被称之为类。但这并不稳当,引用类型有时候也被称为对象定义,由于它们描述的是一类对象所具备的属性和方法。正则表达式
对象是某个特定引用类型的实例。新对象是使用 new 操做符跟一个 构造函数来建立的。构造函数自己就是一个函数,只不过该函数是出于建立新对象的目的而定义的,以下:segmentfault
var person = new Object();
复制代码
上面这行代码建立了 Object 引用类型的一个新实例,而后把该实例保存在变量person中。使用的构造函数是 Object ,它只为新对象定义了默认的属性和方法。数组
建立object实例的方式有两种。第一种使用new操做符后跟object函数,第二种使用对象字面量表示法,对象字面量是对象定义的一种简写形式。浏览器
// 第一种方法
var person = new Object()
person.name = 'nice'
person.age = 20
// 第二种方法
var p = {
name : 'nice',
age: 29
}
复制代码
咱们能够经过两种方式来访问对象的属性bash
p.name = nice
p['name'] = nice
复制代码
在ES 中数组的每一项能够保存任何类型的数据,也就是说,能够用数组的第一个位置来保存字符串,第二个位置来保存数值,第三个位置保存对象。另外数组的大小是能够动态调整的,能够随着数据的添加自动增加以容纳新的数据。数据结构
建立数组的两种方式app
var c = new Array() // 初始值是 undefined
var b = new Array(20) // 建立一个包含20个元素的数组
var a = new Array('a', 'b') // 包含 a b 两个元素的数组
复制代码
var a = [1,2,3] // 包含3个数字的数组
var n = [] // 一个空数组
var v = ['a', 'c'] // 两个字符串的数组
复制代码
a[0] // 1 方括号中的值就是数组的索引。返回数组对应的值
a[4] // 若是值超过了数组的长度,则会增长到该索引值加1的长度
n[2] // [undefined, undefined]
复制代码
注意: 数组的length不是制度的,能够经过设置这个属性来往数组中增长删除项。数组的最后一项的索引 永远是 length -1,所以下一项的位置就是length。另外数组最多能够包含 4294967295个项,函数
在以前的描述中,全部的对象都具备 toLocaleString()、toString() 和 value() 方法,其中调用数组的 toString()和 valueOf() 方法会返回相同的值,即由数组中每一个值的字符串形式拼接而成以逗号分隔的字符串。以下:post
var a = ['a', 'b', 'c'];
a.toString() // a,b,c
a.valueOf() // a,b,c
复制代码
数组继承的 toLocaleString()、toString()、valueOf 方法 在默认状况下都会以逗号分隔的字符串形式返回数组项。若是使用 ‘join’ 方法,则可使用指定的分隔符来构建这个字符串。它只接受一个参数,用做分隔符的字符串,返回包含全部数组项的字符串。以下
var c = ['a', 'b', 'c']
c.join(',') // a,b,c
c.join('/') // a/b/c
复制代码
注意: 数组中的某一项的值是null 或者 undefined,那么该值在join()、toLocaleString()、toString()、valueOf()方法返回的字符串中以空表示
在 ES 中 为数组也提供了一个让数组的行为相似于其余数据结构的方法,就是说数组能够表现的像栈同样呢,能够限制插入和删除的数据结构。 栈的特性就是 后进先出 ,最新添加的项最先被删除。栈中项的插入 和 移除只发生在栈的顶部。ES 为数组提供了 pop() 和 push() 方法
push() 是插入项,每次添加在数组的末尾,能够插入任意参数
let a = [1,2]
a.push(3) // [1,2,3]
pop() 删除数组的最后一项
a.pop() // [1,2]
复制代码
栈数据结构是遵循 先进后出 ,而队列数据结构的访问规则 是 先进先出。队列的末端添加项,从列表的前端移除项。因为 push() 是想数组末端添加项的方法,若是要获取数组的首端项, 则 须要 shift() 方法。同时还有 unshift() 方法,在数组的最前端添加。
let a = [1,2]
a.shift() // 1 a => [2]
a.unshift(3) // a => [3,2]
复制代码
数组中能够用 reverse() 和 sort() 对数组进行排序,其中 reverse() 是对数组反转。sort() 默认是对数组升序排列,可是也能够由条件进行控制。
let a = [1,2,3,4]
a.reverse() // a => [4,3,2,1]
let a = [1,3,5,2,7]
a.sort() // a => [1,2,3,5,7]
复制代码
ES 为数组提供了不少方法, concat() 是基于当前数组建立一个新数组。
规则:
slice() 基于当前数组中的一个或多个项建立新数组。接受 一到两个参数,即返回数组的开始和结束位置。若是只有一个参数,则返回的是起始位置到数组结束位置的全部值。它不会影响原数组。另外若是是两个参数,它返回的是第一个值到最后一个值前一个之间的值。
let a = [1,2,3,4,5,6,7,8]
a.slice(2,4) // [3, 4]
复制代码
splice() 用来 删除、插入、替换数组的值。
建立一个日期对象 var now = new Date() 能够 经过 Date.parse() 和 Date.UTC() 来获取特定的日期和时间对象
Date.parse() 接受一个表示日期的字符串参数。
Date.UTC() 返回表示日期的毫秒数
复制代码
跟其余类型同样,Date类型也重写了 toLocaleString()、toString() 和 valueOf()方法。在不一样浏览器,不一样时区,toLocalString() 返回值不一样。
Date类型为日期格式化为字符串提供了以下方法:
经过RegExp 类型支持正则表达式
g 表示全局模式,即模式被应用于全部字符串,而非发现的第一个匹配项时当即中止
i 表示不区分大小写模式,即在肯定匹配项时忽略模式与字符串的大小写
m 表示多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项
每个函数都是Function类型的实例,并且都与其余引用类型同样具备属性和方法。因为函数是对象,所以函数名实际上也时一个指向函数对象的指针,不会与某个函数绑定,函数一般是使用函数声明语法定义的。以下:
function a (b,c){
return b + c
}
// 函数表达式声明
var s = function(a,b){
return a + b
}
复制代码
若是命名两个相同 function 那么后一个将会覆盖前一个
function a(b) {
retrun b + 100
}
function a(b){
return b + 200
}
a(100) // 300
复制代码
在执行环境中加载数据的时候,对于函数表达式和函数声明,解析器优先读取函数声明,并使其在执行任何代码以前可用,至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正的被执行。
由于ES 中的函数名自己就是变量,因此函数也能够做为值来使用,也就是说,不只能够像传递参数同样把一个函数 传递给另一个函数,并且能够将一个函数做为另一个函数的结果返回。
在函数内部,有两个特殊的对象:arguments 和 this。其中,arguments 是一个类数组对象,包含着传入函数中的全部参数,虽然 arguments 的主要用途是保存函数参数,可是这个对象还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments对象的函数。
this 引用的是函数据以执行操做的对象,或者说 this 是函数在执行时所处做用域,若是是全局 this 指向 window
注意: 函数的名字仅仅是一个包含指针的变量而已。
ES 中函数是对象,所以函数也有属性和方法,每一个函数都包含两个属性:length 和 prototype。其中length 表示 函数但愿接收的命名参数的个数。
prototype 是保存它们全部实例方法的真正所在,换句话说,诸如 toString() 和 valueOf() 等方法实际上保存在prototype名下。只不过经过各自对象的实例访问。
每一个函数都包含两个非继承而来的方法: apply() 和 call()。这两个方法的用途都是特定的做用域中调用函数,实际上等于设置函数内 this 对象的值。
apply()
接受两个参数:一个是其运行函数的做用域,另外一个是参数数组。
其中第二个参数能够是 Array 的实例也能够是 arguments对象。
call()
和 apply() 的做用相同,只是接受参数的方式不一样,第一个参数同
apply(), 第二个参数是一个参数列表而不是数组。
复制代码
为了便于操做基本类型值,ES 还提供了3个特殊的引用类型: Boolean、Number 和 String。
Boolean 类型是布尔值对应的引用类型。要建立Boolean对象,能够像下面这样调用Boolean构造函数并传入 true 或 false 值。
let a = new Boolean(true)
复制代码
注意: 基本类型与引用类型的布尔值还有两个区别,首先,typeof操做符对基本类型返回“boolean”,而对引用类型返回“object”。其次,因为Boolean对象是Boolean类型的实例,因此使用 instanceof操做符 测试 Boolean 对象会返回 true,而测试基本类型的布尔值则返回 false。
Number 是数字值对应的引用类型。要建立Number对象,能够在调用Number构造函数是向其中传递相应的数值。以下:
let n = new Number(10)
复制代码
Number 提供了 toFixed() 方法,来格式化为字符串
在使用 typeof操做符测试基本类型数值时,始终返回 number ,而在测试 Number 对象时,则返回 object。Number 对象是 Number 类型的实例。而基本类型的数值则不是。
String 类型是字符串的对象包装类型,以下:
let s = new String('zifuchuan')
复制代码
charAt() // 接收一个参数,基于0的字符位置。以单字符串的形式返回给定位置的哪一个字符。
let s = 'abc'
a.charAt(1) // a
charCodeAt() // 也是接受一个参数,可是返回的是字符串的编码
a.charCodeAt() // 97
复制代码
concat() // 接受任意字符串,将字符串进行拼接
slice() // 截取字符串 从第一个参数 到第二个参数结束,如没有第二个参数则到最后一位
substring() // 同上
substr() // 同上
复制代码
indexOf() // 都是从第一个字符串中搜索给定的子字符串
lastIndexOf()
复制代码
toLocaleUpperCase() // 转为大写
toUpperCase() // 同上
toLocaleLowerCase() // 转为小写
toLowerCase() // 同上
复制代码
match() // 接受一个参数,要么为正则表达式,要么为RegExp 对象。
复制代码
比较两个字符串,返回以下:
- 若是字符串在字母表中应该排在字符串参数以前,则返回负数
- 若是字符串等于字符串参数,返回0,
- 若是字符串在字母表中排在字符串参数以后,返回一个正数。
复制代码
不依赖于宿主环境的对象,这些对象在ES程序执行以前就已经存在了。即没必要显式地实例化内置对象。
不属于任何其余对象的属性和方法,最终都是它的属性和方法。没有全局变量或全局函数,全部在全局做用域中定义的属性和函数,都是Global对象的属性。
ES中为了保存数学公式和信息提供了一个公共位置,即Math对象。
欢迎关注 公众号【小夭同窗】
重学js系列
ES6入门系列
Git教程