ES6学习笔记

课程bilibili:av48509573

笔记只是方便我回忆,和视频没有什么不同的

1.课程介绍

ECMAScript简称ES,可以看作一套标准

js就是实施这套标准的语言

主流浏览器用es5

现在以年代命名

 

 

2作用域let

即申明一个变量后什么时候可以去使用它

if (true) {

var fruit = 'apple';

}

console.log(fruit);

输出apple

if (true) {

let fruit = 'apple';

}

console.log(fruit);

 

输出报错,未定义

用let定义的变量,在块的外面就不能使用了,使用大括号{}分为块

 

3.const

使用它可以去声明一个恒量,这样就可以让他不能再去分配新的值

const fruit = [];

fruit.push('apple');

fruit.push('lemon');

console.log(fruit);

输出Array [ "apple", "lemon" ]

const fruit = [];

fruit.push('apple');

fruit.push('lemon');

fruit = [];

console.log(fruit);

输出报错

 

 

4解构数组

场景:将函数返回的数组,一一赋值给对应的变量

老的思路

function foods(){

return ['xx','xx'];

}

 

var tmp = foods();

var hot = tmp[0], cold = tmp[1];

对应变量和临时变量数组内的值一一对应

解构数组思路

function foods(){

return ['xx','xx'];

}

 

let [hot,cold] = foods();

 

console.log(hot,cold);

输出xx xx

 

5解构对象

 

function foods(){

return {'hot':'x1','cold':'x2'};

}

 

let {'hot':hotfoods,'cold':coldfoods} = foods();

 

console.log(hotfoods,coldfoods);

 

输出x1 x2

以此分别使用该对象里的值

 

6模板字符串

场景:希望把两个变量连成一句话

老方法

let hotfood = 'x1',

coldfood = 'x2';

let foods = "热" + hotfood + "冷" + coldfood;

console.log(foods);

