一、ECMAScript和TypeScript概述
1、ECMAScript2015+的功能
-
let和const
- 用let代替var声明变量。
- const定义的变量是只读的。
- let和const的变量作用域
-
模板字面量
- 用一对`包裹,把要插入变量的放在${}里就可以了,也可以用于多行字符串,不需要用\n。
-
箭头函数
-
函数的参数默认值
- JavaScript中的arguments内置对象,是一个数组,包含函数被调用时传入的参数。
-
展开运算符(...)
-
增强的对象属性
- 数组和对象解构
- 变量互换
- 属性简写
-
类:基于原型语法的语法糖
-
乘方运算符(**)
-
模块
2、TypeScript介绍
- 类型推断
- 接口和泛型
- 编译时检查
二、数组
1、 数组基本操作
-
创建和初始化数组的方法
let arr = new Array(); arr = new Array(7); arr = [];
-
添加元素
- 末尾插入元素: push方法
- 开头插入元素: unshift方法
-
删除元素
- 末尾删除元素:pop方法
- 开头删除元素:shift方法
-
任意位置添加或删除元素:splice方法
numbers.splice(5, 0, 2, 3, 4)splice方法接受的第一个参数,表示想要删除或插入的元素的索引值。第二个参数是删除元素的个数(这个例子里,我们的目的不是删除元素,所以传入0)。第三个参数往后,就是要添加到数组里的值(元素2、3、4)。
2、数组核心方法参考
本节举例用到的数组和方法如下:
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const isEven = x => x % 2 === 0;
-
常用核心方法
方法 描述 concat 连接2个或更多数组,并返回结果 every 对数组中的每个元素运行给定函数,如果该函数对每个元素都返回true,则返回true filter 对数组中的每个元素运行给定函数,返回该函数会返回true的元素组成的数组 forEach 对数组中的每个元素运行给定函数。这个方法没有返回值 join 将所有的数组元素连接成一个字符串 indexOf 返回在数组中搜索到的与给定参数相等的元素的索引里的最大值 lastIndexOf 返回在数组中搜索到的与给定参数相等的元素的索引里最大的值 map 对数组中的每个元素运行给定函数,返回每次函数调用的结果组成的数组 reverse 颠倒数组中元素的顺序 slice 传入索引值,将数组里对应索引范围内的元素作为新数组返回 some 对数组中的每个元素运行给定函数,如果任一元素返回true,则返回true sort 按照字母顺序对数组排序,支持传入指定排序方法的函数作为参数 toString 将数组作为字符串返回 valueOf 和toString类似,将数组作为字符串返回
-
迭代器函数
-
every、some、forEach、map和filter
-
reduce:接收四个参数:previousValue、currentValue、index和array,index和array是可选参数。返回一个将被叠加到累加器的值,reduce方法停止执行后悔会返回这个累加器。对一个数组中所有元素求和就可以使用reduce:
numbers.reduce((previous, current) => previous + current)
-
-
ECMAScript6和数组新功能
方法 描述 @@iterator 返回一个包含数组键值对的迭代器对象,可以通过同步调用得到数组元素的键值对 copyWithin 复制数组中一些列元素到同一数组指定的起始位置 entries 返回数组中包含所有键值对的@@iterator Includes 如果数组中存在某个元素则返回true,否则返回false find 根据回调函数给定的条件从数组中查找元素,如果找到则返回该元素 findIndex 根据回调函数给定的条件从数组中查找元素,如果找到则返回该元素在数组中的索引 fill 用静态值填充数组 from 根据已有数组创建一个新数组 keys 返回包函数组所有索引的@@iterator of 根据传入的参数创建一个新数据 values 返回包含数组中所有值的@@iterator -
for...of循环迭代
for(const n of numbers) { console.log(isEven(n) ? 'even' : 'odd') }
-
使用@@iterator对象
ES2015为Array类增加了一个@@iterator属性,需要通过Symbol.iterator来访问。
let iterator = numbers[Symbol.iterator](); console.log(iterator.next().value); // 1 console.log(iterator.next().value); // 2 console.log(iterator.next().value); // 3 // 输出数组中的10个值 for(const n of iterator) { console.log(n); }
-
entries、keys和values方法
-
entries返回包含键值对的@@iterator
let aEntries = numbers.entries(); console.log(aEntries.next().value); // [0, 1] - 位置0的位置值为1 console.log(aEntries.next().value); // [1, 2] - 位置1的位置值为2 console.log(aEntries.next().value); // [2, 3] - 位置2的位置值为3
-
keys返回包含数组索引的@@iterator
let aKeys = numbers.keys(); console.log(aKeys.next()); // { value: 0, done: false } console.log(aKeys.next()); // { value: 1, done: false } console.log(aKeys.next()); // { value: 2, done: false }
-
values返回包含数组值的@@iterator
let aValues = numbers.keys(); console.log(aValues.next()); // { value: 1, done: false } console.log(aValues.next()); // { value: 2, done: false } console.log(aValues.next()); // { value: 3, done: false }
-
-
from、of和fill方法
-
from方法根据已有的数组创建一个新的数组,可以传入一个用来过滤值的函数。
let evens = Array.from(numbers, isEven);上述代码创建一个包含值true(如果在原数组中为偶数)或false(如果在原数组中为基数)的数组。
-
of方法根据传入的参数创建一个新数组。
let numbersOf = Array.of(1, 2, 3); // 与 let numbersOf = [1, 2, 3] 效果相同
-
fill方法用静态值填充数组
let numbersFill = [1, 2, 3]; numbersFill.fill(0); // [0, 0, 0]
-
-
copyWithin
copyWithin方法复制数组中的一系列元素到同一数组指定的起始位置。
let copyArray = [1, 2, 3, 4, 5, 6];假如我们想把4、5两个值(在位置3和4上)复制到位置1和2:
copyArray.copyWithin(1, 3, 5); // [1, 4, 5, 4, 5, 6]
-
find和findIndex
find和findIndex的不同之处在于,find方法返回第一个满足条件的值,findIndex方法则返回这个值在数组里的索引。如果没有满足条件的值,find返回undefined,而findIndex返回-1。
-
3、类型数组
类型数组用于存储单一类型的数据。它的语法是 let myArray = new TypedArray(length),其中Typed取值如下:
| 类型数组 | 数据类型 |
|---|---|
| Int8Array | 8位二进制补码整数 |
| Uint8Array | 8位无符号整数 |
| Uint8ClampedArray | 8位无符号整数 |
| Int16Array | 16位二进制补码整数 |
| Uint16Array | 16位无符号整数 |
| Int32Array | 32位二进制补码整数 |
| Uint32Array | 32位无符号整数 |
| Float32Array | 32位IEEE浮点数 |
| Float64Array | 64位IEEE浮点数 |
类型数组在WebGL API、进行位操作、处理文件和图像时较为常用。