1) Как объявить константу в ES6?
Используйте ключевое слово 'const' вместо 'var' или 'let'. Константа не может быть переприсвоена, однако содержимое, на которое она указывает, может быть изменено. Если вы попытаетесь изменить константу, произойдет следующая ошибка : TypeError: Assignment to constant variable

2) Как объявить переменную с блочной областью видимости?
До ES6 в JS существовали только переменные с  функциональной областью видимости, которые могут вызвать некоторые сложные ошибки. Поэтому были введены переменные с блочной областью видимости(blocked scope), они работают также как в C++ или Java. Чтобы объявить такую переменную нужно  использовать 'let'  вместо 'var'.
if(2+2){
  var functionScope='functionScope'
  let blockedScope='blockedScope'
}
console.log(functionScope)// 'functionScope'
console.log(blockedScope)// ReferenceError: blockedScope is not defined

3) Что такое стрелочная функция? Чем она отличается от обычной функции ?
Стрелочная функция более компактная версия обычной JS функции . ключевое слово "function" больше не требуется для объявления функции, вам просто нужно использовать => синтаксис .
[1,2,3].map(e=>e*2) // [2,4,6]
Основное различие между стрелочной функцией и обычной функцией состоит в том, что, первая, не имеет собственного:'this', arguments,super. Это также известно как лексическое this.

4) Как установить параметры по умолчанию в JS?
Синтаксис похож на другие языки: argumentName = someValue.
function join(arr,separator=','){ return arr.join(separator)}

5) Что такое rest(остаточный) аргумент функции?
Этот аргумент содержит все аргументы, переданные после обязательных аргументов. Ранее чтобы получить эти значении нужно было извлекать из массива 'arguments', поэтому эта функция очень полезна.
function push(arr,elem,...otherElems){
  arr.push(elem);
  
  if(otherElems.length){
    otherElems.forEach(e=>push(arr,e))
  }
}

6) Что такое spread оператор ?
Spread оператор разбивает коллекцию на отдельные аргументы функции, это позволяет вызывать функцию, которая принимает три параметра, с одним параметром.
const day = [2015, 10, 12];
const dayOff = new Date(...day);
let firstArray=[4,5,6]
let secondArray=[1,2,3,...firstArray] // [1,2,3,4,5,6]

7) Как использовать строковый шаблона в ECMAScript 6? 
Просто оберните строку в обратные кавычки (гравис). Строковое выражение позволяет использовать переменные внутри них, это упрощает код, который использует конкатенацию строк для форматирования. Также можно создавать многострочные шаблоны, символ  '\n' теперь не нужен.
let user={'name':'John Doe',balance:0}
let message=`Hello ${user.name} your balance getting low. 
Balance: ${user.balance}`;

8) Какие новые функции были добавлены в литералы ES6? 
Теперь поддерживается двоичный и восьмеричный литерал. Расширена поддержка юникода в строках и регулярных выражениях.
console.log(0b100000000 === 256) //true
console.log(0o400 === 256) //true
console.log("ㅎ" === "\u{314E}") //true
console.log("ㅎ".codePointAt(0) == 0x314E) //true

9) Как использовать  сокращенные имена свойств в объектных литералах?
В ES6 имя переменной может использоваться как ключ объекта, что делает объявление объекта более компактным
let someVar=10;
let obj={name:'Test',someVar}

10) Как объявить объект с вычисляемим именем свойства?
function generateId(){
  return Math.ceil(Date.now()+Math.random())+'';
}
let userIds={
  [generateId]:{name:'John Doe'}
}

11) Что такое разрушающее присваивание(destructuring assignment)?

Разрушающее присваивание более компактный и простой способ извлечения нескольких значений из объекта или коллекции  в отдельные переменные. 
let user={firstName:'John',lastName:'Snow'}; //object destructuring 
let {firstName,lastName}=user;

let [users,orders]=await Promise.all([loadUsers(),loadOrders()]);
// instead of 
let results=await Promise.all([loadUsers(),loadOrders()]);
let users=results[0];
let orders=results[1];

12) Как определить класс в  ООП стиле?
class Rectangle{
  constructor(height,width){
    this.height=height;
    this.width=width;
  }
  getArea(){
    return this.height*this.width;
  }
}

