005 基本引用类型
在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"); // 15585948000001
2
3
4
5
6Date.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 提供了三种特殊的引用类型: Boolean、Number 和 String。每当用到某个原始值的方法或属性时:
- 后台 会 创建 一个 相应原始包装类型对象 从而 暴露 其 原始值的各种方法。
- 后台 会 创建 一个 相应原始包装类型对象 从而 暴露 其 原始值的各种方法。
- 后台 会 创建 一个 相应原始包装类型对象 从而 暴露 其 原始值的各种方法。
let s1 = "text";
let s2 = s1.substring(2); // "xt"
2
在第二行读取s1的值时,是以读模式访问的,也就是要从内存中读取变量保存的值,此时后台会执行以下三步:
- 创建一个String 类型的实例;
let s1 = new String("some text"); - 调用实例上的特定方法;
let s2 = s1.substring(2); - 销毁实例。
s1 = null;
布尔值和数值同理,对应 Boolean 和Number类型。
引用类型 和 包装类型 区别在于生命周期,自动创建的包装类型只存在于执行期间,例如:
let s1 = "some text";
s1.color = "red";
console.log(s1.color); // undefined
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
// 全局作用域
2
3
4
5
6
7
# Math
Math属性方法一览表 (opens new window)
# 小结
由于原始值包装类型的存在,JavaScript 中的原始值可以被当成对象来使用。有3 种原始值包装类型:Boolean、Number 和String。它们都具备如下特点。
- 每种包装类型都映射到同名的原始类型。
- 以读模式访问原始值时,后台会实例化一个原始值包装类型的对象,借助这个对象可以操作相应的数据
- 涉及原始值的语句执行完毕后,包装对象就会被销毁
全局上下文中会存在两个内置对象:Global 和Math。Global 无法直接访问,但浏览器的window宿主对象代理了Global 的所有对象属性。