Согласно Википедии, JavaScript, часто обозначаемый аббревиатурой JS, является языком программирования, который соответствует спецификации ECMAScript. JavaScript - это высокоуровневый, часто скомпилированный точно в срок и мультипарадигмальный. Он имеет синтаксис фигурных скобок, динамическую типизацию, объектную ориентацию на основе прототипов и функции первого класса.
После ECMAScript 6 (ES6) сам JavaScript сильно изменился в истории языка. В этой статье я покажу вам интересные вещи, которые на самом деле делают нашу жизнь проще, чем раньше.
Итак, приступим!
Вот список из 10 функций, которые, я думаю, мне нужно обсудить в этом блоге, которые могут помочь вам понять.
- Подъем переменных
- Связывание блоков: Let и Const
- Параметры по умолчанию
- Параметры покоя и спреда
- Стрелочные функции
- Деструктурирующее назначение
- Обещания
- Классы
- Расширенные литералы объектов
- Шаблонные литералы
- Подъем переменных
Подъем - это механизм поведения по умолчанию в JavaScript, в котором объявления variable
и function
перемещаются в верхнюю часть текущей области перед выполнением кода.
Мы можем видеть в жизненном цикле обработки переменных JavaScript, что есть три части, такие как объявление, инициализация или присвоение и использование, как на следующем рисунке.
Мы не можем использовать или инициализировать какие-либо variable
перед объявлением, а также это должно поддерживаться на уровне области видимости.
var a = 5;
function hoisting() { a = 1; var b = 2; } hoisting(); console.log(a); /* This is valid and considerable as a global variable outside hoisting() function Result is 1 */
console.log(b); // Error /* This is not accessible as a global variable because it is declared inside hoisting() scope */
Давайте посмотрим на другой пример объявления function
.
// function declaration function student(name, id) { return `Name is ${name} and id is ${id}`; } let result = student('Mostafa', 101); console.log(result); // Name is Mostafa and id is 101
Это обычная функция, которая хорошо работает. Он также будет хорошо работать, если я объявлю function
после вызова function
из-за самого его объявления, а не выражения. Давайте посмотрим.
let result = student('Mostafa', 101); console.log(result); // Name is Mostafa and id is 101 // function declaration function student(name, id) { return `Name is ${name} and id is ${id}`; }
Но теперь, если я назначу функцию для variable
, она будет считаться function expression
и не будет использоваться до инициализации.
let result = student('Mostafa', 101); console.log(result); // Name is Mostafa and id is 101 // function expression const student = (name, id) => { return `Name is ${name} and id is ${id}`; } // Uncaught ReferenceError: Cannot access 'student' before initialization
Здесь ученик - это переменная aconst
, но она используется перед инициализацией. Итак, он возвращает areference error
.
Но теперь, если я сначала инициализирую студентов, а затем использую его, он станет доступным. Давайте посмотрим!
// function expression const student = (name, id) => { return `Name is ${name} and id is ${id}`; } let result = student('Mostafa', 101); console.log(result); // Name is Mostafa and id is 101
2. Связывание блоков: Var, Let и Const
Объявления переменных сvar
рассматриваются так, как если бы они находились наверху function
, или они рассматриваются как глобальная область видимости, если они объявлены вне function
.
Чтобы получить четкое представление об этом, рассмотрим следующее определение функции:
function getName(name) {
if (name) {
var result = `Hello ${name}`;
return result;
} else {
// result exists here with a value of undefined
return null;
}
// result exists here with a value of undefined
}
Здесь мы видим, что var
объявлен в области действия блока if, которая не является глобальной областью, а в движке JavaScript, за сценой сама функция getName
была изменена на это;
function getName(name) {
var result;
if (name) {
result= `Hello ${name}`;
return result;
} else {
return null;
}
}
Вот почему мы можем получить к нему доступ как в области else
block, так и в области getName
функции. Но это не глобальная переменная, доступная глобально.
Теперь, если мы используем let
вместо var
, ситуация кардинально изменится. Давайте посмотрим на пример,
function getName(name) {
if (name) {
let result = `Hello ${name}`;
return result;
} else {
// result does not exist here
return null;
}
// result does not exist here
}
Это связано с поведением ES6 let
, поскольку движок JavaScript не позволяет поднять let
на верхний уровень текущей области действия блока. Еще одно различие var
иlet
состоит в том, что let
нельзя повторно объявить как var
.
Например,
var num = 1;
let num = 2; // Throw an error
if (condition) { let num = 3; // Does not throw any error
}
Здесь первый let
недоступен из-за num
повторного объявления, но второй let
действителен, потому что он находится в областиif
блока.
3. Параметр по умолчанию
Параметр по умолчанию означает, что когда именованный параметр не передается без значения или undefined,
, он позволяет инициализировать именованные параметры значениями по умолчанию во время объявления функции.
function modulus(a, b) { return a % b;
} modulus(5, 2); // 1 modulus(5); // NaN
Второй результат - NaN
, потому что все требования аргумента не выполнены.
Но когда мы присваиваем значение b
по условию, это работает хорошо.
function modulus(a, b) {
b = (typeof b !== 'undefined') ? b : 2
return a % b; } modulus(5, 2); // 1 modulus(5); // 1
По сути, параметр по умолчанию помогает нам обрабатывать значение NaN
в этом случае, когда пользователь заполняет не все поля ввода.
Давайте посмотрим на реальный пример!
function modulus(a, b = 2) {
return a % b; } modulus(5, 2); // 1 modulus(5); // 5
Думаю, теперь об этом стало яснее.
4. Параметры покоя и спреда
Самая удивительная тема для меня - остальное и распространение, потому что они выглядят совершенно одинаково, но смысл совершенно другой. Синтаксис таков, что (...
) и его представление зависят только от того, где он используется, как он используется. Иногда это сбивает с толку разработчиков, когда это видно во фрагменте кода.
Я буду стараться изо всех сил, чтобы легко показать вам использование в различных ситуациях.
Оператор распространения распаковывает собранные элементы, такие как массивы, в отдельные элементы. Но Rest Operator собирает все оставшиеся элементы в массив или объект.
Например,
const arrOne = [‘I’, ‘love’, ‘Programming’] const arrTwo = [‘Programming’, ‘is’, ‘life’] const arr3 = [arrOne, arrTwo];console.log(arr3); // [ [ ‘I’, ‘love’, ‘Programming’ ], [‘Programming’, ‘is’, ‘life’]]
Это нормальное использование объединения массивов. Теперь я использую Spread (...
) в массиве, чтобы распаковать массив, похожий на [[,,],[,,]]
= ›[,,,,]
const arrThree = [...arrOne, 'and', ...arrTwo] console.log(arrThree); // [ 'I', 'love', 'Programming', 'Programming', 'is', 'life']
Теперь использую rest (...
) на массиве [ ]
// Destructuring arrOne const [idx1, ...restArrValue] = arrOne; console.log(idx1, restArrValue); // I [ 'love', 'Programming' ]
Снова выкладываю для распаковки массива
console.log(idx1, ...restArrValue); // I love Programming
Теперь я покажу вам остальное и расскажу об использовании объекта, значение которого такое же, как и раньше.
Создадим объект как обычно.
const person = { name: 'Mostafa', age: 30, gender: 'male', status: 'developer' }
Теперь я назначаю объекту новое свойство и использую оператор распространения для распаковки объекта person
const updatePerson = { // spread for unpacking the object { { }, { }} ===> { } ...person, degree: 'MSC' } console.log(updatePerson); /* { name: 'Mostafa', age: 30, gender: 'male', status: 'developer', degree: 'MSC' } */
Снова используя оператор rest для обновленного объекта updatePerson
const { name, ...restObjValue } = updatePerson; console.log(name, restObjValue); // Mostafa { age: 30, gender: 'male', status: 'developer' }
Я надеюсь, что использование оператора rest и spread в JavaScript ES6 имеет для вас смысл.
5. Стрелочные функции
Выражение функции стрелки - это компактная альтернатива традиционному выражению функции, но оно ограничено и не может использоваться во всех ситуациях согласно MDN.
Стрелочная функция используется в выражении единственной функции
const add = (num1 = 0, num2 = 2) => { return num1 + num2; } console.log(add(undefined, 1)); // 1 console.log(add(1)); // 3
Вернуть один оператор, фигурные скобки { }
не нужны, и ключевое слово return
const multiply = (num1 = 0, num2 = 2) => num1 * num2; console.log(multiply(undefined, 1)); // 0 console.log(multiply(1)); // 2 const area = (length, width) => length * width; console.log(area(5, 3)); // 15
Когда используется один / только один параметр, нет необходимости использовать скобку ()
const modulus = num1 => num1 % 3; console.log(modulus(1)); // 1 console.log(modulus(3)); // 0
Если параметра нет, используйте скобку ()
const selfItem = () => 1; console.log(selfItem());
Если вы создаете функцию в объекте, нет необходимости использовать стрелочную функцию. Например,
const bio = { name: 'Mostafa', age: 29, profession: 'Web Developer', showBio: function () { console.log(this); /* Here this means the full object itself. Output is: { name: 'Mostafa', age: 29, profession: 'Web Developer', showBio: [λ: showBio] } */ return `This is ${this.name} and I am ${this.age}. I am a ${this.profession}.` } } console.log(bio.showBio()); // This is Mostafa and I am 29. I am a Web Developer.
Все это также случаи использования стрелочной функции в различных углах.
6. Деструктурирующее присвоение
Синтаксис деструктурирующего присваивания означает, что это выражение JavaScript, которое распаковывает значения из массивов или свойства из объектов в другие переменные. Другими словами, деструктуризация - это извлечение значений из массива или свойств из объекта. Вот и все.
Здесь я покажу вам примеры использования как деструктурирования массива, так и деструктурирования объекта. Итак, приступим!
Примеры деструктуризации массива
const myBio = ['Mostafa', 29, 'Web Developer'];
Вы должны поддерживать хронологический порядок в массиве, например:
const [name] = myBio; const [, age] = myBio; const [, , profession] = myBio; console.log(name); // Mostafa console.log(age); // 29 console.log(profession); // Web Developer
Кроме того, вы можете разрушить все переменные в массиве и использовать их
const [name, age, profession] = myBio;
Таким образом, при деструктуризации массива необходимо соблюдать порядок индексных переменных.
Деструктуризация с оператором rest, о которой я говорил выше, выглядит так:
const friendsArray = ['a', 'b', 'c', 'd', 'e'] const [bestFriend, ...averageFriends] = friendsArray; console.log(bestFriend); // a console.log(averageFriends); // [ 'b', 'c', 'd', 'e' ]
Примеры деструктуризации объекта:
const objBio = { userName: 'Mostafa', id: 001, status: 'Developer', shareBio: { facebook: true, twitter: true, } } const { userName, id, status, isMarried} = objBio; console.log(userName, id, status, isMarried); // Mostafa 1 Developer true
Вы можете использовать вложенную деструктуризацию, как показано ниже;
const { shareBio: { facebook, twitter } }= objBio; console.log(facebook, twitter); // true true
Также обратите внимание, что вам не нужно использовать в хронологическом порядке, например, при деструктуризации массива.
Надеюсь, это имеет для вас смысл!
7. Обещания
Одна из самых мощных функций JavaScript - это то, как он справляется с асинхронным программированием самым простым способом. Поскольку JavaScript был инициирован как язык в основном для Интернета, он должен был иметь возможность асинхронно реагировать на действия пользователя, такие как щелчки, наведения, нажатия клавиш и так далее.
Давайте посмотрим на довольно тривиальный пример отложенного асинхронного выполнения с setTimeout()
const processData = () => { setTimeout(() => { console.log(1); // after 1 second setTimeout(() => { console.log(2); // after 2 second setTimeout(() => { console.log(3); // after 3 second }, 1000); }, 1000); }, 1000); } processData();
Чтобы справиться с этой плохой практикой, используется Promise
const promiseData = new Promise((resolve, reject) => { setTimeout(() => { resolve(1); reject(Error('Error...')); }, 1000); }); console.log(promiseData); promiseData.then(data => { console.log(data); }) .catch(error => console.log(error));
8. Классы
Классы JavaScript, представленные в ECMAScript 2015 (ES5), обычно называются синтаксическим сахаром по сравнению с существующим наследованием на основе прототипов JavaScript. Синтаксис класса не вводит в JavaScript новую объектно-ориентированную модель наследования.
Когда класс создается с ключевым словом «new», конструктор запускается автоматически.
class Student { constructor(id, name, age) { this.id = id; this.name = name; this.age = age; this.lang = []; this.country = 'Bangladesh'; } getInfo() { return ` id - ${this.id} name - ${this.name} age - ${this.age} language -${this.lang.join(', ')}`; }
Теперь вы можете создать экземпляр любого объекта, используя этот конструктор класса.
const student1 = new Student(1, 'Mostafa', 29); console.log(typeof (student1)); // object const student2 = new Student(2, 'Mahmud', 30); console.log(student1); /* Student { id: 1, name: 'Mostafa', age: 29, country: 'Bangladesh' } */ console.log(student1.name); // Mostafa
Если вам нужны полные данные, просто позвоните getInfo()
console.log(student1.getInfo());
Это также основная идея конструктора классов в ES6.
9. Расширенные объектные литералы
Литерал объекта JavaScript - это разделенный запятыми список пар имя-значение, заключенный в фигурные скобки. Объектные литералы инкапсулируют данные, заключая их в аккуратный пакет. Это сводит к минимуму использование глобальных переменных, которые могут вызвать проблемы при объединении кода.
Если свойство и значение имеют одно и то же имя, нет необходимости использовать повторно
function bio({ firstName, lastName, coveredField }) { return { firstName, lastName, commonLang: ['html', 'css', 'js', 'c', 'c++']; coveredField() { return `My first name is ${this.firstName}, second name is ${this.lastName} and I covered ${coveredField} `; } } } const myBio = bio({ firstName: 'Mostafa', lastName: 'Mahmud', coveredField: 'ES6' }); console.log(myBio.firstName); // Mostafa console.log(myBio.commonLang); // ['html', 'css', 'js', 'c', 'c++'] console.log(myBio.coveredField()); // My first name is Mostafa, second name is Mahmud and I covered ES6
10. Шаблонные литералы
Согласно MDN, шаблонные литералы - это строковые литералы, допускающие встроенные выражения. С ними можно использовать многострочные строки и функции интерполяции строк .
Вот пример практического использования:
const firstName = 'Mostafa'; const profession = 'developer'; const workField = 'wep application' function modify(strings, ...restValues) { console.log(arguments); // all data (static and dynamic) in [[array], array] console.log(strings, restValues); // divided array in output [static data array], [dynamic data array] let str = ''; strings.forEach((string, i) => { str += `${string} <b> ${restValues[i] || ''}</b>`; }); return str; }
Шаблонные литералы с тегами ES6 для изменения динамических данных в строке шаблона. Функции тегов modify()
даже не должны всегда возвращать строку!
const html = modify ` <h1> This is ${firstName.toUpperCase()}</h1> <p> I am a ${profession}</p> <p> I am working on ${workField}</p> ` document.body.innerHTML = html;
Это все о важных функциях ES6, с которыми разработчики сталкиваются и изучают в своей жизни программирования на JavaScript.
Если эта статья была вам полезна, не хлопайте по ней.
Наслаждайтесь кодированием!