新方法(感觉有点像数据绑定)(`为反引号)

(结构为`${变量名}`)

let hotfood = 'x1',

coldfood = 'x2';

let foods = `热${hotfood}冷${coldfood}`;

console.log(foods);

 

7带标签的模板

可以通过模板字符串前面的标签来处理该字符串

1.添加模板的标签

2.添加标签函数,含有两个参数,string,...values (...为扩展运算符

以此来修改返回值

3.通过调用模板对象来调用修改的输出

let hotfood = 'x1',

coldfood = 'x2';

let foods = store `热${hotfood}冷${coldfood}`;

 

function store(strings,...values){

console.log(strings);

console.log(values);

}

 

console.log(foods);

输出

Array(3) [ "热", "冷", "" ]

Array [ "x1", "x2" ]

 

通过组合strings和values数组来定义输出

(目的在于可以使用与重复度比较高的字符串,可以简单添加修改货币符号等...)

 

let hotfood = 'x1',

coldfood = 'x2';

 

let foods = store`热${hotfood}冷${coldfood}`;

 

function store(strings, ...values) {

console.log(strings);

console.log(values);

 

let result = '';

for (let i = 0; i < values.length; i++) {

result += strings[i];

result += values[i];

}

result += strings[strings.length - 1];

 

return result;

}

 

console.log(foods);

 

输出

Array(3) [ "热", "冷", "" ]

Array [ "x1", "x2" ]

热x1冷x2

 

8.判断字符串里是否包含其他字符串

includes() , startsWith() , endsWith()

str.includes('a') //是否包含‘a’

str.startsWith('b') //是否是‘b’打头

str.endsWith('c') //是否是‘c'结尾

 

9函数默认参数

可以给函数接受的参数设置默认值,使用该函数如果没给值就使用默认值

function foods (hot = 'x1',cold = 'x2'){

return `${hot} ${cold}`;

}

console.log(foods());

输出x1 x2

 

 

10展开操作符...spread展开

let fruits = ['apple','bananer'],

foods = ['x1',...fruits];

 

console.log(fruits);

console.log(...fruits);

console.log(foods);

输出

Array [ "apple", "bananer" ]

apple bananer

Array(3) [ "x1", "apple", "bananer" ]

不加...输出的是数组,加了以后输出的是数组值

 

11。 剩余操作符...Rest

一般用在参数里,让函数支持更多的参数,让参数数量不受限制

function foods(hot,cold,...nomal) {

console.log(hot,cold,nomal);

console.log(hot,cold,...nomal);

}

 

foods('x1','x2','x3','x4');

输出

x1 x2 Array [ "x3", "x4" ]

x1 x2 x3 x4

参数处的...nomal,代表多余的参数都将给nomal对象

输出处的...nomal,代表数组的展开

 

12. 函数的名字,name属性

可以得到函数的名字

function.name

 

13.箭头函数

1定义变量,

作为函数的名字 = 可以接收的参数的名字 => 函数返回的值

let breakfast1 = dessert => dessert;

let breakfast2 = (dessert,drink) => {

dessert+drink;

};

普通函数写法

var breakfast1 = function breakfast1(dessert){

return dessert;

};

var breakfast2 = function breakfast2(dessert,drink){

return dessert+drink;

};

 

14.对象表达式

 

let hotfood = 'xx',coldfood = 'oo';

 

let food = {

hotfood:hotfood,

coldfood:coldfood,

breakfast:function(){}

}

若在对象中添加与变量名一样的属性 ,且值为变量的值时

可以这样写

let hotfood = 'xx',coldfood = 'oo';

 

let food = {

hotfood,

coldfood,

breakfast(){}

}

 

输出均为

Object { hotfood: "xx", coldfood: "oo", breakfast: breakfast()

 

16.对象属性名(的操作)

添加属性可以用 . 点

若属性名为带空格的字符串 或 字符串变量,使用 [ ] 中括号

let food = [];

let coldDrink = 'cold drink';

 

food.dessert = 'cake';

food['hot drink'] = 'tea';

food[coldDrink] = 'coffe';

 

console.log(food);

 

输出

[]

"cold drink": "coffe"

dessert: "cake"

"hot drink": "tea"

 

17.对比两个值是否相等

== 或者 object.is(,)

 

18.把对象的值复制到另一个对象里

Object.assign(,) 参数1是对象,参数2 是源

let breakfast = {};

 

Object.assign(

breakfast,{'drink':'tea'}

);

 

console.log(breakfast);

 

输出Object { drink: "tea" }

 

19设置对象的prototype

Object.setPrototypeOf(原本的,改为)

可以在创建对象后改变对象的prototype

let breakfast = {

getDrink() {

return 'tea';

}

};

 

let dinner = {

getDrink() {

return 'bear';

}

};

 

let sunday = Object.create(breakfast);

console.log(sunday.getDrink());

console.log(Object.getPrototypeOf(sunday) === breakfast);

 

Object.setPrototypeOf(sunday,dinner);

 

console.log(sunday.getDrink());

console.log(Object.getPrototypeOf(sunday) === dinner);

 

prototype是函数的 原型对象

如上,以breakfast创建的对象sunday的原型对象就是breakfast,所以调用它的属性方法。

而使用setPrototypeOf可以更改其原型对象,更改它所调用的函数,使用其改为调用dinner的属性方法

 

输出为

tea

true

bear

true

 

20 __proto__

可以使用__proto__属性来设置函数的prototype

 

let breakfast = {

getDrink() {

return 'tea';

}

};

 

let dinner = {

getDrink() {

return 'bear';

}

};

 

let sunday = {

__proto__:breakfast

};

 

console.log(sunday.getDrink());

console.log(Object.getPrototypeOf(sunday)===breakfast);

sunday.__proto__=dinner;

console.log(sunday.getDrink());

console.log(Object.getPrototypeOf(sunday)===dinner);

 

21.super

修改继承的方法,直接定义同样的属性函数

let breakfast = {

getDrink() {

return 'tea';

}

};

let sunday = {

__proto__:breakfast,

getDrink(){

return super.getDrink() + 'wine'

}

};

 

console.log(sunday.getDrink());

 

用super来调用源函数对象

输出teawine

 

22 迭代器 Iterators (交换轮流代替

每次执行时会返回两个对象

{value : xx , done : ture/false}

value表示返回值

done为是否还有迭代的东西,没有东西了以后为ture,完成了迭代

拥有一个next方法,每次执行会返回一个对象,含有value和done两个属性,如果没有可以迭代的东西,value这个属性的值就会变成undifined,done会变成ture

可以使用Generators来生成迭代器

以下是手动构造的迭代器

function chef(foods){

let i = 0;

return{

next() {

let done = (i>= foods.length);

let value = !done ? foods[i++] :undefined;

 

return{

value:value,

done:done

}

}

}

}

let xiaoming = chef(['tomato','egg']);

console.log(xiaoming.next());

console.log(xiaoming.next());

console.log(xiaoming.next());

 

输出

Object { value: "tomato", done: false }

Object { value: "egg", done: false }

Object { value: undefined, done: true }

 

从这里看特点大概就是可以一个个取出数组里的值....看起来好像没什么用

 

23.生成器Generators

用来去生成迭代器

function* chef(){

yield 'apple';

yield 'egg';

}

let xiaoming = chef();

 

console.log(xiaoming.next());

console.log(xiaoming.next());

console.log(xiaoming.next());

 

输出

Object { value: "apple", done: false }

Object { value: "egg", done: false }

Object { value: undefined, done: true }

 

改造

 

function* chef(foods){

for (let i = 0; i < foods.length; i++) {

yield foods[i];

}

}

let xiaoming = chef(['apple','egg']);

 

console.log(xiaoming.next());

console.log(xiaoming.next());

console.log(xiaoming.next());

 

输出同上

可以用函数表达式的方式去创建

let chef = function* chef(){}

 

24.Classes类

class Chef{

// 构造函数

constructor(food){

this.food = food;

}

 

//方法之间不需要逗号分开

cook(){

console.log(this.food);

}

}

 

// 实例化

let xiaoming = new Chef('tomato');

xiaoming.cook();

输出tomato

 

25.get与set

可以在类中定义get和set

class Chef{

// 构造函数

constructor(food){

this.food = food;

this.dish = [];

}

 

get menu(){

return this.dish;

}

 

set menu(dish){

this.dish.push(dish);

}

 

//方法之间不需要逗号分开

 

}

 

// 实例化

let xiaoming = new Chef();

console.log(xiaoming.menu = 'beef');

console.log(xiaoming.menu = 'chicken');

console.log(xiaoming.menu);

输出

beef

chicken

Array [ "beef", "chicken" ]

定义好像是函数的形式,但是调用不是按函数的形式调用,如上

 

26.静态方法static

不需要实例化就可以使用的方法

class Chef{

static cook(food){

console.log(food);

}

}

 

// 无需实例化

Chef.cook('tomato');

 

输出tomato

 

27.继承 extends

一个类可以去继承其他类里面的东西

class Person{

constructor(name,birthday){

this.name=name;

this.birthday=birthday;

}

 

intro(){

return `${this.name},${this.birthday}`;

}

 

}

 

class Chef extends Person {

constructor(name,birthday){

// 直接使用父类的构造函数

super(name,birthday);

}

}

// Chef实例化

let xiaoming = new Chef('xiaoming','1996-01-01');

//调用父类的方法

console.log(xiaoming.intro());

 

28.Set

Set是一堆东西的集合,有点像数组,和数组不同的是set中不能有重复的内容,创建set可以使用new Set();

let desserts = new Set('ABC');

//重复添加没用

desserts.add('D');

desserts.add('D');

// 输出set

console.log(desserts);

//显示数量

console.log(desserts.size);

//是否存在

console.log(desserts.has('C'));

//删除项

desserts.delete('C');

console.log(desserts);

// 循环

desserts.forEach(dessert =>{

console.log(dessert);

});

// 清空

desserts.clear();

console.log(desserts);

输出

Set(4) [ "A", "B", "C", "D" ]

4

true

Set(3) [ "A", "B", "D" ]

A

B

D

Set []

 

29.Map

如果需要键值对项目,可以使用对象,一个对象可以包含多个项目,每一个项目都有一个名字,还有和它对应的值,不过使用对象可能会有冲突,比如不能使用对象作为项目的名字。

可以使用Map组织键值对数据

let food = new Map();

let fruit = {},cook = function(){},dessert = '甜点';

//将以上变量作为项的名字

food.set(fruit,'lemon');

food.set(cook,'x');

food.set(dessert,'o');

 

console.log(food);

console.log(food.size);

console.log(food.get(fruit));

food.delete(dessert);

console.log(food.has(dessert));

food.forEach((value,key) =>{

console.log(`${key} = ${value}`);

});

输出

Map(3) { {} → "lemon", cook() → "x", "甜点" → "o" }

3

lemon

false

[object Object] = lemon

function(){} = x

 

 

posted @ 2019-04-16 23:13  f7r  阅读(173)  评论(0编辑  收藏  举报