likes
comments
collection
share

【红宝书笔记】第 5 章 基础引用类型

作者站长头像
站长
· 阅读数 3

第 5 章 基础引用类型

Date 日期函数

  1. 只包含到日期,用 Date.parse()

    let someDate = new Date(Date.parse("May 23, 2019"));
    
    let someDate = new Date("May 23, 2019"); // 等价于上面的代码
    
  2. 具体到毫秒,用 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时间, 隐式调用使用的是本地时间、

  3. Date 类型有几个专门用于格式化日期的方法,它们都会返回字符串: toDateString()显示日期中的周几、月、日、年(格式特定于实现); toTimeString()显示日期中的时、分、秒和时区(格式特定于实现);

RegExp 正则表达式

  1. 表示匹配模式的标记: 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;
    
  2. exec(),主要用于配合捕获组使用; test(),接收一个字符串参数; 都用得不多。

原始值包装类型

  1. 为了方便操作原始值,ECMAScript 提供了 3 种特殊的引用类型:Boolean、Number 和 String,这些类型通过new 来创建的时候会变成一个引用值(对象)。

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

    let s1 = "some text";
    let s2 = s1.substring(2);
    

    在这里,s1 是一个包含字符串的变量,它是一个原始值。第二行紧接着在 s1 上调用了 substring()方法,并把结果保存在 s2 中。我们知道,原始值本身不是对象,因此逻辑上不应该有方法。而实际上这个例子又确实按照预期运行了。这是因为后台进行了很多处理,从而实现了上述操作。

  3. 具体来说,当第二行访问 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 包装类型而已

  4. 引用类型与原始值包装类型的主要区别在于对象的生命周期。在通过 new 实例化引用类型后,得到的实例会在离开作用域时被销毁,而自动创建的原始值包装对象只存在于访问它的那行代码执行期间。这意味着不能在运行时给原始值添加属性和方法。

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

    这里的第二行代码尝试给字符串 s1 添加了一个 color 属性。可是,第三行代码访问 color 属性时,它却不见了。原因就是第二行代码运行时会临时创建一个 String 对象,而当第三行代码执行时,这个对象已经被销毁了。实际上,第三行代码在这里创建了自己的 String 对象,但这个对象没有 color 属性.

  • 解释明白了,Boolean、Number 和 String 是3 种 特殊的 引用类型, 能作为原始值包装类型发挥引用值(对象)的效果。但是 不推荐 显式创建原始值包装类型的实例, 因为容易让开发者疑惑,分不清它们到底是原始值还是引用值。

单例内置对象

Global

  1. 编码方法:encodeURI()和 encodeURIComponent()。 需要使用时深入了解
  2. eval()。这个方法就是一个完整的 ECMAScript 解释器,它接收一个参数,即一个要执行的 ECMAScript(JavaScript)字符串。 需要使用时再深入了解
    // 两行代码是等价的
    eval("console.log('hi')");
    console.log("hi"); 
    

Math

  1. 取最值得方法。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
    
  2. 舍入方法。把小数值舍入为整数的 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
    
  3. 获取随机数。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 对象包含辅助完成复杂计算的属性和方法。