【JavaScript】JavaScript高级程序设计 第五章引用类型

引用类型的值(对象)是引用类型的一个实例。

引用类型被称为对象定义,描述一类对象所具有的属性和方法。

新对象是使用new操作符后跟一个构造函数来创建的,构造函数本身就是一个函数。

5.1Object类型

创建Object实例的方式:1.使用new操作符后跟Object构造函数 2.使用字面量表示

使用对象字面量定义对象:1.逗号分隔不同属性

​ 2.属性名也可以使用字符串

​ 3.留空其花括号,则可以定义只包括默认属性和方法的对象

​ 4.推荐只在考虑对象属性名的可读性时使用

​ 5.不会调用object构造函数

​ 6.向函数传递大量可选参数的首选方式

访问对象属性:1.点表示法 2.方括号表示法

提示:1.方括号中存放字符串 2.方括号能通过变量来访问属性 3.属性名可以包含空格 可以使用 方括号来访问 4.优先使用点表示法

5.2array类型

数组的每一项可以保存任何类型的数据。

数组可以随着数据的添加自动增长。

创建方式:1.使用Array构造函数。可选:给构造函数传递数量,成为length属性的值。

​ 给构造函数传递数组中应包含的项

​ new操作符可以省略

​ 2.使用数组字面量表示法[‘1’,’2’,’3’] 不会调用Array构造函数

length属性:不是只读的。可以从数组的末尾移除项或向数组中添加新项。值为undefined

5.2.1检测数组

只有一个全局执行环境:instanceof

最终确定是否是数组,不管在哪个全局执行环境中创建:Array.isArray()方法

5.2.2转换方法

所有对象都有的一些方法

toString():返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串。

valueOf():返回数组

*join():使用不同的分隔符来构建这个字符串。不传值/传undefined =》分隔符为逗号

数组中某一项值是null或者undefined,则返回的结果为空字符串

5.2.3栈方法

后进先出

push():末尾添加,返回新数组长度

pop():扔掉末尾项,返回被扔掉的项

5.2.4队列方法

先进先出

shift():扔掉最前面的元素,返回被扔掉的元素

unshift():开头添加,返回新数组长度 IE8之后 之前返回undefined

5.2.5重排序方法

reverse():反转数组项的顺序

sort():调用每个数组项的toString()方法,比较字符串。

​ 可接收一个比较函数作为参数

