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 == undefined为true,null === undefined为false。 - 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:每个实例都有以下属性和方法:
constructor、hasOwnProperty(propertyName)、isPrototypeOf(object)、propertyIsEnumerable(propertyName)、toString()、toLocaleString()、valueOf()。
4. 操作符
- 一元:
++、--、+、- - 位运算:
&、|、~、^、<<、>>、>>>(对32位整数操作) - 布尔:逻辑非
!、逻辑与&&(短路)、逻辑或||(短路) - 乘性:
*、/、% - 加性:
+(字符串拼接优先)、- - 关系:
<、>、<=、>=、==(自动转换)、===(严格相等)、!=、!== - 条件:
? : - 赋值:
=、+=、*=等 - 逗号:
,返回最后一个表达式的值
5. 语句
if-elsedo-while(至少执行一次)whileforfor-in(遍历可枚举属性,包括原型链)for-of(遍历可迭代对象的值,ES6)break/continueswitch(使用===比较,可合并 case)label(配合 break/continue 跳出多层循环)with(严格模式禁用,不建议使用)
6. 函数
- 使用
function声明或表达式。 - 参数:不限制数量、类型;在函数内部通过
arguments对象访问(类数组,不是Array实例)。 - 没有函数重载:同名函数会覆盖之前的定义。
- 默认返回值:
undefined(无return或return;)。 - ES6 允许默认参数值、剩余参数(
...rest)。
7. 常见面试题速查
-
var、let、const的区别?
→var函数作用域,有变量提升,可重复声明,会挂载到window;let/const块作用域,有 TDZ,不可重复声明,不挂载window;const必须初始化且不能重新赋值。 -
什么是 TDZ(暂时性死区)?
→ 从进入块作用域到let/const声明之间的区域,访问变量会报ReferenceError。 -
null和undefined的区别?
→undefined是声明未初始化;null是空对象指针。null == undefined为true,===为false。 -
==与===的区别?
→==会进行类型转换后比较;===严格相等,不转换类型。 -
如何判断一个值是
NaN?
→ 使用isNaN()或Number.isNaN()(ES6,更严格,不转换参数)。 -
typeof对null返回什么?为什么?
→ 返回"object",这是 JS 的历史遗留 bug。 -
如何将字符串转换为数字?
→Number()、parseInt()、parseFloat(),或使用+一元操作符。 -
for-in和for-of的区别?
→for-in遍历对象的可枚举属性(包括原型链);for-of遍历可迭代对象的值(如数组、字符串、Map、Set)。 -
JavaScript 有哪些数据类型?
→ 简单类型:Undefined, Null, Boolean, Number, String, Symbol, BigInt;复杂类型:Object。 -
Symbol有什么用途?
→ 创建唯一属性键,避免属性名冲突;可用于定义对象的非枚举私有属性;Symbol.for()实现全局共享。 -
什么是短路操作符?
→&&和||。&&遇到 falsy 值立即返回该值;||遇到 truthy 值立即返回该值。 -
switch语句中比较时使用什么操作符?
→ 全等操作符===,不会发生类型转换。
本章核心总结
语言基础
├── 变量
│ ├── var
│ ├── let
│ └── const
│
├── 数据类型
│ ├── Undefined
│ ├── Null
│ ├── Boolean
│ ├── Number
│ ├── String
│ ├── Symbol
│ ├── BigInt
│ └── Object
│
├── 类型检测
│ └── typeof
│
├── 类型转换
│
├── 运算符
│
└── 流程控制
必须掌握
✅ var、let、const区别
✅ 8种数据类型
✅ typeof判断结果
✅ null与undefined区别
✅ NaN特点
✅ == 与 === 区别
✅ 常见类型转换规则

浙公网安备 33010602011771号