es6学习总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了es6学习总结相关的知识,希望对你有一定的参考价值。

本篇为阅读和学习《ECMAScript 6 入门》的总结笔记,仅摘取重要的点记录一下。

需要掌握的点

1.let与const

2.变量的解构赋值

3.数据结构set

4.数据结构map

5.iterator和for循环

6.class的使用

7.class的继承

8.Symbol数据类型

9.内置对象的扩展

10.函数的扩展

11.异步操作之promise

-----------------------------------分-----------------------割-------------------------线---------------------------------------------------

变量的解构赋值

基本概念:本质上就是一种匹配模式,只要等号两边的模式相同,那么左边的变量就可以被赋予对应的值。
结构赋值主要分为:
1 数组的解构赋值
2 对象的结构赋值
3 基本类型的解构赋值

数据结构set

集合(set):集合是由一组无序且唯一(即不能重复)的项组成的。这个数据结构使用了与有限集合相同的数学概念,应用在计算机的数据结构中。
特点:key 和 value 相同,没有重复的 value。
ES6 提供了数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。

1.创建set

const s = new Set([1, 2, 3]);

2.set的属性

console.log(s.size); // 3

3.set的方法

set.add(value) 添加一个数据,返回Set结构本身
set.delete(value) 删除指定数据,返回一个布尔值,表示删除是否成功
set.has(value) 判断该值是否为Set的成员,反回一个布尔值
set.clear() 清除所有数据,没有返回值
keys() 返回键名的遍历器
values() 返回键值的遍历器
entries() 返回键值对的遍历器
forEach() 使用回调函数遍历每个成员

s.add(‘a‘).add(‘b‘).add(‘c‘);
console.log(s.delete(‘a‘));
console.log(s.has(‘a‘)); // false
console.log(s.has(1)); // true
console.log(s.keys());
console.log(s.values());
console.log(s.entries());
s.forEach(function (value, key, set){
  console.log(value + ‘ miaov‘);
});

数据结构map

字典(map):是用来存储不重复key的Hash结构。不同于集合(Set)的是,字典使用的是[键,值]的形式来储存数据的。
javascript 的对象(Object:{})只能用字符串当作键。这给它的使用带来了很大的限制。
为了解决这个问题,ES6提供了Map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应,是一种更完善的Hash结构实现。如果你需要“键值对”的数据结构,Map比Object更合适。

1.创建一个Map

const map = new Map([
  [‘a‘, 1],
  [‘b‘, 2]
]);

2.Map类的属性

console.log(map.size);

3.Map类的方法

set(key, value) 设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键
get(key) get方法读取key对应的键值,如果找不到 key,返回undefined
delete(key) 删除某个键,返回true。如果删除失败,返回false
has(key) 方法返回一个布尔值,表示某个键是否在当前Map对象之中
clear() 清除所有数据,没有返回值。
keys() 返回键名的遍历器
values() 返回键值的遍历器
entries() 返回键值对的遍历器
forEach() 使用回调函数遍历每个成员

Iterator和for...of循环

基本概念:在ES6中新增了Set和Map两种数据结构,再加上JS之前原有的数组和对象,这样就有了四种数据集合,平时还可以组合使用它们,定义自己的数据结构,比如数组的成员是Map,Map的成员是对象等。这样就需要一种统一的接口机制,来处理所有不同的数据结构。
Iterator就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作,而且这种遍历操作是依次处理该数据结构的所有成员。

Iterator遍历器的作用:
- 为各种数据结构,提供一个统一的、简便的访问接口。
- 使得数据结构的成员能够按某种次序排列。
- ES6新增了遍历命令for...of循环,Iterator接口主要供for...of消费。

1.手写Iterator接口

const arr = [1, 2, 3];

function iterator(arr){
  let index = 0;
  return {
    next: function (){
      return index < arr.length ? 
      {value: arr[index++], done: false} :
      {value: undefined, done: true};
    }
  }
}

const it = iterator(arr);
console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());

2.Iterator的遍历过程

