zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    结构体初始化所遇到的问题
    字符串赋值注意事项
    C语言可变参数 "..."
    typedef 定义指针数组和数组指针及其使用。
    指针函数、指针数组、函数指针、数组指针、函数指针数组。
    前端回血day24 flex子项伤的CSS属性
    Fiddler使用
    一句话“截流”和“防抖”
    django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.
    Linux
  • 原文地址:https://www.cnblogs.com/fanner7/p/10720823.html
Copyright © 2011-2022 走看看