红宝书(第四版)通读之查漏补缺

76 阅读7分钟

2025年04月20日 天气晴 伊通河畔

一、JavaScript构成

image.png

image.png

二、基础语法

1. 区分大小写

2. 标识符: 变量、函数、属性或函数参数的名称。

  • 第一个字符必须是一个字母、下划线(_)或美元符号($)
  • 剩下的其他字符可以是字母、下划线、美元符号或数字。
  • 表示符推荐使用驼峰形式书写(小驼峰),首字母小写后面的单词首字母大写

3. 注释

  • // 单行注释
  • /* 多行注释 */
  • /** JS Doc */

4. 严格模式:是一种不同的JS 解析和执行模型。目的,不破换ECMAScript3的语法

  • “use strict”可以在js脚本开头
  • “use strict”可以在函数内部的开头

5. 语句

  • 语句结束通过 “;” 进行标识,建议写上,避免代码压缩造成代码异常。

6. 关键字:是JavaScript语言中当前具有特定语法功能的词汇。不能作为标识符或属性名

breakdointypeof
caseelseinstanceofvar
catchexportnewvoid
calssextendsreturnwhile
constfinallysuperwith
continueforswitchyield
debuggerfunctionthisdefault
ifthrowdeleteimport
try

7. 保留字:是JavaScript语言预留的词汇,它们目前可能没有特定的语法功能,但未来版本的JavaScript可能会赋予它们新的含义。不能作为标识符或属性名

  • 始终保留:enum
  • 严格模式保留:
implementspackagepublicinterface
protectedstaticletprivate
  • 模块代码中保留:await

8. 变量

  • ver关键字:范围是函数作用域,同层级不能声明同名变量
    • 局部变量,外部访问出错
    • 全局变量,任何位置可访问,会成为window的属性。
    • 状态提升,只在函数内部存在吗?需要验证一下在js标签内是否存在状态提升特性。
  • let 声明:范围是块作用域,同层级不能声明同名变量
    • 暂时性死区: var 关键字中的状态提升在let声明中会出现暂时性死区
    • 全局声明:不会挂到window的属性中。
    • 条件声明:不太理解???
    • for 中 var 声明的变量会渗透到循环外部,let 声明的变量只在循环代码块中。
  • const 声明:范围是块作用域,同层级不能声明同名变量
    • 常常称为常量:只能在声明变量时进行初始化,后面不可更改。
    • 声明限制只适用于它指向的变量引用
    • 所以 Object 中的Key和Value是可以修改调整的。
    • 循环,普通for不可使用 const声明,for…in…、for…of…是可以的,因为它们不需要修改数据。
  • 声明风格和最佳实践:
    const -> let -> var(尽量不使用)

9. 数据类型

UndefinedNullBooleanNumber
StringSymbol(ES6+)复杂数据类型Object(无序)
  • typeof 操作符:获取数据类型
    • “undefine”:表示值为未定义
    • “boolean”: 表示值为布尔值
    • "string":表示值为字符串
    • “number”: 表示值为数值
    • ”object”:表示值为对象(而不是函数)或null;
    • “function”:表示值为函数
    • “symbol”:表示值为符号
  • undefined 类型
    • undefined 类型只有一个值,特殊值 undefined
    • varlet 未初始化的变量 都被赋予 undefined,不需要主动赋值undefined
    • 未被声明的变量 typeof 也会 返回 undefined

2025年04月26日 天气晴 住宅

  • Null 类型
    • Null类型只有一个值,特殊值 null
    • 逻辑上讲,null 值表示一个空对象指针,所以typeof null = Object
    • 声明变量建议使用 null 进行初始化
  • Boolean 类型
    • Boolean 类型 有两个字面值:true 和 false。注意,true != 1false != 0
    • 严格区分字面类型大小写。
    • 了不同类型与布尔值之间的转换规则如下表:
