Рекомендуемое скорочтение | ES6 предлагает быструю грамотность

JavaScript
Рекомендуемое скорочтение | ES6 предлагает быструю грамотность

Эта статья написанаyanglbme Оригинал, впервые опубликован в "Наггетс", несанкционированное воспроизведение запрещено.

ES6, также называемыйECMAScript2015, который не является текущим стандартом для JavaScript, но широко используется в практике программирования. Если вы еще не использовали ES6, еще не поздно проверить его вместе со мной.

1. let/const

Разница между var и let

  • var
function testVar() {
    var a = 10;
    if (true) {
        var a = 20;
        console.log(a);  // 20
    }
    // 在外部也生效
    console.log(a);   // 20
}

testVar();
  • let
function testLet() {
    let a = 10;
    if (true) {
        let a =  20;
        // 仅在当前作用域生效
        console.log(a);  // 20
    }
    console.log(a);  // 10
}

testVar();

const

  • Постоянное значение не может быть изменено
const x = 100;

// 这里会报错
x = 1000;  // Uncaught TypeError: Assignment to constant variable.
  • Элементы массива могут быть добавлены нажатием
const arr = []
arr.push(1)
arr.push("2")

// 正常打印
console.log(arr)  // [1, "2"]

2. Строка шаблона

В строках шаблона используются обратные кавычки ` (символ над клавишей Tab) вместо двойных и одинарных кавычек в обычных строках. Строки шаблона могут содержать определенный синтаксис${expression}заполнитель. Выражение в заполнителе вместе с окружающим текстом передается функции по умолчанию, которая отвечает за соединение всех частей вместе.

Сцена 1

Многострочная строка.

традиционная реализация 1

// 这里是使用单引号 '
console.log('string text line 1\n' +
'string text line 2');
// "string text line 1
// string text line 2"

Реализация ES6 1

// 注意是使用反引号 `
console.log(`string text line 1
string text line 2`);
// "string text line 1
// string text line 2"

сцена 2

Вставить выражение.

Традиционная реализация 2

var a = 5;
var b = 10;
console.log('Fifteen is ' + (a + b) + ' and\nnot ' + (2 * a + b) + '.');
// "Fifteen is 15 and
// not 20."

Реализация ES6 2

let a = 5;
let b = 10;
console.log(`Fifteen is ${a + b} and
not ${2 * a + b}.`);
// "Fifteen is 15 and
// not 20."

сцена 3

Вложенные шаблоны.

Традиционная реализация 3

var classes = 'header'
classes += (isLargeScreen() ?
   '' : item.isCollapsed ?
     ' icon-expander' : ' icon-collapser');

Реализация ES6 3

const classes = `header ${ isLargeScreen() ? '' :
    (item.isCollapsed ? 'icon-expander' : 'icon-collapser') }`;

3. Стрелочные функции

Что делает функция стрелки:

  • Упрощенный код
  • измените это, чтобы указать на

Сцена 1

Добавьте два числа.

традиционная реализация 1

var add = function(a, b) {
    return a + b;
}

Реализация ES6

const add = (a, b) => a + b;

сцена 2

Элементы массива дублируются.

Традиционная реализация 2

var original = [2, 4, 8, 16];
var double = original.map(function (e) {
    return e * 2;
});
console.log(double);

Реализация ES6 2

const original = [2, 4, 8, 16];
const double = original.map(e => e * 2);
console.log(double);

сцена 3

Измените этот пункт.

Традиционная реализация 3

var team = {
    members: ["bingo", "alex"],
    teamName: "ES6",
    teamSummary: function() {
        let self = this;
        return this.members.map(function (e) {
            return `${e}隶属于${self.teamName}小组`;
        })
    }
    // 或者使用bind绑定的方式
}
console.log(team.teamSummary())

Реализация ES6 3

const team = {
    members: ["bingo", "alex"],
    teamName: "ES6",
    teamSummary: function() {
        return this.members.map(e => `${e}隶属于${this.teamName}小组`);
    }
}
console.log(team.teamSummary())

4. Усовершенствованные литералы объектов

Одним из преимуществ улучшения литералов объектов является упрощение кода. В приведенном ниже примере закомментированный раздел используется до упрощения.