13) Как наследовать класс в ECMAScript 6 ?
 

Использовать ключевое слово extends. Больше никаких программных действий с прототипами не требуется.
class Square extends Rectangle{
  constructor(height){
    super(height,height);
  }
}

14) Как получить доступ к члену суперкласса?
 

Для вызова конструктора базового класса просто запустите super (). Для вызова метода или свойства базового класса используйте следующий синтаксис:
class Square extends Rectangle{
  constructor(height){
    super(height,height);
  }
  draw(){
    super.draw()
  }}

15)Что такое статические члены класса в ES6?

Для объявления статической функции-члена используйте ключевое слово 'static', такая функция принадлежит классу, а не объекту. Для вызова статического члена необходимо получить его из класса name: SomeClass.getInstance (); к сожалению, статические свойства все еще недоступны в текущем стандарте, поэтому вам нужно использовать TypeScript или написать хак.
class StaticTest{
  static  getInstance(){
    if(!StaticTest.instanse){
      StaticTest.instanse=new StaticTest();
    }
    return  StaticTest.prototype;
  }
}
console.log(StaticTest.getInstance())

16) Как экспортировать класс в ES6?

Существует два вида экспорта: по имени по умолчанию. Для экспорта класса используйте следующий синтаксис:
class ExportedClass{}
export default ExportedClass;

//or
export {ExportedClass};

17) Реализуйте функцию zip для массивов в JS
Array.prototype.zip=function ( ...arrays){
   return this.map((val, i) => arrays.reduce((a, array) => [...a, array[i]], [val]));
}
console.log([1, 2, 3].zip([4, 5, 6])) //[[1, 4], [2, 5], [3, 6]]

18) Что такое типизированный массив? Где лучше использовать его, чем обычный массив?

Т
ипизированный массив позволяет хранить необработанные двоичные данные для повышения производительности. Как известно, обычные массивы могут хранить любые данные и динамически изменять свой размер, поэтому вычисление большого объема данных требует времени. В последние годы веб-приложения стали более сложными, им нужно работать с видео, аудио данными, обрабатывать соединения WebSocket, поэтому очевидно, что нам нужен какой-то способ для быстрой обработки двоичных данных.

Существует 4 класса типизированных массивов: ArrayBuffer, Uint32Array,Uint8Array, Float32Array.

19) Как скопировать свойства из одного объекта в другой в ES6?
 

Используйте метод Object.assign(dest,source1,{}), он копирует все перечисляемые свойства из одного или нескольких объектов в объект dest.
let dest={};
Object.assign(dest,{prop:'val'},{prop2:'val2'})// {prop:'val',prop2:'val2'}

20) Как найти элемент в массиве?

 Есть две новые функции для поиска элемента массива: find и findIndex. Матрица.прототип.функция find () возвращает первое сопоставленное значение в массиве Array.прототип.findIndex() возвращает индекс первого найденного значения. Если такого элемента нет, то возвращается undefined.
console.log([1,2,3,4,5].find(e => e > 4)) //5
console.log([1,2,3,4,5].findIndex(e => e > 4)) //4

21) Что делает функция String.prototype.repeat()?
 

"some string".repeat(n) возвращает строку, объединенную 'n' раз.
console.log("TypeScript ".repeat(3)) // "TypeScript TypeScript TypeScript "

22) Какой новый метод поиска в строке был добавлен в ECMAScript 6?

  • String.prototype.startsWith() - определяет, начинается ли строка начинаться с указанной подстроки..
  • String.prototype.endsWith() - определяет, заканчивается ли строка указанной подстрокой..
  • String.prototype.includes() - определяет, содержит ли строка указанную подстроку..

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

23)Как проверить, является ли число NaN или вещественным (finite)?
 

В ES6 были введены методы Number.isNaN и Number.isFinite.
console.log(Number.isNaN(NaN))//true
console.log(Number.isFinite(-Infinity))//true

24) Как использовать promise в ES6?
 

Не нужно подключать библиотеки или использовать транспайлеры, ES6 поддерживает промисы по умолчанию.

25) Что такое класс Proxy в ECMAScript6 ?

Прокси-это объект, который перехватывает попытки доступа к другому объекту и может изменять их. Синтаксис:
let proxy = new Proxy(target, handler)