005 基本引用类型

7/12/2021 Javascript

在ECMAScript 中,引用类型是把数据和功能组织到一起的结构,引用类型有时候也被称为对象定义,因为它们描述了自己的对象应有的属性和方法。引用类型像类但不是类

# Date

创建日期对象 let now = new Date(), 不传参的情况下该对象保存当前的时间和日期。要基于其他日期创建日期对象,需传入毫秒级时间戳。ECMAScript提供两个辅助方法:

# 日期转换时间戳

  • Date.parse()

    接收一个表示日期字符串,返回日期时间戳,错误返回NaN;

    // 月 / 日 / 年
    Date.parse("7/12/2021"); // 1626019200000
    // 月名 日, 年
    Date.parse("May 23, 2019"); // 1558540800000
    //周几 月名 日 年 时:分:秒 时区
    Date.parse("Tue May 23 2019 00:00:00 GMT-0700"); // 1558594800000
    
    1
    2
    3
    4
    5
    6
  • Date.UTC(): 参数是年、零起点月数(1 月是0,2 月是1,以此类推)、日(1~31)、时(0~23)、分、秒和毫秒。new Date(Date.UTC(2000, 0));

# 继承的方法

  • toLocaleString()

    返回和本地浏览器环境一致的时间日期,如"2021/7/12"

  • toString()

    返回带时区信息的日期和时间,如 "Mon Jul 12 2021 14:09:49 GMT+0800 (中国标准时间)"

  • valueOf()

    返回时间戳, 如 1626070477536

# 日期格式化

Date 类型有几个专门用于格式化日期的方法,返回字符串

  • toDateString(); new Date().toDateString(); // "Mon Jul 12 2021"
  • toTimeString(); new Date().toTimeString(); // "14:22:21 GMT+0800 (中国标准时间)"
  • toLocaleDateString(); new Date().toLocaleDateString(); // "2021/7/12"
  • toLocaleTimeString(); new Date().toLocaleTimeString(); // "下午2:22:46"
  • toUTCString(); new Date().toUTCString(); // "Mon, 12 Jul 2021 06:22:55 GMT"

这些方法的输出与toLocaleString()和toString()一样,会因浏览器而异。因此不能用于在用户界面上一致地显示日期

# 其他方法

Date 对象方法一览表 (opens new window)

# RegExp

正则, 一生之敌,单独写;

# 原始值包装类型

'test'.substring(2)为什么可以调用?原始值本身不是对象,为什么会有方法?

ECMAScript 提供了三种特殊的引用类型: BooleanNumberString。每当用到某个原始值的方法或属性时:

  • 后台创建 一个 相应原始包装类型对象 从而 暴露 其 原始值的各种方法
  • 后台创建 一个 相应原始包装类型对象 从而 暴露 其 原始值的各种方法
  • 后台创建 一个 相应原始包装类型对象 从而 暴露 其 原始值的各种方法
let s1 = "text";
let s2 = s1.substring(2); // "xt"
1
2

在第二行读取s1的值时,是以读模式访问的,也就是要从内存中读取变量保存的值,此时后台会执行以下三步:

  1. 创建一个String 类型的实例; let s1 = new String("some text");
  2. 调用实例上的特定方法;let s2 = s1.substring(2);
  3. 销毁实例。s1 = null;

布尔值和数值同理,对应 Boolean 和Number类型。

引用类型 和 包装类型 区别在于生命周期,自动创建的包装类型只存在于执行期间,例如:

let s1 = "some text";
s1.color = "red";
console.log(s1.color); // undefined
1
2
3

Object 构造函数作为一个工厂方法,可以根据传入值的类型返回其包装类型实例

let a = new Object(123); a instanceof Number; // true

# Boolean

# Number

# String

string对象属性方法一览表 (opens new window)

# 单例内置对象

# Global

ECMA-262 把内置对象(built-in object)定义为“由 ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现”。这意味着*开发者不必明确实例化内置对象,它已被实例化了*。

同样是“独立于宿主环境”。根据定义我们似乎很难分清“内置对象”与“原生对象”的区别。而ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是原生对象,根据定义,每个内置对象都是原生对象)。

如此就可以理解了。内置对象是原生对象的一种。而其包含的两种对象中,Math对象我们经常用到,可这个Global对象是啥东西呢?

Global对象是ECMAScript中最特别的对象,因为实际上它根本不存在!在ECMAScript中,不存在独立的函数,所有函数都必须是某个对象的方法。

类似于isNaN()、parseInt()和parseFloat()方法等,看起来都是函数,而实际上,它们都是Global对象的方法。而且Global对象的方法还不止这些。

# window

浏览器将window 对象实现为Global对象的代理,因此,所有全局作用域中声明的变量和函数都变成了window 的属性。

var color = "red";
function sayColor() {
console.log(window.color);
}
window.sayColor(); // "red"
window.undefined; // undefined
// 全局作用域
1
2
3
4
5
6
7

# Math

Math属性方法一览表 (opens new window)

# 小结

由于原始值包装类型的存在,JavaScript 中的原始值可以被当成对象来使用。有3 种原始值包装类型:Boolean、Number 和String。它们都具备如下特点。

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

全局上下文中会存在两个内置对象:GlobalMathGlobal 无法直接访问,但浏览器的window宿主对象代理了Global 的所有对象属性。

Last Updated: 8/4/2021, 6:25:04 PM