数据类型转换为 true 的值转换为 false 的值
Booleantruefalse
String非空字符串""(空字符串)
Number非零数值(包括无穷值)0、NaN(参见后面的相关内容)
Object任意对象null
UndefinedN/A(不存在)undefined
  • Number 类型
    • Number 类型使用 IEEE 754 格式表示整 数和浮点值
    • 整数值:通常用来存十进制八进制十六进制。但是,进行数学计算仍然被视为十进制进行计算。(类似将非十进制数据转为十进制,进行计算)
    • +0 和 -0 是完全相等的
    • 浮点值:数值中必须包含小数点,而且小数点后面必须至少有一个数字。虽然小数点前面不 是必须有整数,但推荐加上
    • 不要对浮点值进行是否相等的判断(使用了 IEEE 754 数值导致这个问题出现,与其他无关)
    • 对于非常大或非常小的数值,可以考虑使用科学计数法表示 0.000007 = 7e-6, 7000000 = 7e6
    • 值得范围:最小 Number.MIN_VALUE ,这个值在多数浏览器中是 5e-324,最大 Number.MAX_VALUE, 这个值在多数浏览器中是 1.7976931348623157e+308。超出这个范围的值,会被自动转换为一个特殊的 正负Infinity(无穷)值。
    • NAN值:有一个特殊的数值叫 NaN,意思是“不是数值”(Not a Number),用于表示本来要返回数值的操作 失败了(而不是抛出错误)。
    • ECMAScript 提供了 isNaN() 函数, 该函数接收一个参数,可以是任意数据类型,然后判断 这个参数是否“不是数值”。
    console.log(isNaN(NaN));    // true 
    console.log(isNaN(10));     // false,10 是数值 
    console.log(isNaN("10"));   // false,可以转换为数值 10 
    console.log(isNaN("blue")); // true,不可以转换为数值 
    console.log(isNaN(true));   // false,可以转换为数值 1
    
    • 类型转换:
      • Number() 是转型函数,转型规则如下:
        • 布尔值,true 转换为 1,false 转换为 0。
        • 数值,直接返回。
        • null,返回 0。
        • undefined,返回 NaN。
        • String 类型转换规则
          • 包括数值(整值/浮点值)字符前面带加、减号的有效字符串数值情况,转为正负十进制数值
          • 有效的十六进制或八进制字符串,会转为十进制数值(处理正负)
          • 空字符串,返回数值0
          • 如果字符串包含除上述情况之外的其他字符,则返回 NaN
        • 对象,调用 valueOf()方法,并按照上述规则转换返回的值。如果转换结果是 NaN,则调用 toString()方法,再按照转换字符串的规则转换。
      • parseInt(字符串, 进制) 是字符串转数值,从第一个非空格字符开始转换。如果第一个字符不是数值字符、加号或减号,parseInt()立即 返回 NaN。转型规则如下:
        • 进制不填写(多数填写10),就是让 parseInt 自己判断是什么进制类型。0x 前缀是 十六进制, 0 前缀在严格模式中是 八进制。
        • 转换规则实例如下:
        let num1 = parseInt("1234blue"); // 1234 
        let num2 = parseInt(""); // NaN 
        let num3 = parseInt("0xA"); // 10,解释为十六进制整数 
        let num4 = parseInt(22.5); // 22 
        let num5 = parseInt("70"); // 70,解释为十进制值 
        let num6 = parseInt("0xf"); // 15,解释为十六进制整数
        // 十六进制处理方式
        let num = parseInt("0xAF", 16); // 175 
        let num1 = parseInt("AF", 16); // 175 
        let num2 = parseInt("AF"); // NaN, parseInt 无法判断是什么进制值
        
      • parseFloat() 是字符串转数值,从位置 0 开始检测每个字符。同样, 它也是解析到字符串末尾或者解析到一个无效的浮点数值字符为止。这意味着第一次出现的小数点是有 效的,但第二次出现的小数点就无效了,此时字符串的剩余字符都会被忽略。转型规则如下:
        • 只能解析十进制数据,十六进制返回 0
        • 如果未解析到小数点,就返回整数
        • 转换规则实例如下:
            let num1 = parseFloat("1234blue"); // 1234,按整数解析 
            let num2 = parseFloat("0xA"); // 0 let num3 = parseFloat("22.5"); // 22.5 
            let num4 = parseFloat("22.34.5"); // 22.34 
            let num5 = parseFloat("0908.5"); // 908.5 
            let num6 = parseFloat("3.125e7"); // 31250000
        

个人博客地址