ES (ECMAScript) - это спецификация языка сценариев, зарегистрированная торговой маркой, которая определена ECMA International. Это стандартизированный язык сценариев для JavaScript. Обычно ECMAScript используется для написания сценариев на стороне клиента в World Wide Web.
ES5 - это сокращение от ECMAScript 5, также известного как ECMAScript 2009. Шестое издание стандарта ECMAScript - ES6. или ECMAScript 6, также известный как ECMAScript 2015.
ES6 - это серьезное усовершенствование языка Javascript, которое позволяет нам писать программы для сложных приложений.
Декларации
Объявление переменной: var может использоваться для объявления в ES5. Let и const заменяет var в ES6
ES5:(var) var name = 'test1'; var age = 20; console.log(name) //test1 ES6 (let and const) const name1 = 'test2'; let age1 = 23; name1 = 'Jane'; let age1 = 24; console.log(name1); //error (const val can't be changed) console.log(age1); //24
Объявление функций: let и const указаны в блоке, поэтому мы больше не доступны за пределами блока, но в var, мы можем получить доступ, если они работают, поскольку они не указаны в блоке. Также в переменных ES5 перед объявлением не определено.
ES5: function classTest(passedTest) { if (passedTest) { console.log(firstName); //undefined (called before declaration) var firstName = 'jack'; var marks = 98; } console.log(firstName + 'successfully passed the test with' + marks + 'score'); //jack, 98 } classTest(true); ES6: function classTest(passedTest) { console.log(firstName); //error (not assigned while declaration) let firstName; const marks = 98; if (passedTest) { firstName = 'jack'; } console.log(firstName + 'successfully passed the test with' + marks + 'score'); //jack, 98 } classTest(true);
Блоки и IIFE:
ES5: (function () { var c = 3; })(); console.log(c); //3 ES6: { const a = 1; let b = 2; var c = 3; } console.log(a + b);//not accessible outside the scope. console.log(c); //3
Струны:
В ES5 кавычки (‘’) вместе с оператором сложения (+) используются для отображения текста и переменных.
В ES6 мы используем литералы шаблонов, один из которых - обратные кавычки и знак $ для отображения содержимого. Некоторые строковые методы, такие как startWith, endWith, includes, repeat и т. Д., Используются для удобного отображения содержимого.
let firstName = 'Jack'; let lastName = 'Watson'; const yearOfBirth = 1990; function calcAge(year) { return 2016 - year; } ES5: console.log('This is ' + firstName + ' ' + lastName + '. He was born in ' + yearOfBirth + '. Today, he is ' + calcAge(yearOfBirth) + ' years old.'); ES6: console.log(`This is ${firstName} ${lastName}. He was born in ${yearOfBirth}. Today, he is ${calcAge(yearOfBirth)} years old.`); string methods in ES6 const n = `${firstName} ${lastName}`; console.log(n.startsWith('J')); //Jack console.log(n.endsWith('on')); // Watson console.log(n.includes(' ')); //true console.log(`${firstName} `.repeat(2)); Jack Jack
Стрелочные функции:
const data = [60, 70, 80, 90] ES5: var diff = data.map(function(el){ return 100 - el; }) console.log(data) ES6 let diff = data.map((el, index) => { return 100 - el; }) or let diff = data.map((el, index) => 100 - el; console.log(data);
Еще одно важное отличие, которое нужно понимать при работе с объявлением стрелочных функций в объектах, использующих ES5 и ES6.
В случае ES5: использование функции напрямую указывает на объект окна, поэтому он не определен, поэтому мы должны сохранить его в переменной
С другой стороны, в ES6
случай 1 это ключевое слово сохраняется и указывает на переменные документа.
случай 2 в этом методе это ключевое слово не определено, так как оно использует лексическое ключевое слово this из своего окружения, а окружение является глобальным контекстом, т.е. указывает на глобальный объект.
ES5: var button ={ color: 'green', position:1, clickMe: function(){.....} //undefined var self= this; document.querySelector('.green').addEventListener('click', function () { var str = 'This is button ' + self.position + ' and it is ' + self.color; alert(str); //this is button 1 and it is green }); } button.clickMe(); ES6(case1) const button = { color: 'green', position:1, clickMe: function(){ document.querySelector('.green').addEventListener('click', function () { let str = 'This is button ' + self.position + ' and it is ' + self.color; alert(str); //this is button 1 and it is green }); } button.clickMe(); ES6(case2) const button = { color: 'green', position:1, clickMe:() => { document.querySelector('.green').addEventListener('click', function () { var str = 'This is button ' + self.position + ' and it is ' + self.color; alert(str); // error undefined }); } button.clickMe();
Разрушение:
Деструктуризация обеспечивает очень удобный способ извлечения данных из структуры данных, например объектов или массива.
Разрушение массивов:
ES5 var data = ['John', 26]; var name = data[0]; var age = data[1]; console.log(name);// john console.log(age); // 26 ES6 const [name, age] = ['John', 26]; console.log(name); //john console.log(age); //26
Разрушение объекта:
const obj = { firstName: 'John', lastName: 'Smith' }; const {firstName, lastName} = obj; console.log(firstName); console.log(lastName); const {firstName: a, lastName: b} = obj; console.log(a); console.log(b);
Массивы:
Цикл ForEach в массиве с использованием синтаксиса ES5 и ES6
const cards = document.querySelectorAll('.card'); ES5: var cardsArr = Array.prototype.slice.call(cards); cardsArr.forEach(function(cur){ cur.style.backgroundColor = '#087'; ) ES6 const cardsArr = Array.from(cards); cardsArr.forEach(cur => { cur.style.backgroundColor = '#087'; )
Цикл For в массиве с использованием синтаксиса ES5 и ES6
const cards = document.querySelectorAll('.card'); ES5: var cardsArr = Array.prototype.slice.call(cards); for(var i = 0; i < cardsArr.length; i++) { if(cardsArr[i].className === 'card blue') { continue; } cardsArr[i].textContent = 'I changed to blue!'; } ES6: const cardsArr = Array.from(cards); for (const cur of cardsArr) { if (cur.className.includes('blue')) { continue; } cur.textContent = 'I changed to blue!'; }
Поиск индекса массива с использованием синтаксиса ES5 и ES6
ES5: var ages = [12, 17, 8, 21, 14, 11]; var full = ages.map(function(cur) { return cur >= 18; }); console.log(full); console.log(full.indexOf(true)); console.log(ages[full.indexOf(true)]); ES6: console.log(ages.findIndex(cur => cur >= 18)); console.log(ages.find(cur => cur >= 18));
Оператор распространения:
Вместо того, чтобы передавать весь массив в sum2 и sum3, мы можем использовать оператор null или оператор распространения (…) для копирования элементов из sum1. Чтобы передать весь массив, мы используем метод apply в ES5. Оператор распространения используется в вызове функции.
function addFourAges(a, b, c, d) { return a + b + c + d; } var sum1 = addFourAges(18, 30, 12, 21); console.log(sum1); ES5: var ages = [18, 30, 12, 21]; var sum2 = addFourAges.apply(null, ages); console.log(sum2); ES6: const sum3 = addFourAges(...ages); console.log(sum3);
Остальные параметры:
Параметры отдыха позволяют нам передавать произвольное количество аргументов в функцию и использовать этот аргумент в функции. Нет. одиночных аргументов и преобразует его в массив (противоположно оператору распространения). В объявлении функции можно использовать оператор rest.
ES5: function isFullAge(limit) { var argsArr = Array.prototype.slice.call(arguments, 1); argsArr.forEach(function(cur) { console.log((2020 - cur) >= limit); }) } isFullAge(1990, 1999, 1965, 2016, 1987); ES6: function isFullAge(limit, ...years) { years.forEach(cur => console.log((2020 - cur) >= limit)); } isFullAge(16, 1990, 1999, 1965, 2016, 1987);
Параметры по умолчанию:
Иногда при вызове параметризованной функции, если пользователь забывает отправить параметры, это создает проблему. Чтобы избежать таких условий, используются параметры по умолчанию.
ES5: function Person1(firstName, lastName, age) { Setting up default parameters lastName === undefined ? lastName = 'Smith' : lastName = lastName; this.firstName = firstName; this.lastName = lastName; this.age = age; } ES6: function Person1(firstName, lastName = 'Smith', age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } var john = new Person1('John', 20); var emily = new Person1('Emily', 'dyne', 40 ); console.log(john);
Объект против карт:
В объектах мы ограничены строками в паре ключ-значение, но в картах мы можем использовать любое примитивное значение для строки. Карты удобны в использовании, потому что мы можем использовать что угодно в качестве ключа. Мы можем легко получить размер карты и добавить или удалить данные с карты. Карты также можно повторять, мы можем перебирать карты в цикле, чего нельзя делать с объектами.
ES6: const question = new Map(); Set data question.set('question', 'What is the official name of latest version of js'); question.set(1, 'ES5'); question.set(2, 'ES6'); question.set(3, 'ES2015'); question.set(4, 'ES7'); question.set('correct', 3); question.set(true, 'Correct answer:D'); question.set(false, 'wrong, please try again'); Get data console.log(question.get('question')) console.log(question.size) Delete data question.delete(4); Delete if it contains value if (question.has(4)) { question.delete(4); } Clear data question.clear(); Loop through data question.forEach((value, key) => console.log(`this is ${key} with ${value}`)) or for(let [key, value] of question.entries()) { if (typeof (key) === 'number') console.log(`this is ${key} with ${value}`) } const ans = parseInt(prompt('Write the correct')); Retreving data console.log(question.get( ans === question.get('correct')) )
Классы:
ES5: var Person = function(name, yearOfBirth, job) { this.name = name; this.yearOfBirth = yearOfBirth; this.job = job; } Person.prototype.calculateAge = function() { var age = new Date().getFullYear - this.yearOfBirth; console.log(age); } var john = new Person('John', 1990, 'teacher'); ES6: class Person { constructor (name, yearOfBirth, job) { this.name = name; this.yearOfBirth = yearOfBirth; this.job = job; } calculateAge() { var age = new Date().getFullYear - this.yearOfBirth; console.log(age); } static greeting() { console.log('Hey there!'); } } const john = new Person('John', 1990, 'teacher'); Person.greeting();
Подклассы:
ES5: var Person = function(name, yearOfBirth, job) { this.name = name; this.yearOfBirth = yearOfBirth; this.job = job; } Person.prototype.calculateAge = function() { var age = new Date().getFullYear() - this.yearOfBirth; console.log(age); } var Player = function(name, yearOfBirth, job, olymicGames, medals) { Person.call(this, name, yearOfBirth, job); this.olymicGames = olymicGames; this.medals = medals; } Player.prototype = Object.create(Person.prototype); Player.prototype.wonMedal = function() { this.medals++; console.log(this.medals); } var player1 = new Player('John', 1990, 'swimmer', 3, 10); player1.calculateAge(); player1.wonMedal(); ES6: class Person { constructor (name, yearOfBirth, job) { this.name = name; this.yearOfBirth = yearOfBirth; this.job = job; } calculateAge() { var age = new Date().getFullYear() - this.yearOfBirth; console.log(age); } } class Player extends Person { constructor(name, yearOfBirth, job, olympicGames, medals) { super(name, yearOfBirth, job); this.olympicGames = olympicGames; this.medals = medals; } wonMedal() { this.medals++; console.log(this.medals); } } const player1 = new Athlete6('John', 1990, 'swimmer', 3, 10); player1.wonMedal(); player1.calculateAge();
Надеюсь, эта статья окажется полезной и вам понравится.