ES6 与 TypeScript
ES6 与 TypeScript 核心笔记
第一份:ES6(ECMAScript 2015)核心笔记
一、核心定位
ES6 是 JavaScript 的重要语法规范(ECMAScript 2015),是原生 JS 的语法升级,解决了 ES5 写法繁琐、功能不足的问题,是现代前端开发的基础,可直接在浏览器、Node.js 中运行。
二、必掌握核心语法(高频使用)
1. 变量声明(替代 var)
let:块级作用域(只在 {} 内有效),不能重复声明,不存在变量提升,暂存死区。
const:声明常量,块级作用域,必须初始化赋值;基本类型(数字、字符串)不可修改,引用类型(对象、数组)可修改内部属性。
注意:开发中优先用 const,需要修改的变量用 let,彻底抛弃 var(避免作用域混乱)。
2. 箭头函数(语法糖,简化函数写法)
语法:(参数) => 返回值/代码块
简化写法:单个参数可省略 (),单个返回值可省略 {} 和 return。
核心特点:不绑定 this,this 继承自外层作用域;没有 arguments 对象;不能作为构造函数(不能 new)。
示例:const sum = (a, b) => a + b;(等价于普通函数的 return a + b)
3. 解构赋值(快速取值)
用于快速从数组、对象中提取值,简化代码。
对象解构:const { name, age } = { name: '张三', age: 18 };(变量名与对象属性名一致)
数组解构:const [a, b, c] = [10, 20, 30];(按顺序取值,可跳过空位:[a, , c])
拓展:可设置默认值、重命名(const { name: uname } = obj)。
4. 模板字符串(简化字符串拼接)
语法:用 ``(反引号)包裹,${} 插入变量、表达式或函数调用。
特点:支持换行,无需用 + 拼接,代码更简洁。
示例:const str = `姓名:${name},年龄:${age + 1}`;
5. 函数扩展
默认参数:function sayHi(msg = 'hello') {}(参数未传时使用默认值)。
剩余参数:function sum(...nums) {}(用 ... 接收剩余参数,返回数组,替代 arguments)。
6. 数组与对象扩展
(1)扩展运算符(...)
数组:复制数组(const arr2 = [...arr1])、合并数组(const arr3 = [...arr1, ...arr2])。
对象:复制对象(const obj2 = {...obj1})、合并对象(const obj3 = {...obj1, age: 20},后面的属性覆盖前面)。
(2)数组新方法(高频)
find():查找第一个满足条件的元素,返回元素本身(找不到返回 undefined)。
findIndex():查找第一个满足条件的元素索引(找不到返回 -1)。
includes():判断数组是否包含某个元素,返回布尔值(替代 indexOf,可判断 NaN)。
其他:forEach()、map()、filter()、reduce()(重点掌握 reduce 求和、累加)。
(3)对象简写
当对象属性名与变量名一致时,可简写:const name = '张三'; const obj = { name };(等价于 { name: name })。
7. class 类(面向对象语法)
ES6 提供标准的类语法,替代 ES5 的构造函数,更简洁、易维护。
基本语法:class Person { constructor(name) { this.name = name; } say() { console.log(this.name); } }
继承:用 extends 关键字,子类通过 super() 调用父类构造函数。
静态方法:用 static 修饰,只能通过类调用(不能通过实例调用)。
8. 模块化(import / export)
前端工程化核心,实现代码拆分、复用,避免全局变量污染。
导出(export):单个导出(export const a = 10)、批量导出(export { a, b })、默认导出(export default Person)。
导入(import):导入单个/多个(import { a, b } from './module')、导入默认导出(import Person from './module')。
9. 异步编程(Promise)
解决回调地狱(嵌套回调),简化异步代码。
基本语法:new Promise((resolve, reject) => { 异步操作; 成功调用 resolve(结果); 失败调用 reject(错误); })
常用方法:then()(成功回调)、catch()(失败回调)、finally()(无论成功失败都执行)。
10. 其他实用特性
Set:数据结构,用于去重(const set = new Set([1,1,2]); 结果为 {1,2})。
Map:键值对数据结构,键可以是任意类型(替代对象的字符串键限制)。
for...of 循环:遍历数组、Set、Map 等可迭代对象,替代 for 循环(可配合 break 终止)。
三、核心总结
ES6 核心是「简化 JS 写法、增加原生功能」,所有特性都是原生 JS 支持,无需编译,是现代前端开发的基础,必须熟练掌握。
第二份:TypeScript(TS)核心笔记
一、核心定位
TypeScript(TS)是微软开发的 JavaScript 超集,完全兼容所有 ES6+ 语法,在此基础上新增了「静态类型系统」和高级语法,解决了 JS 弱类型、无类型校验导致的bug多、维护难问题。TS 不能直接运行,必须编译成 JS 后执行。
核心关系:TS = ES6+ + 静态类型系统 + 高级特性
二、核心知识点(重点:类型系统)
1. 基础类型(核心:给变量指定类型)
语法:let 变量名: 类型 = 值;(类型注解)
基本类型:number(数字)、string(字符串)、boolean(布尔值)、null、undefined、void(无返回值)、never(永远不会返回)。
示例:
let num: number = 10;(只能赋值数字)
let str: string = 'hello';(只能赋值字符串)
let isOk: boolean = true;(只能赋值 true/false)
function fn(): void { console.log('无返回值'); }
- 注意:TS 会自动类型推断(let num = 10; 会自动推断 num 为 number 类型),但建议显式指定类型,提高可读性。
2. 复杂类型
(1)数组类型
语法1:let 数组名: 类型[] = [值1, 值2];(如:let arr: number[] = [1,2,3])
语法2:let 数组名: Array<类型> = [值1, 值2];(如:let arr: Array<string> = ['a','b'])
联合类型数组:let arr: (number | string)[] = [1, 'a'];(数组中可包含数字和字符串)
(2)对象类型
方式1:直接指定属性类型(let obj: { name: string; age: number } = { name: '张三', age: 18 })。
方式2:接口(interface,重点):定义对象的“模板”,可复用。
示例:
interface Person {
name: string; // 必选属性
age?: number; // 可选属性(? 表示可选)
readonly id: number; // 只读属性(不能修改)
}
let person: Person = { name: '张三', id: 1 };
(3)联合类型(|)
变量可以是多种类型中的一种,语法:let 变量名: 类型1 | 类型2 = 值;
示例:let a: number | string = 10; a = 'hello';(两种类型都可赋值)
(4)交叉类型(&)
合并多个类型的属性,语法:let 变量名: 类型1 & 类型2 = 值;
示例:interface A { a: number }; interface B { b: string }; let obj: A & B = { a: 1, b: 'a' };
3. 函数类型(给函数指定参数和返回值类型)
基本语法:function 函数名(参数1: 类型, 参数2: 类型): 返回值类型 { ... }
示例:function sum(a: number, b: number): number { return a + b; }
可选参数:参数后加 ?(function fn(a: number, b?: number): number {})。
默认参数:参数 = 默认值(function fn(a: number = 10): number {})。
剩余参数:...rest: 类型[](function fn(...rest: number[]): number {})。
4. 泛型(重点,解决类型复用)
定义函数、接口、类时,不指定具体类型,而是用一个占位符(如 T),使用时再传入具体类型,实现类型复用。
语法:function 函数名<T>(参数: T): T { ... }
示例:// 通用数组反转函数
function reverse<T>(arr: T[]): T[] {
return arr.reverse();
}
reverse<number>([1,2,3]); // 传入 number 类型
reverse<string>(['a','b']); // 传入 string 类型
5. 枚举(enum,TS 独有)
用于定义一组有名字的常量,提高代码可读性,语法:enum 枚举名 { 常量1, 常量2, ... }
示例:enum Gender { Male, Female }(默认值:Male=0,Female=1,可自定义值)
使用:let gender: Gender = Gender.Male;(只能赋值枚举中的常量)
6. 类型断言(手动指定类型)
当 TS 无法自动推断类型时,手动指定变量类型,语法有两种:
方式1:<类型>变量(let str: any = 'hello'; let len: number = (<string>str).length)。
方式2:变量 as 类型(let len: number = (str as string).length)(更推荐,兼容 React)。
7. 类与接口(面向对象增强)
类的类型:class Person { name: string; constructor(name: string) { this.name = name; } }
接口继承类:interface 接口名 extends 类名 { ... }
类实现接口:class 类名 implements 接口名 { ... }(必须实现接口中的所有必选属性和方法)。
访问修饰符(TS 独有):
- public(默认):类内、类外、子类都可访问。
- private:只有类内可访问。
- protected:类内、子类可访问,类外不可访问。
8. 编译配置(tsconfig.json)
TS 编译的核心配置文件,指定编译规则,常用配置:
"target": "ES6":指定编译后的 JS 版本。
"outDir": "./dist":指定编译后的 JS 文件输出目录。
"rootDir": "./src":指定 TS 源文件目录。
"strict": true:开启严格模式(推荐,强制类型校验)。
9. TS 与 ES6 的兼容
TS 完全兼容 ES6 所有语法,写 TS 时,可直接使用 let、const、箭头函数、class、模块等 ES6 特性。
区别:TS 只是在 ES6 基础上增加了类型相关语法,编译后会移除所有类型注解,生成纯 JS 代码。
三、适用场景与核心总结
1. 适用场景
大型项目、团队协作(类型校验减少 bug,提高代码可维护性、可重构性)。
框架开发(Vue3、React 项目优先用 TS,提升开发体验)。
2. 核心总结
TS 核心是「给 JS 加类型」,解决 JS 弱类型的痛点。
TS 兼容所有 ES6+ 语法,学习 TS 必须先掌握 ES6。
TS 需编译成 JS 运行,核心依赖 tsconfig.json 配置。
重点掌握:类型注解、接口、泛型、枚举、函数类型。
(注:文档部分内容可能由 AI 生成)