function createBookShop(inventory) {
    return {
        // inventory: inventory,
        inventory,
        // inventoryValue: function() {
        inventoryValue() {
            return this.inventory.reduce((total, book) => total + book.price, 0);
        },
        // priceForTitle: function(title) {
        priceForTitle(title) {
            return this.inventory.find(book => book.title === title).price;
        }
    }
}

const inventory = [
    { title: "Vue.js", price: 20 },
    { title: "React.js", price: 19 },
]

const bookShop = createBookShop(inventory);
console.log(bookShop.inventoryValue());
console.log(bookShop.priceForTitle("Vue.js"));

5. Значение функционального параметра по умолчанию

function request(url, method="GET") {
    // ...
    console.log(method);
}

request("google.com", "POST");

Вышеприведенное использует значение параметров функции ES6 по умолчанию, посмотрите на приведенный выше код, если вы используете Babel для преобразования, что вы получите:

"use strict";

function request(url) {
  var method = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "GET";
  // ...
  console.log(method);
}

request("google.com", "POST");

Как видите, используя значения параметров функции ES6 по умолчанию, код можно значительно упростить.

6. Оператор спреда

Оператор спреда, также называемый оператором спреда, с ним мы можем работать с массивами быстрее и удобнее.

// 不固定参数个数
function total(...numbers) {
    return numbers.reduce((sum, number) => sum + number, 0);
}

console.log(total(2, 4, 6, 8))  // 4个参数,20
console.log(total(1, 2, 3, 4, 5));  // 5个参数,15

Посмотрите на другой пример:

let colors1 = ["red", "orange"];
let colors2 = ["blue", "white", "green"];

let totalColors = ["black", ...colors1, ...colors2];
console.log(totalColors);  // ["black", "red", "orange", "blue", "white", "green"]

7. Деконструкция

Сцена 1

Деструктуризация объектов.

let user = {
    name: "Amy",
    age: 20,
    college: "szu"
}

традиционная реализация 1

function print(user) {
    console.log(`${user.name}的年龄是${user.age}`);
}

print(user);  // Amy的年龄是20

Реализация ES6 1

function print({ name, age, college }) {
    console.log(`${name}的年龄是${age}`);
}
print(user);  // Amy的年龄是20

сцена 2

Разрушение массива.

const names = ["Bingo", "Iris", "Alex"];

const [name1, name2, name3] = names;
console.log(name1, name2, name3);  // Bingo Iris Alex

// 返回数组个数
const { length } = names;
console.log(length);  // 3

// 结合展开运算符
const [name, ...rest] = names;
console.log(name);  // Bingo
console.log(rest);  // ["Iris", "Alex"]

сцена 3

Преобразование массива в объект.

const points = [
    [4, 5],
    [1, 2],
    [3, 6],
];

let res = points.map(([x, y]) => {
    return { x, y };
})
console.log(res);  //  [{…}, {…}, {…}]

8. Объектно-ориентированный класс

Сцены

Создавайте объекты и реализуйте наследование.

традиционная реализация

// 首字母大写
function Car(options) {
    this.title = options.title;
}

Car.prototype.drive = function() {
    return "Vroom";
}

var car = new Car({ title: "BMW" });
console.log(car);
console.log(car.drive())

// 继承
function Toyota(options) {
    // 通过Car调用call()方法
    Car.call(this, options);
    this.color = options.color;
}

// 不容易理解
Toyota.prototype =  Object.create(Car.prototype);
Toyota.prototype.constructor = Toyota;

var toyota = new Toyota({ color: "red", title: "Focus" });
console.log(toyota.title);  // Focus
console.log(toyota.drive());  // Vroom

Реализация ES6

class Car {
    constructor({ title }) {
        this.title = title;
    }

    drive() {
        return "Vroom";
    }
}

const car = new Car({ title: "BMW" });
console.log(car);
console.log(car.drive())

// 继承
class Toyota extends Car {
    constructor({ title, color }) {
        super({ title });
        this.color = color;
    }
}

const toyota = new Toyota({ color: "red", title: "Focus" });
console.log(toyota)  // Focus
console.log(toyota.drive())  // Vroom

9. генератор генератор

Сцены

Последовательность Фибоначчи.

традиционная реализация

function fib(max) {
    var a = 0, b = 1, arr = [0, 1];
    while (arr.length < max) {
        [a, b] = [b, a + b];
        arr.push(b);
    }
    return arr;
}