- 创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
- 第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。
- 第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。
- 不断调用指针对象的next方法,直到它指向数据结构的结束位置。
每一次调用next方法,都会返回数据结构的当前成员的信息。具体来说,就是返回一个包含value和done两个属性的对象。其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束。

3.凡是具有 Symbol.iterator 属性的数据结构都具有 Iterator 接口

4.具备iterator接口的数据结构都可以进行如下操作
- 解构赋值
- 扩展运算符

for...of循环

const ofArr = [1, 2, 3, 4];

for(let i of ofArr){
  console.log(i);
}

const m = new Map();

m.set(‘a‘, 1).set(‘b‘, 2).set(‘c‘, 3);
for(let [key, value] of m){
  console.log(key, value);
}

class

在ES6中新增加了类的概念,可以使用 class 关键字声明一个类,之后以这个类来实例化对象。

class PeriHe {
  constructor(a, b){
    this.a = a;
    this.b = b;
    return this;
  }
  print(){
    console.log(this.a + ‘ ‘ + this.b);
  }
};

const PeriHe = new PeriHe(‘hello‘, ‘world‘).print();

1. PeriHe中的constructor方法是构造方法,this关键字则代表实例对象。也就是说,ES5的构造函数PeriHe,对应ES6的PeriHe这个类的构造方法。
2. PeriHe这个类除了构造方法,还定义了一个print方法。注意,定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。
3. 构造函数的prototype属性,在ES6的“类”上面继续存在。而且类的所有方法都定义在类的prototype属性上面。
4. 定义在类中的方法都是不可以枚举的。
5. constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。
6. 生成类的实例对象的写法,与ES5完全一样,也是使用new命令。如果忘记加上new,像函数那样调用Class,将会报错。

class 的继承等相关知识

extends、 static、 super

Symbol

表示独一无二的值。它是 JS 中的第七种数据类型。

基本的数据类型: Null Undefined Number Boolean String Symbol
引用数据类型:Object

let s1 = Symbol();
console.log(typeof s1); // ‘symbol‘

Symbol 函数前不能使用 new 否则会报错,原因在于 Symbol 是一个原始类型的值,不是对象。
Symbol 函数接收一个字符串作为参数,表示对Symbol的描述,主要是为了在控制台显示,或者转为字符串的时候,比较容易区分.

1.Symbol 数据类型的转换

console.log(String(Symbol(‘PeriHe‘))); // Symbol(PeriHe)
console.log(Symbol(‘leo‘).toString()); // Symbol(leo)

console.log(!!Symbol()); // true
console.log(Number(Symbol()));

console.log(Symbol(‘momo‘) + ‘pangzi‘);
console.log(Symbol(‘momo‘) * 100);  不能做任何运算。

2.作为对象的属性名

let yyy = Symbol(‘yyy‘);

const obj = {};

obj[yyy] = ‘hello‘;

console.log(obj);

console.log(obj[yyy]);

let ss = Symbol(‘ss‘);

const data = {
  [ss]: ‘PeriHe‘
};

console.log(data);

console.log(data[ss]);

3.不能被for...in循环遍,虽然不能被遍历,但是也不是私有的属性,可以通过Object.getOwnPropertySymbols方法获得一个对象的所有的Symbol属性。

console.log(Object.getOwnPropertySymbols(data)); // [Symbol()]

console.log(data[Object.getOwnPropertySymbols(data)[0]]);

函数的扩展

1 为函数参数指定默认值

2 函数的 rest 参数

rest 参数形式为(“...变量名”),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。

3 箭头函数

- 箭头函数体内没有自己的this对象,所以在使用的时候,其内部的this就是定义时所在环境的对象,而不是使用时所在环境的对象。
- 不能给箭头函数使用 call apply bind 去改变其内部的this指向
- 不可以当作构造函数,不可以使用new命令,否则会抛出一个错误。

数组的扩展

对象的扩展

字符串的扩展

 

 













































以上是关于es6学习总结的主要内容,如果未能解决你的问题,请参考以下文章

ES6学习总结

ES6学习总结

Python学习总结

线程学习知识点总结

ES6学习及总结:对象的解构

javascript的ES6学习总结(第一部分)