Откройте для себя функциональный JavaScript был назван одним из Лучшие новые функциональные программирования книги BookAuthority Действительно
ES6 приносит больше функций на язык JavaScript. Некоторые новые синтаксис позволяют писать код более выразительным способом, некоторые функции завершают функциональный набор инструментов программирования, а некоторые функции сомнительны.
Пусть и const.
Существует два способа объявления переменной ( Пусть и const ) Плюс тот, который стал устаревшим ( var ).
позволять
Пусть Объявляет и необязательно инициализирует переменную в текущем объеме. Текущий объем может быть либо модулем, функцией или блоком. Значение переменной, которая не инициализирована, это неопределенный .
Область применения определяет всю жизнь и видимость переменной. Переменные не видны за пределами объема, в которой они объявлены.
Рассмотрим следующий код, который подчеркивает Пусть Область блока:
let x = 1;
{
let x = 2;
}
console.log(x); //1Напротив, var Декларация не было блокировки:
var x = 1;
{
var x = 2;
}
console.log(x); //2 для Заявление петли, с Пусть Декларация создает новую переменную локальную в область блока, для каждой итерации. Следующий цикл создает пять закрытий на пять разных Я Переменные.
(function run(){
for(let i=0; i<5; i++){
setTimeout(function log(){
console.log(i); //0 1 2 3 4
}, 100);
}
})();Написание того же кода с var Созданете пять замкнувших, по той же переменной, поэтому все закрытия будут отображать последнее значение i .
log () Функция – это закрытие. Для получения дополнительной информации о замыкании посмотрите на Откройте для себя мощность закрытия в JavaScript Отказ
конститут
const объявляет переменную, которая не может быть переназначена. Это становится постоянным только тогда, когда назначенное значение неизменяется.
Неизменимаемое значение – это значение, которое, как только созданное, не может быть изменено. Примитивные значения неизменяются, объекты смеются.
const Замораживает переменную, Object.Freeze () замораживает объект.
Инициализация const Переменная обязательна.
Модули
Перед модулями переменная, объявленная вне любой функции, была глобальная переменная.
С модулями переменная, объявленная вне любой функции, скрыта и недоступна для других модулей, если только она не экспортируется.
Экспорт делает функцию или объект доступным для других модулей. В следующем примере я экспортирую функции из разных модулей:
//module "./TodoStore.js"
export default function TodoStore(){}
//module "./UserStore.js"
export default function UserStore(){}Импорт делает функцию или объект, из других модулей, доступных для текущего модуля.
import TodoStore from "./TodoStore"; import UserStore from "./UserStore"; const todoStore = TodoStore(); const userStore = UserStore();
Распространение/отдых
... Оператор может быть оператором распространения или параметр покоя, в зависимости от того, где он используется. Рассмотрим следующий пример:
const numbers = [1, 2, 3]; const arr = ['a', 'b', 'c', ...numbers]; console.log(arr); ["a", "b", "c", 1, 2, 3]
Это оператор распространения. Теперь посмотрите на следующий пример:
function process(x,y, ...arr){
console.log(arr)
}
process(1,2,3,4,5);
//[3, 4, 5]
function processArray(...arr){
console.log(arr)
}
processArray(1,2,3,4,5);
//[1, 2, 3, 4, 5]Это параметр покоя.
аргументы
С помощью параметра отдыха мы можем заменить Аргументы псевдопараметрический. Параметр отдыха – это массив, Аргументы не является.
function addNumber(total, value){
return total + value;
}
function sum(...args){
return args.reduce(addNumber, 0);
}
sum(1,2,3); //6Клонирование
Оператор распространения делает клонирование объектов и массивов проще и более выразительным.
Оператор Свойства с распространением объекта будет доступен как часть ES2018.
const book = { title: "JavaScript: The Good Parts" };
//clone with Object.assign()
const clone = Object.assign({}, book);
//clone with spread operator
const clone = { ...book };
const arr = [1, 2 ,3];
//clone with slice
const cloneArr = arr.slice();
//clone with spread operator
const cloneArr = [ ...arr ];Согласие
В следующем примере оператор спреда используется для объединения массивов:
const part1 = [1, 2, 3]; const part2 = [4, 5, 6]; const arr = part1.concat(part2); const arr = [...part1, ...part2];
Объединение объектов
Оператор распространения, как Объект.assign () , можно использовать для копирования свойств от одного или нескольких объектов к пустому объекту и объединить их свойства.
const authorGateway = {
getAuthors : function() {},
editAuthor: function() {}
};
const bookGateway = {
getBooks : function() {},
editBook: function() {}
};
//copy with Object.assign()
const gateway = Object.assign({},
authorGateway,
bookGateway);
//copy with spread operator
const gateway = {
...authorGateway,
...bookGateway
};Свойство, короткие руки
Рассмотрим следующий код:
function BookGateway(){
function getBooks() {}
function editBook() {}
return {
getBooks: getBooks,
editBook: editBook
}
}С недвижимостью, когда имя свойства и имя переменной, используемого в качестве значения, одинаковы, мы можем просто написать ключ один раз.
function BookGateway(){
function getBooks() {}
function editBook() {}
return {
getBooks,
editBook
}
}Вот еще один пример:
const todoStore = TodoStore();
const userStore = UserStore();
const stores = {
todoStore,
userStore
};Разрушение назначения
Рассмотрим следующий код:
function TodoStore(args){
const helper = args.helper;
const dataAccess = args.dataAccess;
const userStore = args.userStore;
}С деструктурирующим синтаксисом назначения, он может быть написан так:
function TodoStore(args){
const {
helper,
dataAccess,
userStore } = args;
}Или еще лучше, с синтаксисом разрушимости в списке параметров:
function TodoStore({ helper, dataAccess, userStore }){}Ниже приведен функцию вызова:
TodoStore({
helper: {},
dataAccess: {},
userStore: {}
});Параметры по умолчанию
Функции могут иметь параметры по умолчанию. Посмотрите на следующий пример:
function log(message, mode = "Info"){
console.log(mode + ": " + message);
}
log("An info");
//Info: An info
log("An error", "Error");
//Error: An errorШаблон строковых литералов
Шаблонные строки определены с ` персонаж. С шаблонами строки, предыдущее сообщение журнала можно записать так:
function log(message, mode= "Info"){
console.log(`${mode}: ${message}`);
}Шаблонные строки могут быть определены на нескольких линиях. Однако лучший вариант состоит в том, чтобы сохранить длинные текстовые сообщения в качестве ресурсов, например, в базе данных.
См. Ниже функции, которая генерирует HTML, который охватывает несколько строк:
function createTodoItemHtml(todo){
return `Правильные хвостовые звонки
Хвостовые рекурсивные функции выполняют лучше, чем не хвостовые рекурсивные функции. Оптимизированный рекурсивный вызов хвоста не создает новую кадру стека для каждого вызова функции, а скорее использует один кадр стека.
ES6 приносит оптимизацию Call-Call в строгом режиме.
Следующая функция следует извлечь выгоду из оптимизации хвостовой связи.
function print(from, to)
{
const n = from;
if (n > to) return;
console.log(n);
//the last statement is the recursive call
print(n + 1, to);
}
print(1, 10);Примечание. Оптимизация хвостового вызова еще не поддерживается основными браузерами.
Обещания
Обещание – это ссылка на асинхронный звонок. Это может решить или не ударить где-то в будущем.
Обещания легче комбинировать. Как вы видите в следующем примере , легко вызвать функцию, когда все обещания решаются или когда первое обещание решено.
function getTodos() { return fetch("/todos"); }
function getUsers() { return fetch("/users"); }
function getAlbums(){ return fetch("/albums"); }
const getPromises = [
getTodos(),
getUsers(),
getAlbums()
];
Promise.all(getPromises).then(doSomethingWhenAll);
Promise.race(getPromises).then(doSomethingWhenOne);
function doSomethingWhenAll(){}
function doSomethingWhenOne(){} fetch () Функция, часть Fetch API, возвращает обещание.
Обещание. Все () Возвращает обещание, которое разрешается, когда все входные обещания решили. Promess.race () Возвращает обещание, которое решает или отклоняет, когда один из входных обещаний разрешается или отклоняет.
Обещание может быть в одном из трех государств: в ожидании, решается или отклонено. Обещание будет в ожидании до тех пор, пока не будет разрешен, либо отклонен.
Обещает поддерживать систему цепочки, которая позволяет передавать данные через набор функций. В следующем примере , результат gettodos () передается как вход в Тодзисон () Затем его результат передан как вход в gettoppriority () и тогда его результат передан как вход в redertodos () функция. Когда ошибка брошена или обещание отклонено Рульеррар называется.
getTodos()
.then(toJson)
.then(getTopPriority)
.then(renderTodos)
.catch(handleError);
function toJson(response){}
function getTopPriority(todos){}
function renderTodos(todos){}
function handleError(error){}В предыдущем примере .тогда () обрабатывает сценарий успеха и .ловить () обрабатывает сценарий ошибки. Если на любом шаге есть ошибка, контроль цепи прыгает на самый близкий обработчик вниз по цепочке.
Обещание. Продвижение () Возвращает разрешенное обещание. Обещание.reject () Возвращает отклоненное обещание.
Класс
Класс – это сахарный синтаксис для создания объектов с пользовательским прототипом. Он имеет лучший синтаксис, чем предыдущий, конструктор функции. Проверьте следующий экзэмп :
class Service {
doSomething(){ console.log("doSomething"); }
}
let service = new Service();
console.log(service.__proto__ === Service.prototype);Все методы, определенные в Сервис Класс будет добавлен в Сервис. Прототип объект. Экземпляры Сервис Класс будет иметь тот же прототип ( Service.prototype ) объект. Все экземпляры будут делегировать вызовы методов Сервис. Прототип объект. Методы определены один раз на Сервис. Прототип а потом унаследовал все экземпляры.
Наследование
«Классы могут наследовать из других классов». Ниже Пример наследования Где Специальное обслуживание класс “наследует” от Сервис класс:
class Service {
doSomething(){ console.log("doSomething"); }
}
class SpecialService extends Service {
doSomethingElse(){ console.log("doSomethingElse"); }
}
let specialService = new SpecialService();
specialService.doSomething();
specialService.doSomethingElse();Все методы, определенные в Специальное обслуживание Класс будет добавлен в Специальный сайт. Прототип объект. Все экземпляры будут делегировать вызовы методов Специальный сайт. Прототип объект. Если метод не найден в Специальный сайт. Прототип он будет искать в Сервис. Прототип объект. Если он все еще не найден, он будет искать в Объект. Прототип Отказ
Класс может стать плохой особенностью
Даже если они капсулируются, все члены класса являются публичными. Вам все еще нужно управлять проблемами с Это Потеря контекста. Общественный API сметен.
класс Может стать плохой особенностью, если вы пренебрегаете функциональной стороной JavaScript. класс Может создать впечатление языка на основе класса, когда JavaScript является как функциональный язык программирования, так и на основе прототипа языком.
Инкапсулированные объекты могут быть созданы с заводскими функциями. Рассмотрим следующий пример:
function Service() {
function doSomething(){ console.log("doSomething"); }
return Object.freeze({
doSomething
});
}На этот раз все члены являются частными по умолчанию. Общественный API неизменен. Нет необходимости управлять вопросами с Это Потеря контекста.
класс Может использоваться как исключение, если требуется структура компонентов. Это было в случае с реагированием, но больше не так с Реактивные крюки Отказ
Подробнее о том, зачем оказывать фабричные функции, посмотрите на Функция Class vs Factory: Изучение пути вперед Отказ
Функции стрелки
Функции стрелки могут создавать анонимные функции на лету. Их можно использовать для создания небольших обратных вызовов с более коротким синтаксисом.
Давайте возьмем коллекцию до DOS. У должен иметь ID , а Название и а Завершено логическое свойство. Теперь рассмотрим следующий код, который выбирает только Название Из коллекции:
const titles = todos.map(todo => todo.title);
или следующий пример, выбрав только Тодос которые не завершены:
const filteredTodos = todos.filter(todo => !todo.completed);
это
Функции стрелки не имеют своих Это и Аргументы Отказ В результате вы можете увидеть функцию стрелки, используемую для исправления проблем с Это Потеря контекста. Я думаю, что лучший способ избежать этой проблемы – не использовать Это вообще.
Функции стрелки могут стать плохой особенностью
Функции стрелки могут стать плохой особенностью при использовании для ущерба именованных функций. Это создаст проблемы с удовольствием и ремонтом. Посмотрите на следующий код, написанный только с анонимными функциями стрелки:
const newTodos = todos.filter(todo =>
!todo.completed && todo.type === "RE")
.map(todo => ({
title : todo.title,
userName : users[todo.userId].name
}))
.sort((todo1, todo2) =>
todo1.userName.localeCompare(todo2.userName));Теперь проверить ту же логику Пофакторизованные в чистых функциях с намерением раскрывать имена и решить, какие из них легче понять:
const newTodos = todos.filter(isTopPriority)
.map(partial(toTodoView, users))
.sort(ascByUserName);
function isTopPriority(todo){
return !todo.completed && todo.type === "RE";
}
function toTodoView(users, todo){
return {
title : todo.title,
userName : users[todo.userId].name
}
}
function ascByUserName(todo1, todo2){
return todo1.userName.localeCompare(todo2.userName);
}Еще больше, анонимные функции стрелки будут отображаться как (анонимный) в стеке вызовов.
Подробнее о том, зачем оказывать по имени функции, посмотрите на Как сделать ваш код лучше с намерениями, выявляющими имена функций Отказ
Меньше кода не нужно означать более читаемое. Посмотрите на следующий пример И посмотрите, какую версию легче понять:
//with arrow function
const prop = key => obj => obj[key];
//with function keyword
function prop(key){
return function(obj){
return obj[key];
}
}Обратите внимание при возврате объекта. В следующем примере getsampletodo () Возвращает undefined Отказ
const getSampleTodo = () => { title : "A sample todo" };
getSampleTodo();
//undefinedГенераторы
Я думаю, что генератор ES6 является ненужной функцией, которая делает код более сложным.
Генератор ES6 создает объект, который имеет Далее () метод. Далее () Метод создает объект, который имеет ценность имущество. Генераторы ES6 содействуют использованию петель. Посмотрите на код ниже :
function* sequence(){
let count = 0;
while(true) {
count += 1;
yield count;
}
}
const generator = sequence();
generator.next().value;//1
generator.next().value;//2
generator.next().value;//3Тот же генератор может быть просто реализован с закрытием.
function sequence(){
let count = 0;
return function(){
count += 1;
return count;
}
}
const generator = sequence();
generator();//1
generator();//2
generator();//3Для получения дополнительных примеров с функциональными генераторами посмотрите на Давайте экспериментем с функциональными генераторами и оператором трубопровода в JavaScript Отказ
Пусть и const Объявите и инициализируйте переменные.
Модули инкапсулируют функциональность и выставляют только небольшую часть.
Оператор SPRECT, параметр покоя и свойство Shothand делает вещи проще экспрессируют.
Обещания и рекурсионность хвоста Заполните функциональную программирование на панели инструментов.
Откройте для себя функциональный JavaScript был назван одним из Лучшие новые функциональные программирования книги BookAuthority Действительно
Для получения дополнительной информации о применении функциональных методов программирования в реакции посмотрите на Функциональный реагировать Отказ
Учить Функциональный реагировать в проекте, основанном на проекте, с Функциональная архитектура с реагированием и redux Отказ
Следуйте в Twitter
Оригинал: “https://www.freecodecamp.org/news/these-are-the-features-in-es6-that-you-should-know-1411194c71cb/”