console.log(fib(5))

Реализация ES6

// 注意,function后加多了个*
function* fib(max) {
    let a = 0, b = 1, n = 0;
    while (n < max) {
        // 使用yield关键字
        yield a;
        [a, b] = [b, a + b];
        ++n;
    }
    return;
}

// 使用for..of遍历
for (let x of fib(10)) {
    console.log(x);
}

10. Новая структура данных Карта

Ключи на карте могут быть любого типа, напримерfunction(),{},stringЖдать.

const map = new Map();

const key1 = 'some string',
      key2 = {},
      key3 = function() {};

// 为key设置value
map.set(key1, 'Value of key1');
map.set(key2, 'Value of key2');
map.set(key3, 'Value of key3');

console.log(map.get(key1))
console.log(map.get(key2))
console.log(map.get(key3))

// 使用for..of遍历
for (let [key, value] of map) {
    console.log(`${key}=>${value}`);
}

// 只获取key
for (let key of map.keys()) {
    console.log(key);
}

// 只获取value
for (let value of map.values()) {
    console.log(value);
}

// 使用forEach遍历
map.forEach((key, value) => {
    console.log(`${key}=>${value}`);
})

11. Новая структура данных Set

Наборы могут хранить любой тип уникальных данных.

const set = new Set();
set.add({name: "bingo"});
set.add(100);
set.add(true);
set.add(100);
console.log(set);  //  {{…}, 100, true}

console.log(set.size)  // 3
console.log(set.has(100));  // true
console.log(set.has({name: "bingo"})) //  匹配的是地址,false

set.delete(100);

// 使用for..of遍历
for (let item of set) {
    console.log(item);
}

// 使用forEach遍历
set.forEach(e => {
    console.log(e);
})

// 将set转换为array
const setArray = Array.from(set);
console.log(setArray);

12. Promise

Три состояния Обещания:

  • нерешенный: ожидание завершения задачи;
  • решено: задача выполнена без проблем;
  • отклонено: Задача была выполнена, но возникла проблема.

Сцены

Сгенерируйте случайное число от 0 до 2, если оно меньше 1, оно вернет успех после ожидания в течение определенного периода времени, в противном случае оно вернет отказ.

let promise = new Promise((resolve, reject) => {
    var timeout = Math.random() * 2;
    setTimeout(() => {
        if (timeout < 1) {
            resolve("success:ok");
        } else {
            reject("error:timeout");
        }
    }, timeout * 1000);
});

promise
    .then(res => console.log(`成功:${res}`))
    .catch(res => console.log(`失败:${res}`))

В случае успеха выполнить then, в случае неудачи выполнить catch.

13. fetch

Сцены

Отправьте сетевой запрос для получения данных.

Ниже приведен базовый запрос на выборку,fetch()Возвращает обещание (объект Response), содержащее результат ответа:

fetch('https://jsonplaceholder.typicode.com/posts/1')
    .then(resp => resp.json())
    .then(res => console.log(res))

fetch()Поддерживается второй необязательный параметр, объект инициализации, который может управлять различными конфигурациями:

postData('https://jsonplaceholder.typicode.com/posts/1', {answer: 42})
  .then(data => console.log(data)) 
  .catch(error => console.error(error))

function postData(url, data) {
  return fetch(url, {
    cache: 'no-cache', 
    credentials: 'same-origin',
    headers: {
      'user-agent': 'Mozilla/4.0 MDN Example',
    },
    method: 'GET', // *GET, POST, PUT, DELETE, etc.
    mode: 'cors', // no-cors, cors, *same-origin
    redirect: 'follow', // manual, *follow, error
    referrer: 'no-referrer', // *client, no-referrer
  })
  .then(response => response.json()) // parses response to JSON
}

14. async/await(ES7)

async/awaitЛучшее асинхронное решение в JavaScript.

async function getUsers() {
    const resp = await fetch('https://jsonplaceholder.typicode.com/users');
    const data = await resp.json();
    return data;
}

// async 返回一个 Promise 对象,因此可以调用 then 获取结果。
getUsers().then(users => console.log(users));

Выше, закончено.

яДокументы технического сообщества GitHubИнициатор, добро пожаловать в мой публичный аккаунт WeChat «Сообщество открытого исходного кода Doocs», оригинальные технические статьи будут размещены как можно скорее.