С 2015 года JavaScript значительно улучшился.

Пользоваться им сейчас намного приятнее, чем когда-либо.

В этой статье мы рассмотрим основные функции JavaScript.

Функциональные выражения для стрелочных функций

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

Это упрощает и упрощает создание новых функций.

Например, вместо написания:

function Button() {
  var _this = this;
  var button = document.getElementById('myButton');
  button.addEventListener('click', function() {
    console.log('clicked');
    _this.handleClick(); 
  });
}
Button.prototype.handleClick = function () {
  //···
};

Мы создаем переменную _this и устанавливаем ее значение this вне функции, чтобы мы могли использовать ее в прослушивателе click.

Это не идеально, поскольку мы можем легко спутать разные значения this с разных уровней.

С помощью стрелочных функций мы можем написать:

function Button() {
  const button = document.getElementById('button');
  button.addEventListener('click', () => {
    console.log('clicked');
    this.handleClick();
  });
}

Мы просто передаем функцию стрелки и можем использовать значение this из функции Button.

Нам не нужно устанавливать Button ‘s this на переменную перед ее использованием.

Стрелочные функции отлично подходят для обратных вызовов, возвращающих выражение.

Например, вместо того, чтобы писать:

var arr = [1, 2, 3];
var cubes = arr.map(function (x) { return Math.pow(x, 3) });

Мы пишем:

const arr = [1, 2, 3];
const cubes = arr.map(x => x ** 3);

Он намного короче и чище.

Множественные возвращаемые значения

С современным JavaScript мы можем легко обрабатывать несколько возвращаемых значений.

Мы можем вернуть объект или массив и преобразовать записи в переменные.

До ES6 не было назначения деструктуризации, поэтому мы должны написать что-то вроде:

var matchObj =
  /^(\d\d\d)-(\d\d\d)-(\d\d\d\d)$/
  .exec('222-112-2222');
var areaCode = matchObj[1];
var officeCode = matchObj[2];
var stationCode = matchObj[3];

С ES6 или новее мы можем написать:

const matchObj =
  /^(\d\d\d)-(\d\d\d)-(\d\d\d\d)$/
  .exec('222-112-2222');
const [_, areaCode, officeCode, stationCode] = matchObj;

Мы использовали деструктурирование для присвоения каждой записи переменной.

Это позволяет нам сэкономить много строк кода.

Несколько возвращаемых значений через объекты

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

Например, мы можем написать:

const obj = {
  foo: 'bar'
};
const {
  writable,
  configurable
} =
Object.getOwnPropertyDescriptor(obj, 'foo');

Мы получаем свойства writable и configurable из метода getOwnPropetyDescriptor и назначаем их переменным.

С for и с forEach() по for-of

Цикл for-of может проходить через любой итерируемый объект.

Он менее универсален, чем for, но быстрее и универсален, чем forEach.

forEach доступны только с массивами и ноделистами.

Чтобы использовать цикл for, мы пишем:

var arr = ['a', 'b', 'c'];
for (var i = 0; i < arr.length; i++) {
  var letter = arr[i];
  console.log(letter);
}

С forEach мы можем написать:

var arr = ['a', 'b', 'c'];
arr.forEach(function(letter) {
  console.log(letter);
});

С помощью for-of мы можем написать:

const arr = ['a', 'b', 'c'];
for (const [index, letter] of arr.entries()) {
  console.log(index, letter);
}

Как мы видим, мы можем использовать деструктурирование с помощью цикла for-of.

Это недоступно для других петель или forEach.

Поскольку arr.entries() возвращает массив, каждая запись которого является массивом с индексом и записью, мы можем получить их обе с помощью деструктуризации.

Заключение

Современный JavaScript имеет отличные возможности, включая деструктуризацию и цикл for-of.

JavaScript на простом английском языке

Вы знали, что у нас есть три публикации и канал на YouTube? Найдите ссылки на все на plainenglish.io!