Область видимости, циклы, структуры данных и многое другое

В этой статье мы собираемся изучить, какие новые функции появились в ES6 и как их использовать, а также рассмотрим быстрые примеры, чтобы понять улучшения по сравнению с ES5. Список новых функций довольно большой, но здесь мы остановимся на некоторых наиболее часто используемых. Мы также узнаем, как использовать передовой опыт в повседневных задачах разработки.

ES9 обсуждается, но ES6 до сих пор полностью не поддерживается всеми браузерами. Вы можете ознакомиться с подробной таблицей совместимости на GitHub. ECMAScript (ES) - это стандарт, а JavaScript - самый популярный язык, используемый для реализации этого стандарта и построения на его основе.

Определение объема

ES6 представляет некоторые долгожданные изменения для решения распространенных проблем с областью видимости JavaScript.

Возьмем пример (ES5):

function myFunction() {
 var myValue = "I am value";
 if (1) {
   let myValue = "I am another value";
   console.log(myValue)
 }
 console.log(myValue)
}

Вывод:
Я другое значение
Я другое значение

Однако я не хочу, чтобы мой внешний оператор console.log (как в приведенном выше примере) печатал значение внутренней переменной. Обычно это нежелательное поведение.

В ES5 есть две области действия: глобальная и функциональная.

Объем

Это просто граница, внутри которой переменная живет или может использоваться.

Например:

function myFunction(){
    var myValue = "Don't touch, I'm a value"
}
console.log(myValue)

Вывод:
ReferenceError: myValue не определено.

И это потому, что мы пытаемся получить доступ к значению переменной myValue вне ее области видимости. Хотя в ES5 этого можно было добиться, используя IIFE, это не так просто.

В ES6 введено ключевое слово let, имеющее локальную область видимости (да, в следующем разделе есть другое).

let не является заменой var, но считается хорошим стандартом программирования в ES6 и TypeScript, потому что он делает области переменных предсказуемыми и упрощает рассуждение.

Машинопись

Стандартный язык ES6, extension.ts

Давайте посмотрим, как это решит более раннюю проблему (ы) (ES6).

function myFunction() {
 var myValue = "I am value";
 if (1) {
   let myValue = "I am another value";
   console.log(myValue)
 }
 console.log(myValue)
}

Вывод:
Я другая ценность
Я ценность

Вы должны чувствовать себя успешным !! Теперь попробуйте цикл, используя let для себя.

const

Еще одно интересное дополнение - const. const обеспечивает механизм неизменности, что означает, что переменные не меняются с течением времени.

Например:

const myConst = "my const value";
myConst = "my another const value";
Output:
VM47:1 Uncaught SyntaxError: Identifier 'myConst' has already been declared
    at <anonymous>:1:1

Перед любым аргументом я бы добавил, что переменная неизменна, но не значение, которому она присвоена. Это означает, что если мы объявим объект как const, мы сможем изменить свойства этого объекта.

Например:

const myConstObject = {};
myConstObject.constProp = "Const Value";
console.log(myConstObject)
		
Output:
	{constProp: "Const Value"}

Зацикливание

Если вы часто используете for…in foreach циклы, возможно, вы скептически относитесь к введению for…of, но поверьте мне, он вам понравится!

Итак, почему прибыл for…of? Определенно у for…of есть что-то лучше, чем for…in. Давай проверим.

Для… в (ES5)

var myCoins = [1,2,5,10];
for( let coin in myCoins){
	console.log(typeof(coin));
}
			
Output:
	string
	string
	string
	string

Да, вы правильно прочитали. for…in цикл возвращает числовой массив в виде строковых значений. Это, очевидно, может сбивать с толку и создавать ошибки, которые трудно отследить.

Для и для каждого (ES5)

Давайте посмотрим на базовый пример, чтобы показать, как работает forEach:

var myCoins = [1,2,5,10,20]
myCoins.forEach(function(value){
console.log(value);
});
Output:
1,2,5,10,20

Да, верно, здесь нет проблем с преобразованием числа в строку. Но есть проблема. Вы не можете выйти из цикла с помощью оператора break и перейти к следующей итерации с помощью оператора continue.

