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 返回正则本身
  • 构造函数属性(静态属性)
    • $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
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()
    • 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
        • 不推荐,无法表达语义

5.7 单体内置对象

内置对象的定义

由ECMAscript实现提供的,不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了
开发人员不必显示地实例化单体内置对象,因为他们已经实例化了,ECMA提供两个单体对象:Global和Math

  • Global
    • 终极‘兜底儿’对象
      • 任何不属于其他对象的属性和方法,最终都挂在Global对象上
      • 事实上,没有所谓 “全局函数” 和 “全局变量”
      • 全局函数全局变量都是全局对象Global的方法和属性
    • 方法
      • isNaN()
        • 传入非数字时,结果并不可信
      • isFinite()
      • parseInt()
        • parseInt()和toString() 是一对进行进制转换的好基友
      • parseFloat()
        • parseFloat() 注意传入整数,输出还是整数,不会转成浮点数
      • URI编码方法
        • encodeURI()
          • 只有空格被替换成%20
        • encodeURIComponent()
          • 替换所有非字母数字字符
        • decodeURI()
        • decodeURIComponent()
      • eval()
        • eval执行后会被替换成真正的代码语句
    • 属性
      • 特殊值
        • 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)

下一篇:第6章(面向对象程序设计)