基本引用类型

理解对象

引用类型是把数据和功能组织到一起的结构,有点像类,但和类不是一个概念

对象被认为是某个特定引用类型的实例。新对象通过使用new操作符后跟一个构造函数来创建。构造函数就是用来创建新对象的函数

JavaScript中的对象是引用值,可以通过几种内置引用类型创建特定类型的对象

  • Object类型
    • 一个基础类型
  • Array类型
  • Date类型
  • RegExp类型

函数其实是Function类型的实例,这意味着函数也是对象。由于函数是对象,因此也就具有能够增强自身行为的方法

当代码开始执行时,全局上下文中会存在两个内置对象:GlobalMath。其中,Global对象在大多数ECMAScript实现中无法直接访问。不过,浏览器将其实现为window对象。所有全局变量和函数都是Global对象的属性。Math对象包含辅助完成复杂计算的属性和方法

基本Javascript数据类型

Date类型

Date类型将日期保存为自协调世界时(UTC,UniversalTimeCoordinated)时间1970年1月1日午夜(零时)至今所经过的毫秒数

创建日期对象

  • new Date()
    • 构造函数
  • 辅助方法:
    • Date.parse()
      • “月/日/年”
      • “月名日,年”
      • “周几月名日年时:分:秒时区”,
      • “YYYY-MM-DDTHH:mm:ss.sssZ”
      • Date.parse()会被Date构造函数隐式调用
    • Date.UTC()
      • Date.UTC()方法也返回日期的毫秒表示
      • 参数是年、零起点月数(1月是0,2月是1,以此类推)、日(1~31)、时(0~23)、分、秒和毫秒
      • Date.UTC()也会被Date构造函数隐式调用
  • Date.now()
    • 返回表示方法执行时日期和时间的毫秒数
    • 方便用于代码分析,计算运行时长
  • toLocaleString()
    • 返回与浏览器运行的本地环境一致的日期和时间
  • toString()
    • 返回带时区信息的日期和时间,而时间也是以24小时制(0~23)表示的
  • valueOf()
    • 返回的是日期的毫秒表示

日期格式化方法

RegExp

RegExp类型支持正则表达式

  • g
    • 全局模式
  • i
    • 不区分大小写

所有元字符在模式中也必须转义

  • ([{\^$|)]}?*+.
  • 使用反斜杠来转义

正则表达式创建

  • 字面量定义
  • RegExp构造函数创建
    • 两个参数
      • 模式字符串
        • 因为是字符串,所以所有元字符都必须二次转义,包括转义字符序列
      • (可选)标记字符串
    • 可以基于已有的正则表达式实例,并可选择性地修改它们的标记

RegExp实例方法

  1. exec()

    主要用于配合捕获组使用。这个方法只接收一个参数,即要应用模式的字符串。如果找到了匹配项,则返回包含第一个匹配信息的数组;如果没找到匹配项,则返回null。

    这个数组的第一个元素是匹配整个模式的字符串,其他元素是与表达式中的捕获组匹配的字符串

    两个额外属性

    • index
      • 字符串中匹配模式的起始位置
    • input
      • 是要查找的字符串

    如果模式设置了全局标记,则每次调用exec()方法会返回一个匹配的信息;如果没有设置全局标记,则无论对同一个字符串调用多少次exec(),也只会返回第一个匹配的信息

  2. test()

    接收一个字符串参数。如果输入的文本与模式匹配,则参数返回true,否则返回false。主要用于测试模式是否匹配。

    toLocaleString()toString()都返回正则表达式的字面量表示,valueOf()方法返回正则表达式本身

原始值与原始值包装类型

每当用到某个原始值的方法或属性时,后台都会创建一个相应原始包装类型的对象,从而暴露出操作原始值的各种方法。

  • 每种包装类型都映射到同名的原始类型
  • 在以读模式访问原始值时,后台会实例化一个原始值包装对象,通过这个对象可以操作数据
  • 涉及原始值的语句只要一执行完毕,包装对象就会立即销毁

当原始值调用对象方法或属性时,发生三个事情

  • 创建原始值包装类型
  • 调用实例上特定的方法
  • 销毁实例

引用类型与原始值包装类型的主要区别在于对象的生命周期。在通过new实例化引用类型后,得到的实例会在离开作用域时被销毁,而自动创建的原始值包装对象则只存在于访问它的那行代码执行期间

三个原始值包装类型

Boolean

Boolean是对应布尔值的引用类型。要创建一个Boolean对象,就使用Boolean构造函数并传入truefalse

  • 重写valueOf()方法,返回一个原始值true或false
  • toString()方法被调用时也会被覆盖,返回字符串”true”或”false”

Number

重写了valueOf()toLocaleString()toString()方法

  • valueOf()方法返回Number对象表示的原始数值
  • 另外两个方法返回数值字符串
  • toString()方法可选地接收一个表示基数的参数,并返回相应基数形式的数值字符串

