Изучение современных возможностей JavaScript: ES6 и далее
Как вы, возможно, уже знаете, JavaScript — это интерпретируемый, мультипарадигмальный язык программирования высокого уровня, соответствующий спецификации программирования ECMAScript. Его синтаксис основан на языках Java и C — многие структуры из этих языков применимы и к JavaScript.
В этой статье мы рассмотрим современные возможности JavaScript. Мы поговорим о том, как лучше писать код, используя синтаксис, который обычно используется разработчиками — синтаксис ES6, а также о других версиях, появившихся после ES6.
Внедрение современных функций JavaScript не только сделало язык более мощным, но и упростило его синтаксис, сделав код JavaScript чище, эффективнее и проще для понимания.
ES6 (ECMAScript 2015)
В синтаксисе ES6 реализовано множество возможностей, но в рамках этой статьи мы рассмотрим несколько ключевых.
1. let и const
До появления ES6 мы использовали ключевое слово var
для объявления переменных. Использование var
усложняет написание кода, поскольку игнорирует область видимости блока, в котором было сделано объявление, рассматривая его как несуществующее. Давайте посмотрим на код.
function num() {
for(var i = 0; i < 5; i++) {
console.log(i)
};
};
num()
0
1
2
3
4 //Output
Мы изменим приведенный выше код, добавив console.log(i)
за пределами блока, и посмотрим, что он выведет.
function num() {
for(var i = 0; i < 5; i++) {
console.log(i)
};
console.log(i)
};
num();
0
1
2
3
4
5 //Output
В цикле for
console.log(i)
по-прежнему выводит значения 0 - 4
. После завершения цикла i
все еще доступен вне области видимости, которая выводит 0 - 5
перед проверкой и выходом из условия.
Объявление var
не соблюдает область видимости блока, то есть i
остается в области видимости даже после завершения цикла. В этой ситуации лучше использовать ключевое слово let
для более эффективного кода.
function num() {
for(let i = 0; i < 5; i++) {
console.log(i)
};
};
num();
Если console.log
объявлен вне области видимости блока цикла for
, в консоли будет разобрана ошибка и выведено сообщение ReferenceError
.
В случае использования ключевого слова const
. При объявлении переменной с помощью const
она не может быть переназначена. Они называются константами, поэтому являются неизменяемыми. let
также может использоваться для переназначения переменных, поэтому они являются изменяемыми.
let x = 2;
x = 1;
console.log(x);
1 //Output
Если заменить let
на const
, в консоль будет выведена ошибка.
const x = 2;
console.log(x);
2 //Output
x
- это константа.
2. Объекты
С точки зрения объектно-ориентированного программирования, когда функция находится внутри объекта, мы называем этот объект Method
.
//ES5
const personalInfo = {
name: 'Michael Unah',
gender: 'Male',
address: function () {
return {
city: 'Abuja',
country: 'Nigeria',
};
}
};
console.log(personalInfo.name);
console.log(personalInfo.address());
console.log(personalInfo.address().city);
Используя этот синтаксис, мы пишем меньше кода.
//ES6
const personalInfo = {
name: 'Michael Unah',
gender: 'Male',
address () {
return {
city: 'Abuja',
country: 'Nigeria',
};
},
};
console.log(personalInfo.name);
console.log(personalInfo.address());
console.log(personalInfo.address().city);
3. Стрелочные функции
//ES5
const tasks = [
{ id: 1, isActive: true },
{ id: 2, isActive: true },
{ id: 3, isActive: false }
];
const activeTasks = tasks.filter( function(tasks) {
return tasks.isActive;
});
console.log(activeTasks);
Это делает код более чистым и уменьшает количество шума в нем.
//ES6
const tasks = [
{ id: 1, isActive: true },
{ id: 2, isActive: true },
{ id: 3, isActive: false }
];
const activeTasks = tasks.filter(tasks => tasks.isActive);
console.log(activeTasks);
4. Array.Map()
В ES6 появился новый метод под названием map
. Он используется для вывода списка элементов.
const colors = ['red', 'green', 'purple'];
const items = colors.map(colors => `<li>${colors}</li>`);
console.log(items);
5. Деструктуризация объектов
//ES5
const address = {
street: 'Saburi 1',
city: 'Abuja',
country: 'Nigeria'
};
const street = address.street;
const city = address.city;
const country = address.country;
console.log(street);
console.log(city);
console.log(country);
//ES6
const address = {
street: 'Saburi 1',
city: 'Abuja',
country: 'Nigeria'
};
const { street: st, city: cy, country: ct} = address;
console.log(st);
console.log(cy);
console.log(ct);
6. Оператор разброса
//ES5
const first = [1, 2, 3];
const second = [4, 5, 6];
const combined = first.concat(second);
console.log(combined);
//ES6
const first = [1, 2, 3];
const second = [4, 5, 6];
const combined = [...first, ...second];
console.log(combined);
7. Шаблонные литералы
//ES5
let firstName = 'Michael';
let lastName = 'Unah';
let fullName = firstName + ' ' + lastName;
console.log(fullName);
//ES6
let firstName = 'Michael';
let lastName = 'Unah';
let fullName = `${firstName} ${lastName}`;
console.log(fullName);
Шаблонные литералы также можно использовать для определения свойств объекта.
const personalInfo = {
address() {
return {
city: 'Abuja',
street: 'Saburi 1',
country: 'Nigeria'
};
},
};
const myAddress = `${ city.address() } ${ street.address() } ${ country.address() }`;
console.log(myAddress)
8. Классы
class Product {
constructor(name, price ){
this.name = name;
this.price = price;
};
displayProduct(){
console.log(`product: ${this.name}`);
console.log(`price: $${this.price}`);
};
};
const product1 = new Product('shirt', 20);
product1.displayProduct();
До появления классов ES6 классы не поддерживались в старых версиях JavaScript. Объектно-ориентированное программирование осуществлялось с помощью функции конструктора и свойства прототипа.
9. Ключевое слово this
Ключевое слово this
даёт ссылки на объект, выполняющий текущую функцию.
const product = {
name: 'Airforce 1',
price: '$200',
priceTag() {
console.log(`${ this.name }: ${ this.price }`)
},
};
product.priceTag();
10. Промисы
В этой версии JavaScript появился более мощный и гибкий способ обработки асинхронных операций по сравнению со старым подходом, основанным на обратном вызове.
const myPromise = new Promise((resolve, reject) => {
// Simulating an asynchronous operation using setTimeout
setTimeout(() => {
const success = true; // Simulate a successful operation
if (success) {
resolve('Operation was successful!');
} else {
reject('Operation failed.');
}
}, 1000);
});
// Using the Promise
myPromise
.then((message) => {
console.log(message); // Output: Operation was successful!
})
.catch((error) => {
console.error(error);
});
Промисы обеспечивают более чистый и удобный для чтения способ обработки асинхронных операций.
11. Асинхронные функции
async await
были введены в ECMAScript 2017(ES8). Эти ключевые слова позволяют писать асинхронный код, который выглядит синхронным, что облегчает его чтение и сопровождение. Они построены на основе промисов и помогают упростить работу с асинхронными операциями.
Используя async await
, мы можем сделать наш код похожим на синхронный.
// A function that returns a promise
const fetchData = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Data fetched successfully!');
}, 1000);
});
}
// An async function that uses await
const getData = async () => {
try {
const result = await fetchData(); // Waits for the promise to resolve
console.log(result); // Output: Data fetched successfully!
} catch (error) {
console.error(error);
}
}
// Calling the async function
getData();
Заключение
В этой статье мы рассмотрели некоторые из наиболее часто используемых функций, появившихся в ES6 и последующих версиях. Эти возможности, такие как стрелочные функции, шаблонные литералы, Promises и async
/await
, значительно улучшили то, как мы пишем и управляем кодом JavaScript. Приняв эти современные усовершенствования, разработчики могут писать более чистый, эффективный и удобный в обслуживании код. Поскольку JavaScript продолжает развиваться, постоянное знакомство с этими возможностями необходимо для создания надежных и высокопроизводительных приложений. Продолжайте изучать и использовать возможности современного JavaScript в своих проектах.