JavaScript 红宝书笔记 - 第 5 章. 基本引用类型

基本引用类型

JS 的引用对象像类,又不是类,属实扭曲。

  • 函数也是一种引用类型。
  • new + 构造函数 用来创建引用类型的新实例。

Date

随用随查表即可。

正则表达式

1
let expression = /pattern/flags;
  • 可以通过字面量和 RegExp 构造函数两种方式创建。

随用随查!

8_PK@C51XG${8TDI%MZHQNU

原始值包装类型

  • 三种包装类型:BooleanNumberString

  • 例:以读模式访问字符串时,会顺序执行:

    • 创建一个 String 类型实例
    • 调用实例上的特定方法
    • 销毁实例
  • 引用类型与原始值包装类型主要区别在于对象的生命周期

    • 引用类型离开作用域时销毁
    • 自动创建的原始值包装对象仅存在于访问它的那行代码的执行期间
  • 除非必要,不要显式使用原始值包装类型创建对象。

  • Object 构造函数作为工厂方法可以根据传入值类型返回相应原始值包装类型的实例。

    1
    2
    3
    let obj = new Object("text");
    console.log(obj instanceof String);
    // true
  • new 调用原始值包装类型的构造函数得到的结果和调用同名的转型函数不同。

    1
    2
    3
    4
    5
    let value = "25";
    let number = Number(value);
    // typeof number → "number"
    let obj = new Number(value);
    // typeof obj → "object"
  • 建议永远不要使用 Boolean 对象。

Number 对象

  • num.toString(进制) 可以直接返回对应进制的数值字符串。
  • num.valueOf() 可以返回原始数值。
  • num.toFixed(小数位数) 可以返回包含指定小数位数的字符串,会四舍五入。
  • num,.toExponential(小数位数) 返回科学记数法。
  • num.toPrecision(总位数) 根据情况返回最合理的输出结果,可以表示 1 ~ 21 位。
  • Number.isInteger() 用于判断数值是否保存整数。
  • Number.isSafeInteger() 用于判断一个整数是否在 IEEE 754 数值格式中二进制可以表示的整数范围内($[-2^{53}+1,2^{53}-1]$)。

String 对象

  • str.length 属性表示字符数量。对多数字符来说每 16 位码元对应一个字符,所以 length 属性可以表示字符串包含多少 16 位码元。
  • str.charAt() 返回给定位置字符,从 0 开始。
  • str.charCodeAt() 可以查看码元的字符编码。
  • String.fromCharCode() 可以根据给定码元创建字符,以逗号分隔。
    • 涉及增补平面(Unicode的策略:代理对,使用另外 16 位选择一个增补平面,每个字符使用两个 16 位码元)的字符的时候,charAt()charCodeAt() 失效。可以使用 codePointAt() 代替。
  • str.normalize() 规范化。
  • str.concat(str2) str 拼接 str2 字符串,更常用加号。

    提取子串的三个方法辨析

来自 https://blog.csdn.net/qq_38047742/article/details/82144266

1
2
3
str.slice()
str.substring()
str.substr()
  • 使用一个参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //栗子数据
    var arr = [1,2,3,4,5,6,7],
    str = "helloworld!"; //防止空格干扰,不用带空格的,注意这里有个!号也算一位

    console.log(str.slice(1)); //elloworld!
    console.log(str.substring(1)); //elloworld!
    console.log(str.substr(1)); //elloworld!

    console.log(arr.slice(1)); //[2,3,4,5,6,7]
    console.log(arr.substr(1)); //TypeError: arr.substr is not a function
    console.log(arr.substring(1)); //TypeError: arr.substring is not a function
  • 使用两个整数参数(第一个小于第二个)

    1
    2
    3
    4
    5
    console.log(str.slice(1,4));  //ell
    console.log(str.substring(1,4)); //ell
    console.log(str.substr(1,4)); //ello 不一致了!!!

    console.log(arr.slice(1,4)); //[2,3,4]

    substr() 的第二个参数是截取几位,而其他几个是截取到第几位的前面(经典左开右闭)。

  • 使用两个整数参数(第一个大于第二个

    1
    2
    3
    4
    5
    console.log(str.slice(5,1));  //""
    console.log(str.substring(5,1)); //ello
    console.log(str.substr(5,1)); //"w"

    console.log(arr.slice(5,1)); //[]

    substring() 会将较小的参数作为起点。

    slice() 则会无效。

  • 出现负值的情况

    • slice() 将所有负值参数当成字符串长度加上负数值。
    • substr() 将第一个负参数值当成字符串长度加上该值,第二个转换为 0。
    • substring() 方法则都会转换为 0。

字符串位置方法

  • str.indexOf() 从开头向结尾查找字符串,可以接收参数忽略该位置之前的字符。
  • str.lastIndexOf() 从末尾向开头查找字符串,可以接收参数忽略该位置之后的字符。

字符串包含方法

  • startsWith() 开头是否是
  • endsWith() 结尾是否是
  • includes() 检查整个字符串
  • startsWith()includes() 都接受第二个参数,表示开始搜索的位置。

一些其他方法

  • str.trim() 返回删除前后所有空格的字符串副本

  • str.repeat(整数参数) 复制并连接

  • str.padStart()/padEnd() 第一个参数为长度,第二个参数是可选的填充字符串,默认为空格

  • 迭代与解构

    字符串原型上暴露了一个 @@iterator 方法,用来迭代字符串上的每个字符。

    1
    2
    3
    4
    5
    6
    let message = "abc";
    let stringIterator = message[Symbol.iterator]();
    console.log(stringIterator.next()); // {value: "a", done: false}
    console.log(stringIterator.next()); // {value: "b", done: false}
    console.log(stringIterator.next()); // {value: "c", done: false}
    console.log(stringIterator.next()); // {value: undefined, done: true}

    for-of 循环也可以使用这个来访问每个字符。

    1
    2
    3
    for (const c of "abcde") {
    console.log(c);
    }

    使用解构操作符将字符串分割为字符数组:

    1
    2
    3
    let message = "abcde";
    console.log([...message]);
    // ["a", "b", "c", "d", "e"]
  • 大小写转换

    • str.toLowerCase() / toUpperCase()
    • str.toLocaleLowerCase() / toLocaleUpperCase() 用于特定地区
  • str.match(正则 pattern) 字符串匹配所有符合条件的

  • str.search(正则 pattern) 字符串匹配第一个符合条件的

  • str.replace(字符串/RegExp对象, 替换字符串 / 函数) 其中第二个值有些特殊字符序列来插入正则表达式操作的值,第二个如果是函数则会受到三个参数,可以更细致控制替换过程。

  • str.split(字符串/RegExp, 数组大小) 分隔

  • str.localeCompare() 按字母表排序比较

单例内置对象

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

Global 对象

  • 兜底对象,在全局作用域中定义的变量和函数会变成 Global 对象的属性。

  • 包括 isNaN() / isFinite() / parseInt() / parseFloat() 都是 Global 对象的方法。

  • URL 编码方法

    • encodeURI() 把空格之类的编码成可以访问的 URL
    • encodeURIComponent() 编码 URL 中的单独组件,/ 之类的符号也会被编码。
  • eval() 接受一个 JS 字符串并运行

    • 会将其解释为实际的语句然后插入该位置,这部分代码属于该调用所在上下文,被执行的代码与上下文拥有相同作用域链。
    • 通过其定义的变量和函数不会获得提升。
    • 严格模式下其内部定义的变量和函数无法被外部访问。
    • 谨慎使用。
  • Global 对象的属性image-20220322123410118

    image-20220322123424907

  • window 对象

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

Math 对象

  • Math 对象的属性

    image-20220322122558113

  • Math 对象的方法

    • min() / max()
    • ceil() 向上舍入
    • floor() 向下摄入
    • round() 四舍五入
    • fround() 返回数值最接近的单精度浮点值
    • random() 返回 -~1 之间的随机数
    • 其他方法image-20220322122759261