arr.sort(function(a,b){return a-b;//由小到大});

5.2.6操作方法

concat():连接数组

slice():一个参数 返回指定位置到当前数组末尾的所有项

​ 两个参数 返回起始位置和结束为止之间的项(但不包括结束位置的项)

​ 不会影响到原始数组

​ 参数为负数 用数组长度加上该负数确定位置

​ 结束位置小于起始位置 返回空数组

splice():删除 两个参数 要删除的第一项的位置 要删除的项数

​ 替换 三个参数 起始位置 要删除的项数 要插入的任意数量的项 后二者不必相等

​ 添加 三个参数 起始位置 0 要插入的项

​ 返回一个从原始数组删除的项(无删除返回空数组)

5.2.7位置方法

indexOf() 和 lastIndexOf() 两个参数 要查找的项 (可选)起点位置的索引

没找到返回-1 查找时使用全等操作符===

5.2.8迭代方法

五个迭代方法 每个都是两个参数 1.每一项运行的函数 2.(可选)运行该函数的作用域对象(影响this值)

每一项运行的函数会接收三个参数:1.数组项的值 2.该项在数组中的位置 3.数组对象本身

every():如果函数每一项返回true则返回true

filter():返回该函数会返回true的项组成的数组

forEach():没有返回值

map():返回每次函数调用的结果组成的数组

some():如果该函数对任意一项返回true,则返回true

以上方法不会修改数组中所包含的值

5.2.9归并方法

reduce():从第一项开始逐个遍历到最后

ruduceRight():从最后一项到第一项

两个参数 1.每一项上调用的函数 2.(可选)作为归并基础的初始值

每一项上调用的函数接受4个参数:1.前一个值 2. 当前值 3.项的索引 4.数组对象

这个函数返回的值会作为第一个参数自动传给下一项。

第一次迭代发生在数组的第二项上。

5.3Date类型

笔记本

5.3.1继承的方法

5.3.2日期格式化方法

5.3.3日期/时间组件方法

5.4RegExp类型

5.4.1RegExp实例属性

5.4.2RegExp实例方法

5.4.3RegExp构造函数属性

5.4.4模式的局限性

5.5function类型

函数是对象。函数名是指针。

每个函数都是function类型的实例。

函数名是一个指向函数对象的指针。

函数末尾有一个分号,和声明其他变量时一样。

使用不带圆括号的函数名是访问函数指针,而非调用函数。

5.5.1没有重载(深入理解)

在创建第二函数时,实际上是覆盖了引用第一个函数的变量。

5.5.2函数声明与函数表达式

解析器先读取函数声明,使其在执行任何代码前可用。

函数表达式必须等到解析器执行到它所在的代码行才会被执行。

函数声明提升:在代码开始执行之前,通过函数声明提升的过程,读取并将函数声明添加到执行环境。所以函数声明被顶到源代码树的顶部。

5.5.3作为值的函数

函数名本身就是变量,所以函数也可以当做值来使用。

可以像传递参数一样把一个函数传递给另一个函数,也可以将一个函数作为另一个函数的结果返回。

要访问函数的指针而不执行函数时,必须去掉函数名后的圆括号。

5.5.4函数内部属性

两个特殊对象:arguments和this

arguments:类数组 包含着传入函数中的所有参数

​ 属性:callee 指针 指向拥有这个arguments对象的函数 arguments.callee 严格模式出错

this:指的是函数执行的环境对象

ECMAScript5新增属性:caller 保存调用当前函数的函数的引用。如果是全局作用域调用当前函数,值为null

​ 不能为函数的caller属性赋值

5.5.5函数属性和方法

两个属性 1.length 2.prototype

prototype:保存它们所有实例方法 不可枚举(for-in无法发现)

两个方法:1.apply() 2.call()

用途:都是在特定的作用域中调用函数,等于设置函数体内this对象的值

apply() 两个参数:1.在其中运行函数的作用域 this 2.参数数组(Array实例/arguments对象)

call() 两个参数 1.this值 2.传递给函数的参数必须逐个列举

主要用途:扩充函数作用域 好处:对象不需要与方法有任何耦合关系

ECMAScript5新增方法:bind() 创建一个对象实例,this值会被绑定传给bind()函数的值

5.6基本包装类型

每当读取一个基本类型值,后台会创建一个对应的基本包装类型的对象,让我们能调用一些方法来操作这些数据。

过程:1.创建string类型/Boolean类型/Number类型的一个实例

​ 2.在实例上调用指定的方法

​ 3.销毁这个实例

引用类型和基本包装类型的区别:对象的生存期。

引用类型:在执行流离开当前作用域前都保存在内存中。

基本包装类型:只存在于一行代码的执行瞬间,然后立即被销毁。

5.6.1boolean类型

5.6.2number类型

5.6.3string类型

String类型是字符串的对象包装类型

访问特定字符:charAt() charCodeAt() stringValue[] 返回给定位置的字符

拼接字符串:concat() 多个参数 不修改字符串本身的值

创建新字符串:slice() 参数1:开始位置 参数2:子字符串最后一个字符后面的位置 无则末尾 不修改原值 负数长度减

​ substr() 参数一:开始位置 参数二:字符个数 无则末尾 不修改原值 负数转0返回空字符串

​ substring()参数一:开始位置 参数二最后一个字符后面的位置 无则末尾 不修改原值 负数转0

查找子字符串:indexOf()和lastIndexOf() 没找到返回-1

trim():创建一个字符串副本,删除前置及后缀的所有空格 返回结果

大小写转换:toLowerCase() toUpperCase()

模式匹配方法:match()

比较字符串:字符串.localeCompare(“字符串参数”)

字符编码转换成字符串:fromCharCode()

5.7单体内置对象

不必显示实例化的内置对象(因为已经实例化了)

例如Object、Array、String和Global及Math

5.7.1Global对象

这个对象不存在。

不属于任何其他对象的属性和方法就是属于Global对象的属性和方法。

所有在全局作用域中定义的属性和函数都是Global对象的属性。

5.7.2Math对象

Math对象:保存数学公式和信息

min()和max()方法:确定一组数值中的最小值和最大值 接收任意多个数值参数

找到数组中最大/最小值:var max = Math.max.apply(Math,数组名);

舍入方法:1.向上舍入Math.ceil() 2.向下舍入Math.floor() 3.标准舍入Math.round()

随机数:Math.random()返回大于等于0小于1的一个随机数