JavaScript高级程序设计笔记 3

第3章 语言基础

1. 语法

  • 区分大小写:变量、函数、操作符均区分大小写。
  • 标识符规则:首字符为字母、_$,后续可加数字。
  • 注释// 单行 /* 多行 */
  • 严格模式"use strict"; 写在脚本或函数顶部。
  • 语句:分号可选(建议加分号),代码块用 {}

2. 变量

关键字 作用域 提升 重复声明 暂存性死区 全局属性
var 函数作用域 允许 是(挂到window)
let 块作用域 {} 否(有TDZ) 不允许
const 块作用域 否(有TDZ) 不允许 否(且必须初始化,不可重新赋值)
  • 声明风格最佳实践:默认用 const,需要重新赋值用 let,避免 var

TDZ 是 Temporal Dead Zone 的缩写,中文常译作“暂存性死区”(或“暂时性死区”)。

3. 数据类型(7种简单 + 1种复杂)

简单类型Undefined, Null, Boolean, Number, String, Symbol(ES6), BigInt(ES2020)
复杂类型Object(本质上是一组无序键值对)。

3.1 typeof 操作符

typeof 返回
未声明或未初始化 "undefined"
true / false "boolean"
数值 / NaN / Infinity "number"
字符串 "string"
Symbol "symbol"
函数 "function"
非函数对象 "object"
null "object"(历史遗留bug)

3.2 关键细节

  • Undefined:声明未初始化 → undefined;未声明的变量 typeof 也返回 "undefined"
  • Null:空对象指针;null == undefinedtruenull === undefinedfalse
  • Boolean:任何值可调用 Boolean() 或隐式转换。假值:false, 0, NaN, "", null, undefined;其余为真值。
  • Number
    • 整数与浮点数(浮点计算不精确)
    • 范围:Number.MIN_VALUE ~ Number.MAX_VALUE,超出得 Infinity / -Infinity
    • NaN(Not a Number):与任何值不等(包括自身),用 isNaN() 检测。
    • 转换函数:Number()parseInt()parseFloat()
  • String
    • 不可变;拼接用 +
    • 转换为字符串:.toString()null/undefined 不行)或 String()
    • 模板字面量:反引号 + ${} 插值,支持换行。
  • Symbol(ES6):唯一且不可变。常用作对象属性键,避免冲突;Symbol.for() 共享。
  • Object:每个实例都有以下属性和方法:
    • constructorhasOwnProperty(propertyName)isPrototypeOf(object)propertyIsEnumerable(propertyName)toString()toLocaleString()valueOf()

4. 操作符

  • 一元++--+-
  • 位运算&|~^<<>>>>>(对32位整数操作)
  • 布尔:逻辑非 !、逻辑与 &&(短路)、逻辑或 ||(短路)
  • 乘性*/%
  • 加性+(字符串拼接优先)、-
  • 关系<><=>===(自动转换)、===(严格相等)、!=!==
  • 条件? :
  • 赋值=+=*=
  • 逗号, 返回最后一个表达式的值

5. 语句

  • if-else
  • do-while(至少执行一次)
  • while
  • for
  • for-in(遍历可枚举属性,包括原型链)
  • for-of(遍历可迭代对象的值,ES6)
  • break / continue
  • switch(使用 === 比较,可合并 case)
  • label(配合 break/continue 跳出多层循环)
  • with(严格模式禁用,不建议使用)

6. 函数

  • 使用 function 声明或表达式。
  • 参数:不限制数量、类型;在函数内部通过 arguments 对象访问(类数组,不是 Array 实例)。
  • 没有函数重载:同名函数会覆盖之前的定义。
  • 默认返回值:undefined(无 returnreturn;)。
  • ES6 允许默认参数值、剩余参数(...rest)。

7. 常见面试题速查

  1. varletconst 的区别?
    var 函数作用域,有变量提升,可重复声明,会挂载到 windowlet/const 块作用域,有 TDZ,不可重复声明,不挂载 windowconst 必须初始化且不能重新赋值。

  2. 什么是 TDZ(暂时性死区)?
    → 从进入块作用域到 let/const 声明之间的区域,访问变量会报 ReferenceError

  3. nullundefined 的区别?
    undefined 是声明未初始化;null 是空对象指针。null == undefinedtrue===false

  4. ===== 的区别?
    == 会进行类型转换后比较;=== 严格相等,不转换类型。

  5. 如何判断一个值是 NaN
    → 使用 isNaN()Number.isNaN()(ES6,更严格,不转换参数)。

  6. typeofnull 返回什么?为什么?
    → 返回 "object",这是 JS 的历史遗留 bug。

  7. 如何将字符串转换为数字?
    Number()parseInt()parseFloat(),或使用 + 一元操作符。

  8. for-infor-of 的区别?
    for-in 遍历对象的可枚举属性(包括原型链);for-of 遍历可迭代对象的值(如数组、字符串、Map、Set)。

  9. JavaScript 有哪些数据类型?
    → 简单类型:Undefined, Null, Boolean, Number, String, Symbol, BigInt;复杂类型:Object

  10. Symbol 有什么用途?
    → 创建唯一属性键,避免属性名冲突;可用于定义对象的非枚举私有属性;Symbol.for() 实现全局共享。

  11. 什么是短路操作符?
    &&||&& 遇到 falsy 值立即返回该值;|| 遇到 truthy 值立即返回该值。

  12. switch 语句中比较时使用什么操作符?
    → 全等操作符 ===,不会发生类型转换。

本章核心总结

语言基础

├── 变量
│   ├── var
│   ├── let
│   └── const
│
├── 数据类型
│   ├── Undefined
│   ├── Null
│   ├── Boolean
│   ├── Number
│   ├── String
│   ├── Symbol
│   ├── BigInt
│   └── Object
│
├── 类型检测
│   └── typeof
│
├── 类型转换
│
├── 运算符
│
└── 流程控制

必须掌握

✅ var、let、const区别

✅ 8种数据类型

✅ typeof判断结果

✅ null与undefined区别

✅ NaN特点

✅ == 与 === 区别

✅ 常见类型转换规则

posted @ 2024-04-07 09:16  Li_pk  阅读(5)  评论(0)    收藏  举报