для… из

Представленный в ES6, for…of позволяет избежать проблем, связанных с циклом for…in, он работает с операторами break и continue и даже позволяет выполнить возврат из включающего блока.

var myCoins = [1,2,5,10];
for( let coin of myCoins){
	console.log(typeof(coin));
}
			
Output:
	number
	number
	number
	number

Структуры данных

Начнем с наиболее часто используемых, например Set и Map.

Установленный

Давайте быстро рассмотрим некоторые важные пункты, касающиеся Set.

  • Вы не храните пары ключ-значение, как объекты в Set, только ключи.
  • Никакие повторяющиеся значения не содержат отдельных элементов / объектов.

Пример:

let myCoinSet = new Set();
myCoinSet.add('foo');
myCointSet.size
// 1
myCoinSet.add('foo');
myCoinSet.size
//1

Set получает на вход итерационные параметры. Пример:

let myCoinSet = new Set([1, 2, 3]) - correct
let myCoinSet = new Set(1,2,3) -wrong

Или вы можете сделать что-то вроде:

Let myCoinSet = new Set();
myCoinset.add(1) -correct
myCoinSet.add(1,2,4) -wrong
myCoinSet.add([1,4,5]) -wrong

Set не поддерживает доступ к элементам в произвольном порядке, как это делают массивы. Например:

console.log(myCoinSet[1]) -wrong

Некоторые общие операции Set:

  • Удалить элемент: myCoinSet.delete(2).
  • Очистите набор: myCoinSet.clear();

Перебрать Set довольно просто. Например:

let myCoinSet = new Set([1, 2, 5, 10])		
for (let coin in myCoinSet){
console.log(coin)
}
Output:
	1, 2, 5, 10

карта

Давайте быстро рассмотрим некоторые из важных пунктов на карте.

  • Карта - это пара "ключ-значение".
  • Порядок поддерживается по мере их сохранения, поэтому, когда мы помещаем цикл, он печатается в том же порядке.

Давайте проделаем несколько основных операций, используя Map.

Создание Map:

let myMap = new Map();

Добавление пар:

let myMap = new Map();
myMap.set("Name", "Carlos")
myMap.set("Occupation", "Engineer" )

Другой способ добавления:

let myMap = new Map([
 [ "Name", "Alex" ],
 [ "Occupation", "Test Engineer" ],
 [ "Company", "Modus Create" ]
]);

Получить элемент по ключу:

map.get("Name")
// Carlos

Проверка наличия ключа:

map.has(“Name”)
//true

Удаление по ключу:

map.delete(“Name”)

Проверка размера:

map.size()

Очистить всю карту:

map.clear()

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

let m = new Map([
 ["Name", "Chris"],
 ["Occupation", "Technical Manager"],
 ["Company", "Modus Create"],
 ["Country", "USA"]
]);
1-	for(let keys of m.keys()){
	console.log(keys)
	}

Выход:

значение: Имя Ключ: Крис
значение: Профессия Ключ: Технический менеджер
значение: Ключ компании: Способ создания
значение: Ключ страны: США

Чем объекты отличаются от карты

В объектах вы обязаны использовать простые ключи в виде строк, чисел или символов, но в Map вы можете использовать даже массивы и объекты.

Карта - это экземпляр объекта, а не наоборот.

Функции как значения невозможны в Map, но в Object это возможно. Пример:

var person = {
 name: "Carlos",
 workingDays() {
   console.log("25 days average")
 }
}

Использование объектов предпочтительнее Map, если в вашем приложении много операций с JSON.

Каков ваш опыт использования объектов и Maps? Поделитесь своими сценариями, в которых один из них более эффективен, чем другой. Какую проблему нельзя было решить одним, а другим - нет?

В ES6 есть еще много интересных и продвинутых функций, таких как функция жирной стрелки, деструктурирование, модули, классы, интерфейсы, обещания и типы. На этом тема не заканчивается. Поищите вторую часть этой темы в одной из следующих статей.

Пожалуйста, оставьте свои ценные комментарии и предложения по этому поводу.