【红宝书笔记】第 5 章 基础引用类型
第 5 章 基础引用类型
Date 日期函数
-
只包含到日期,用 Date.parse()
let someDate = new Date(Date.parse("May 23, 2019")); let someDate = new Date("May 23, 2019"); // 等价于上面的代码
-
具体到毫秒,用 Date.UTC(). ps: 月份必须从0开始计,0就是一月。
// GMT 时间 2005 年 5 月 5 日下午 5 点 55 分 55 秒 let allFives = new Date(Date.UTC(2005, 4, 5, 17, 55, 55)); // 本地时间 2005 年 5 月 5 日下午 5 点 55 分 55 秒 let allFives = new Date(2005, 4, 5, 17, 55, 55);
显式调用使用的是GET时间, 隐式调用使用的是本地时间、
-
Date 类型有几个专门用于格式化日期的方法,它们都会返回字符串: toDateString()显示日期中的周几、月、日、年(格式特定于实现); toTimeString()显示日期中的时、分、秒和时区(格式特定于实现);
RegExp 正则表达式
-
表示匹配模式的标记:
g
:全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束。i
:不区分大小写,表示在查找匹配时忽略 pattern 和字符串的大小写。m
:多行模式,表示查找到一行文本末尾时会继续查找。y
:粘附模式,表示只查找从 lastIndex 开始及之后的字符串。u
:Unicode 模式,启用 Unicode 匹配。s
:dotAll 模式,表示元字符.匹配任何字符(包括\n 或\r)。// 匹配字符串中的所有"at" let pattern1 = /at/g; // 匹配第一个"bat"或"cat",忽略大小写 let pattern2 = /[bc]at/i; // 匹配所有以"at"结尾的三字符组合,忽略大小写 let pattern3 = /.at/gi;
-
exec(),主要用于配合捕获组使用; test(),接收一个字符串参数; 都用得不多。
原始值包装类型
-
为了方便操作原始值,ECMAScript 提供了 3 种特殊的引用类型:Boolean、Number 和 String,这些类型通过new 来创建的时候会变成一个引用值(对象)。
-
每当用到某个原始值的方法或属性时,后台都会创建一个相应原始包装类型的对象,从而暴露出操作原始值的各种方法。举例:
let s1 = "some text"; let s2 = s1.substring(2);
在这里,s1 是一个包含字符串的变量,它是一个原始值。第二行紧接着在 s1 上调用了 substring()方法,并把结果保存在 s2 中。我们知道,原始值本身不是对象,因此逻辑上不应该有方法。而实际上这个例子又确实按照预期运行了。这是因为后台进行了很多处理,从而实现了上述操作。
-
具体来说,当第二行访问 s1 时,是以读模式访问的,也就是要从内存中读取变量保存的值。在以读模式访问字符串值的任何时候,后台都会执行以下 3 步: (1) 创建一个 String 类型的实例; (2) 调用实例上的特定方法; (3) 销毁实例。
// 可以把这 3 步想象成执行了如下 3 行 ECMAScript 代码 let s1 = new String("some text"); let s2 = s1.substring(2); s1 = null // 这里就会将 new 出来的对象销毁了
这种行为可以让原始值拥有对象的行为, 对布尔值和数值而言,以上 3 步也会在后台发生,只不过使用的是 Boolean 和 Number 包装类型而已
-
引用类型与原始值包装类型的主要区别在于对象的生命周期。在通过 new 实例化引用类型后,得到的实例会在离开作用域时被销毁,而自动创建的原始值包装对象则只存在于访问它的那行代码执行期间。这意味着不能在运行时给原始值添加属性和方法。
let s1 = "some text"; s1.color = "red"; console.log(s1.color); // undefined
这里的第二行代码尝试给字符串 s1 添加了一个 color 属性。可是,第三行代码访问 color 属性时,它却不见了。原因就是第二行代码运行时会临时创建一个 String 对象,而当第三行代码执行时,这个对象已经被销毁了。实际上,第三行代码在这里创建了自己的 String 对象,但这个对象没有 color 属性.
- 解释明白了,Boolean、Number 和 String 是3 种 特殊的 引用类型, 能作为原始值包装类型发挥引用值(对象)的效果。但是 不推荐 显式创建原始值包装类型的实例, 因为容易让开发者疑惑,分不清它们到底是原始值还是引用值。
单例内置对象
Global
- 编码方法:encodeURI()和 encodeURIComponent()。 需要使用时深入了解
- eval()。这个方法就是一个完整的 ECMAScript 解释器,它接收一个参数,即一个要执行的 ECMAScript(JavaScript)字符串。
需要使用时再深入了解
// 两行代码是等价的 eval("console.log('hi')"); console.log("hi");
Math
-
取最值得方法。min()和 max()方法用于确定一组数值中的最小值和最大值。这两个方法都接收任意多个参数
let max = Math.max(3, 54, 32, 16); console.log(max); // 54 let min = Math.min(3, 54, 32, 16); console.log(min); // 3 let values = [1, 2, 3, 4, 5, 6, 7, 8]; let max = Math.max(...val); // 8
-
舍入方法。把小数值舍入为整数的 4 个方法:Math.ceil()、Math.floor()、Math.round()和 Math.fround() Math.ceil() 方法始终向上舍入为最接近的整数。 Math.floor() 方法始终向下舍入为最接近的整数。 Math.round() 方法执行四舍五入。 Math.fround() 方法返回数值最接近的单精度(32 位)浮点值表示。
// Math.ceil() 方法始终向上舍入为最接近的整数。 console.log(Math.ceil(25.9)); // 26 console.log(Math.ceil(25.5)); // 26 console.log(Math.ceil(25.1)); // 26 // Math.floor() 方法始终向下舍入为最接近的整数。 console.log(Math.floor(25.9)); // 25 console.log(Math.floor(25.5)); // 25 console.log(Math.floor(25.1)); // 25 // Math.round() 方法执行四舍五入 console.log(Math.round(25.9)); // 26 console.log(Math.round(25.5)); // 26 console.log(Math.round(25.1)); // 25 // Math.fround() 方法返回数值最接近的单精度(32 位)浮点值表示 console.log(Math.fround(0.4)); // 0.4000000059604645 console.log(Math.fround(0.5)); // 0.5 console.log(Math.fround(25.9)); // 25.899999618530273
-
获取随机数。Math.random()方法返回一个 0~1 范围内的随机数,其中包含 0 但不包含 1
// 从 1~10 范围内随机选择一个数 let num = Math.floor(Math.random() * 10 + 1);
小结
JavaScript 中的对象称为引用值,几种内置的引用类型可用于创建特定类型的对象。
- 引用值与传统面向对象编程语言中的类相似,但实现不同。
- Date 类型提供关于日期和时间的信息,包括当前日期、时间及相关计算。
- RegExp 类型是 ECMAScript 支持正则表达式的接口,提供了大多数基础的和部分高级的正则表达式功能。
JavaScript 比较独特的一点是,函数实际上是 Function 类型的实例,也就是说函数也是对象。因为函数也是对象,所以函数也有方法,可以用于增强其能力。
由于原始值包装类型的存在,JavaScript 中的原始值可以被当成对象来使用。有 3 种原始值包装类型:Boolean、Number 和 String。它们都具备如下特点。
- 每种包装类型都映射到同名的原始类型。
- 以读模式访问原始值时,后台会实例化一个原始值包装类型的对象,借助这个对象可以操作相应的数据。
- 涉及原始值的语句执行完毕后,包装对象就会被销毁。
当代码开始执行时,全局上下文中会存在两个内置对象:Global 和 Math。其中,Global 对象在大多数 ECMAScript 实现中无法直接访问。不过,浏览器将其实现为 window 对象。所有全局变量和函数都是 Global 对象的属性。Math 对象包含辅助完成复杂计算的属性和方法。
转载自:https://juejin.cn/post/7080071476069531684