《JavaScript语言精粹》读书笔记


第2章 语法

  1. JavaScript 只有一个数字类型。它在内部被表示为64位的浮点数。
  2. JavaScript中的所有字符都是Unicode 16位的。字符串是不可变的。
  3. JavaScript 运算符优先级

    1. 括号:( ... )(强制分组)
    2. 成员/索引/可选链/函数调用/构造:.[]?.()、`new(…)(left)
    3. 后缀自增/自减:x++x--(left)
    4. 一元运算:++x--x+-!~typeofvoiddeleteawait(right)
    5. 指数:**(right)
    6. 乘除模:*/%(left)
    7. 加减:+-(left)
    8. 位移:<<>>>>>(left)
    9. 关系:<<=>>=ininstanceof(left)
    10. 相等:==!====!==(left)
    11. 按位与:&(left)
    12. 按位异或:^(left)
    13. 按位或:|(left)
    14. 逻辑与:&&(left)
    15. 逻辑或:||(left)
    16. 空值合并:??(left,注意与 ||/&& 的交互需用括号)
    17. 条件(三元):?:(right)
    18. 赋值与解构赋值:=+=-=...(right)
    19. 逗号运算:,(left,最低)
  4. 在 JavaScript 中,% 是 取余(Remainder)运算符,用于返回两个数相除后的余数。

    5 % 2   // 1   (5 除以 2 余 1)
    10 % 3  // 1
    7 % -3  // 1
    -7 % 3  // -1

    说明:

    1. 结果符号与被除数(左操作数)相同

      -7 % 3  // -1
      7 % -3  // 1
    2. 不是数学上的”模运算”(modulo)

      模运算的结果通常总为非负,而 % 可能为负值。若要得到非负结果,可写:((a % b) + b) % b

    3. 适用于浮点数

      5.5 % 2  // 1.5
    4. 除数为 0 时结果为 NaN

      10 % 0  // NaN

      第3章 对象

  5. JavaScript 的原始数据类型包括:number、string、boolean、null、undefined、symbol 和 bigint。原始类型的值是不可变的。

    除这些之外的值都是对象。

    虽然数字、字符串和布尔值看起来像对象,因为它们有方法,但那是由 JavaScript 自动创建的临时包装对象。

    它们在使用方法时(如 “abc”.toUpperCase())会被自动包装成对应的临时对象(Number、String、Boolean),调用结束后再销毁。

    对象是可变的键值集合。数组、函数、正则表达式都是对象的特殊形式。

第4章 函数

  1. JavaScript 中的函数就是对象。对象是”名/值”对的集合并拥有一个连到原型对象的隐藏连接。

    对象字面量产生的对象连接到Object.prototype。函数对象连接到Function.prototype(该原型对象本身连接到 Object.prototype)。

    每个函数在创建时会附加两个隐藏属性:函数的上下文和实现函数行为的代码

  2. 在 JavaScript 中,this 的值并非在函数定义时确定,而是由函数的调用方式决定。常见的调用方式包括:

    • 方法调用模式:this 绑定到调用该方法的对象。
    • 函数调用模式:this 在严格模式下为 undefined,非严格模式下为全局对象。
    • 构造器调用模式(使用 new):this 绑定到新创建的对象实例。
    • apply / call / bind 调用模式:this 显式绑定为传入的对象。

      此外,箭头函数没有自己的 this,而是从定义时的词法作用域继承。

  3. 在 JavaScript 中,throw 语句会立即中断函数的执行,并抛出一个异常值。该值可以是任意类型,但通常是一个 Error 对象或其子类实例。

    标准的 Error 对象包含两个常用属性:

    • name:表示错误类型(如 “Error”、”TypeError” 等);
    • message:描述错误信息。

      你也可以在自定义异常对象中添加其他属性以提供更多上下文信息。

  4. JavaScript并不支持块级作用域。

第5章 继承

第6章 数组

  1. 数组字面量提供了一种非常方便地创建新数组的表示法。

    一个数组字面量是在一对方括号中包围零个或多个用逗号分隔的值的表达式。数组字面量允许出现在任何表达式可以出现的地方。数组的第一个值将获得属性名’0’,第二个值将获得属性名’1’,依此类推。

    var numbers = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
    var numbers_object = {
        '0': 'zero', 
        '1': 'one',
        '2': 'two',
        '3': 'three',
        '4': 'four',
        '5': 'five',
        '6': 'six',
        '7': 'seven',
        '8': 'eight',
        '9': 'nine'
    }

    numbers 是数组字面量创建的数组对象,numbers_object 是普通对象字面量创建的对象。两者都有 10 个自有属性,键 ‘0’ 到 ‘9’ 对应的值完全相同,但它们有几个显著差异:

    1. 原型链:

      • numbers 继承自 Array.prototype,拥有大量数组方法;
      • numbers_object 继承自 Object.prototype,只有基本对象方法。
    2. length 属性:

      • numbers 拥有自动维护的 length 属性;
      • numbers_object 没有 length,除非手动添加。
    3. 索引访问:

      • 数组索引虽然可以用数字访问,但实际上是字符串形式的属性名。
  2. length 属性的值是这个数组的最大整数属性名加上 1。它不一定等于数组里的属性的个数

    var myArray = [];
    myArray.length // 0
    
    myArray[1000000] = true;
    myArray.length // 1000001

    在 JavaScript 中,数组的 length 属性会动态反映数组中最大索引加 1。

    当你给一个数组的有效索引(非负整数小于 2³²-1)赋值时,如果该索引大于等于当前 length,数组的 length 会自动更新为 索引 + 1。

    给非索引属性赋值(如 myArray["foo"] = 123)不会影响 length。

    你可以直接设置length的值。设置更大的length不会给数组分配更多的空间。而把 length 设小将导致所有下标大于等于新length的属性被删除:


文章作者: Kiba Amor
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 Kiba Amor !
  目录