将数值格式化为字符串方法

  • toFixed()
    • 返回包含指定小数点位数的数值字符串
  • toExponential()
    • 返回以科学记数法(也称为指数记数法)表示的数值字符串
    • 接收一个参数,表示结果中小数的位数
  • toPrecision()
    • 接收一个参数,表示结果中数字的总位数

Number.isInteger()方法,用于辨别一个数值是否保存为整数

为了鉴别整数是否在合理数字范围内,可以使用Number.isSafeInteger()方法

String

String是对应字符串的引用类型。要创建一个String对象,使用String构造函数并传入一个数值

valueOf()toLocaleString()toString()都返回对象的原始字符串值,有一个length属性,表示字符串中字符的数量。

JavaScript字符串由16位码元(codeunit)组成,在Unicode中称为基本多语言平面(BMP)

  • charAt()方法
    • 返回给定索引位置的字符,由传给方法的整数参数指定
  • charCodeAt()
    • 可以查看指定码元的字符编码
    • 返回指定索引位置的码元值
  • fromCharCode()
    • 用于根据给定的UTF-16码元创建字符串中的字符
    • 可以接受任意多个数值,并返回将所有数值对应的字符拼接起来的字符串

对于扩展到Unicode增补字符平面时,Unicode采用了一个策略,即每个字符使用另外16位去选择一个增补平面。这种每个字符使用两个16位码元的策略称为代理对

  • codePointAt()
    • 接收16位码元的索引并返回该索引位置上的码点(能识别完整的码点(16位或32位))
      • 码点是Unicode中一个字符的完整标识
  • fromCodePoint()
    • 接收任意数量的码点,返回对应字符拼接起来的字符串
  • normalize()
    • 规范化字符串

字符串操作方法

  • concat()
    • 将一个或多个字符串拼接成一个新字符串
    • concat()方法可以接收任意多个参数,因此可以一次性拼接多个字符串
    • 更常用的时+运算符
  • 提取子字符串
    • slice()
      • 第一个参数表示开始,第二个表示结束
      • 将所有负值参数都当成字符串长度加上负参数值
    • substr()
      • 第一个参数表示开始,第二个表示返回子字符串数量
      • 将第一个负参数值当成字符串长度加上该值,将第二个负参数值转换为0
    • substring()
      • 第一个参数表示开始,第二个表示结束
      • 将所有负参数值都转换为0
  • 定位子字符串
    • indexOf()
      • 从开头开始查找子字符串
    • lastIndexOf()
      • 从末尾开始查找子字符串
    • 都可以接收可选的第二个参数,表示开始搜索的位置
  • 判断字符串是否包含另一个字符串
    • startswith
      • 检查开始于索引0的匹配项
      • 可选第二参数,表示开始搜索位置
    • endsWith
      • 检查开始于索引(string.length-substring.length)的匹配项
      • 可选第二参数,表示当作字符串末尾位置
    • includes
      • 检查整个字符串
      • 可选第二参数,表示开始搜索位置
  • trim()
    • 创建字符串副本,删除前后所有空格符
    • trimLeft()
    • trimRight()
  • repeat
    • 接收一个整数参数,表示要将字符串复制多少次,然后返回拼接所有副本后的结果。
  • 填充字符
    • padStart()
    • padEnd()
    • 第一个参数是长度,第二个参数是可选的填充字符串
    • 如果长度小于或等于字符串长度,则会返回原始字符串
  • 字符串迭代于结构
    • 原型上暴露了一个@@iterator方法,表示可以迭代字符串的每个字符,在for-of循环中可以通过这个迭代器按序访问每个字符,有了这个迭代器之后,字符串就可以通过解构操作符来解构了
  • 字符串大小写转换
    • toLowerCase()
    • toUpperCase()
    • toLocaleLowerCase()
      • 基于特定地区实现
    • toLocaleUpperCase()
      • 基于特定地区实现
  • 字符串模式匹配
    • match()
    • search()
    • replace()
      • 第二个参数可以是函数
    • split()
      • 可传第二参数,确保返回数组大小不超过第二参数
  • localeCompare()
    • 比较两个字符串,排前头返回负值,排后头返回正值,相等返回0

单例内置对象

任何由ECMAScript实现提供、与宿主环境无关,并在ECMAScript程序开始执行时就存在的对象

Global

Global对象为一种兜底对象,它所针对的是不属于任何对象的属性和方法

方法

  • URI编码方法
    • encodeURI()
      • 不会编码属于URL组件的特殊字符,比如冒号、斜杠、问号、井号
    • encodeURIComponent()
      • 会编码它发现的所有非标准字符
  • URI解码方式
    • decodeURI()
    • decodeURIComponent()

window对象

浏览器将window对象实现为Global对象的代理

当一个函数在没有明确指定this值的情况下执行时,this值等于Global对象

Math

保存数学公式、信息和计算的地方

  • min()max()
  • 舍入方法
    • ceil()
      • 向上取整
    • floor()
      • 向下取整
    • round()
      • 四舍五入
    • fround()
      • 返回数值最接近的单精度(32位)浮点值
  • random()
    • 返回0-1范围内的随机数,包含0,不包含1