【JavaScript高级程序设计】第5章(引用类型)
5. 引用类型
- 引用类型的值是引用类型的一个实例 —> 对象
- 引用类型是一种数据结构,用于将数据和功能组织在一起,引用类型描述一类对象所具有的属性和方法 —> 类(对象定义)
5.1 Object
- 在应用程序中存储和传输数据的理想选择
- 创建Object实例
- 构造函数 new Object()
- 字面量
var a = {}
与new Object()
一致,只保留默认的属性和方法
- 上下文
- 表达式上下文 expression context
- 语句上下文 statement context
- 属性引用
- 点引用
- 方括号引用(优点:可以使用变量,动态)
5.2 Array
- 动态调整大小; 可以保存任意类型
- length 属性可以截取数组
- 检测数组
- instanceof Array 一个全局执行环境
- Array.isArray() 多个全局执行环境,不同版本的Array构造函数
- 栈方法
- push & pop
- unshift & shift
- 队列方法
- push & shift
- unshift & pop
- 重排序方法
- reverse
- sort
- 默认调用元素的toString方法,比较的得到的字符串
- 传入比较函数
(a,b) => a - b
- 操作方法
- concat 创建一个副本,传入数组会将解构元素添在末尾,其他非数组直接添在末尾
- slice 创建副本,含首不含尾
- splice 功能强大
- 删除
- 插入
- 替换
- 返回被删除的数组
- 位置方法
- indexOf(searchValue, fromIndex) 第二个参数表示从索引几开始搜索
- lastIndexOf
- 迭代方法
- 五个方法都需要两个参数 需要迭代的函数(currentValue, index, array) 和 该函数运行作用域对象thisArg
- every
- some
- filter
- map
- forEach 无返回值,本质上与使用for循环迭代一样
- 五个方法都不会修改原数组
- 归并方法
- reduce 内含函数(accumulator/total,currentValue,currentIndex,array)和初始值initialValue
- reduceRight
- 经典应用:求数组和
5.3 Date
- 国际协调时间UTC Coordinated Universal Time
- 太平洋标准时间PST Pacific Standard Time
- 日期格式化方法(没什么用)
- toDateString
- toTimeString
- toLocaleDateString
- toLocaleTimeString
- toUTCString
5.4 RegExp
- 标志 flags
- g 全局匹配所有字符串 Global
- i 忽略大小写 Case-Insensitive
- m 多行匹配 multiline
- 模式 pattern
- 元字符(必须转义)
- ([{^$|}])?*+.
- 创建正则表达式的两种方式
- 字面量 和使用构造函数一样,每次都创建新的实例
- 构造函数
new RegExp(pattern, flag)
- 实例属性
- global、ignoreCase、multiline 布尔值,表示是否设置了标志
- lastIndex 整数,表示下一个次匹配时的字符位置
- source 模式的源信息
- 实例方法
- exec 专门为捕获组设计的
- 返回数组,Array实例,包含index和input两个额外属性
- index表示匹配项在字符串中的位置
- input输出源字符串
- 数组内容依次为模式匹配结果和捕获组匹配结果
- 每次只匹配一个,不加g不更新lastIndex,每次从头匹配,所以每次返回匹配到的第一个
- 非全局模式下,lastIndex始终不变
- 如果有g标志,会更新lastIndex
- test 匹配true否则false
- toString 返回字面量
- valueOf 返回正则本身
- exec 专门为捕获组设计的
- 构造函数属性(静态属性)
$1~9
存储捕获组- `$`` lastMatch之前的文本
$'
lastMatch之后的文本
- 局限性
- 支持前瞻lookahead,不支持后顾lookbehind
- 支持编号捕获组,不支持命名捕获组
5.5 Function
- 函数是对象,跟其他引用类型一样具有属性和方法
- 函数名实际上是一个指向函数对象的指针
var fun = function(x,y){return x+y};
// 或者 function fun(x,y){return x+y};
var obj = fun;
fun = null;
obj(1,2); // 3
- 没有重载
- 函数名是指针,所以重复申明只是 覆盖了前一函数
- 函数声明与函数表达式
- 函数声明提升 function declaration hoisting
- 函数表达式
var fun = function(){}
- 作为值的函数
- 函数名本身就是变量,所以函数可以作为值来使用
- 作为参数或者返回值(高阶函数)
- 函数内部属性
- arguments
- callee 返回当前执行的函数(严格模式禁止,就是不推荐)
- 经典应用:阶乘 factorial 递归实现
- 函数名和函数体耦合
- caller
- 经典应用: 松散耦合 arguments.cllee.caller
- this
- 引用的是函数执行时的环境对象
- 在函数调用之前,this的指向是不确定的
- 函数名只是一个指针变量
- 全局的sayColor与obj.sayColor指向的是同一个函数
- 以对象方法的形式调用函数,一个this指向window;一个指向obj
- 引用的是函数执行时的环境对象
- arguments
var color = 'red';
var obj = {color: 'blue'};
function sayColor(){
return this.color;
}
obj.sayColor = sayColor;
sayColor(); // red
obj.sayColor(); // blue
sayColor.call(obj); // blue
sayColor = null;
sayColor(); // Error
obj.sayColor(); // blue
- 函数属性
- length 命名参数的个数
- prototype 不可枚举,for-in无法发现
- 函数方法
- apply() 在特定的作用域中调用函数,实际上等于设定函数内部this对象的值
- call()
- 扩充作用域
- 使用apply和call扩充函数作用域的最大好处就是对象不用与方法有任何耦合关系。
- bind()
- toString()
- valueOf()
5.6 基本包装类型
var str1 = 'hello world';
var str2 = str1.substring(6,11);
- 在读取模式访问字符串时,后台自动完成类型包装
- 创建一个实例
var str1 = new String('hello world');
- 在实例上调用指定方法
str1.substring(6,11);
- 销毁这个实例
str1 = null;
- 创建一个实例
- 引用类型和基本包装类型的主要区别就是对象的生存期
- 使用new创建的引用类型的实例,在执行流离开当前作用域之前一直保存在内存中
- 自动创建的基本包装类型的对象,只存在于执行代码的一瞬间,然后立即被销毁
- Number
- toFixed() 保留几位小数
- toExponential() 指数表示
- toPrecision() 有效数字
- Boolean
- String
- length
- chartAt()
- charCodeAt()
- concat() // 不修改原字符串
- 子字符串
- slice(start, end)
- substr(start, howmany)
- substring(start, end)
- 不修改原字符串
- 传入负值的不同处理
- slice() 表示从尾倒着数
- substring() 把负值转换为零,而且会自动调整参数,小的start,大的end
- substr() 第一参数和slice()一致,倒着数;第二参转换为零
- 字符串位置方法
- indexOf(string, position)
- 第二参数的经典应用:找到所有匹配的字符串的索引
- 每次找到字符串后
position++
- lastIndexOf()
- indexOf(string, position)
- trim() 去除前后空格
- trimLeft()
- trimRight()
- 大小写转换方法
- toUpperCase()
- toLowerCase()
- 字符串模式匹配方法
- match(RegExp)
- 非全局模式下,String.match() <–等价–> RegExp.exec()
- match最大用处还是全局模式g下匹配字符串中所有模式
- search(RegExp)
- 与indexOf()的区别
- indexOf 需要字符串参数
- search 需要正则表达式参数
- replace(RegExp/string, string/function)
- 替换子字符串操作
- 第一参数
- string 匹配字符串的话只会替换第一个匹配到的
- RegExp(g) 想要替换全部匹配项,只有通过正则表达式g的全局模式
- 第二参数
- 特殊字符
- $& 匹配项
- $n 捕获组
- $’ 右
- $` 左
- function(match,position,originalText){ switch(match) … }
- split(seperator, howmany)
- seperator 可以是正则和字符串
- 没有匹配项的捕获组在结果数组中用undefined表示
- localeCompare(string)
- 和参数字符串比较返回-1,0,1
- ASIIC中,大写字母排在小写字母前面
fromCharCode(104, 101, 108, 108, 111) // "hello"
- 与charCodeAt()相反操作
- 字符和编码间的转换
- HTML方法
- JavaScript动态创建格式化HTML
- 不推荐,无法表达语义
- match(RegExp)
5.7 单体内置对象
内置对象的定义
由ECMAscript实现提供的,不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了
开发人员不必显示地实例化单体内置对象,因为他们已经实例化了,ECMA提供两个单体对象:Global和Math
- Global
- 终极‘兜底儿’对象
- 任何不属于其他对象的属性和方法,最终都挂在Global对象上
- 事实上,没有所谓 “全局函数” 和 “全局变量”
- 全局函数和全局变量都是全局对象Global的方法和属性
- 方法
- isNaN()
- 传入非数字时,结果并不可信
- isFinite()
- parseInt()
- parseInt()和toString() 是一对进行进制转换的好基友
- parseFloat()
- parseFloat() 注意传入整数,输出还是整数,不会转成浮点数
- URI编码方法
- encodeURI()
- 只有空格被替换成
%20
- 只有空格被替换成
- encodeURIComponent()
- 替换所有非字母数字字符
- decodeURI()
- decodeURIComponent()
- encodeURI()
- eval()
- eval执行后会被替换成真正的代码语句
- isNaN()
- 属性
- 特殊值
- undefined
- NaN
- Infinity
- 构造函数
- Object
- Array
- Function
- Boolean
- String
- Number
- Date
- RegExp
- Error
- EvalError
- RangeError
- ReferenceError
- SyntaxError
- TypeError
- URIError
- 特殊值
- window
- window对象除了扮演ECMAScript规定的Global对象以外,还承担很多别的任务
- 终极‘兜底儿’对象
- Math
- 属性
- Math.E
- Math.LN10()
- Math.LN2()
- Math.LOG2E
- Math.LOG10E
- Math.PI
- Math.SQRT1_2
- Math.SQRT2
- 方法
- 大小
- min()
- max()
- 舍入
- ceil()
- floor()
- round()
- 随机
- random()
- 数学计算
- abs(num)
- exp(num) // e指数
- log(num) // e底数对数
- pow(num, power)
- sqrt(num)
- acos(x) // 反余弦
- asin(x)
- atan(x) // 反正切
- atan2(y,x) // y/x的反正切
- cos(x)
- sin(x)
- tan(x)
- 大小
- 属性