JavaScript数据结构和算法(一):ECMAScript和TypeScript概述、数组

107 阅读6分钟

一、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取值如下:

类型数组数据类型
Int8Array8位二进制补码整数
Uint8Array8位无符号整数
Uint8ClampedArray8位无符号整数
Int16Array16位二进制补码整数
Uint16Array16位无符号整数
Int32Array32位二进制补码整数
Uint32Array32位无符号整数
Float32Array32位IEEE浮点数
Float64Array64位IEEE浮点数

类型数组在WebGL API、进行位操作、处理文件和图像时较为常用。