В-1. Что такое WeakMap в ES6?

WeakMap совпадает с Map, где это набор пар "ключ-значение". Но в WeakMap ключи должны быть объектами, а значения могут быть произвольными. Ссылки на объекты в ключах удерживаются слабо, что означает, что они являются целью сборки мусора (GC), если больше нет другой ссылки на объект. API WeakMap аналогичен API Map.

Однако одно из отличий от объектов Map заключается в том, что ключи WeakMap нельзя перечислить. И нет никаких методов, дающих нам список ключей. Если бы они были, список зависел бы от состояния сборки мусора, вводя недетерминизм. Если мы хотим получить список ключей, мы должны использовать Map.

Q-2: Что такое Set?

Объекты Set представляют собой наборы уникальных значений. Повторяющиеся значения игнорируются, так как коллекция должна содержать все уникальные значения. Значения могут быть примитивными типами или ссылками на объекты.

Кроме того, NaN и undefined также можно хранить в файле Set. NaN считается таким же, как NaN (даже если NaN !== NaN).

Q-3: Что такое генераторная функция?

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

Функция-генератор возвращает итерируемый объект при вызове. Он написан с использованием нового синтаксиса *, а также нового ключевого слова yield, представленного в ES6.

Каждый раз, когда вызывается yield, полученное значение становится следующим значением в последовательности. Кроме того, обратите внимание, что генераторы вычисляют возвращаемые значения по запросу, что позволяет им эффективно представлять последовательности, вычисление которых требует больших затрат, или даже бесконечные последовательности.

Q-4: Что такое WeakSet?

Объект WeakSet позволяет хранить слабо удерживаемые объекты в коллекции.

WeakSet объекты представляют собой наборы объектов. Объект в WeakSet может встречаться только один раз; он уникален в коллекции WeakSet. Основные отличия от объекта Set:

  • В отличие от Set, WeakSet представляют собой наборы только объектов, а не произвольных значений любого типа.
  • Слабый WeakSet: ссылки на объекты в коллекции сохраняются слабо. Если нет другой ссылки на объект, хранящийся в WeakSet, они могут быть удалены сборщиком мусора. Это также означает, что в коллекции нет списка текущих объектов. WeakSets нельзя перечислить.

Q-5: Что выведет приведенный ниже код?

Вывод будет 5. Когда мы используем оператор delete для удаления элемента массива, это не влияет на длину массива. Это справедливо, даже если вы удалили все элементы массива с помощью оператора delete.

Другими словами, когда оператор delete удаляет элемент массива, этот удаленный элемент больше не присутствует в массиве. Вместо значения удаленного индекса undefined x 1 в хроме и undefined помещается в индекс. Если вы сделаете console.log(trees), выведите ["xyz", "xxxx", "test", undefined × 1, "apple"] в Chrome и в Firefox ["xyz", "xxxx", "test", undefined, "apple"]

Q-6: Как мы можем вычислить длину counterArray вышеприведенного ассоциативного массива?

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

Object имеет метод keys, который можно использовать для вычисления длины объекта:

Мы также можем добавить метод length непосредственно к Object:

Q-7: Как добавить элемент в начало массива? Как добавить один в конце?

Q-8: Что выведет следующий код и почему?

Вывод на консоль будет "3".

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

Кроме того, из-за поднятия кода внутренний код будет интерпретироваться следующим образом:

Q-9: Что такое NaN? Каков его тип? Как вы можете надежно проверить, равно ли значение NaN?

Свойство NaN представляет значение, которое не является числом. Это специальное значение является результатом операции, которую невозможно выполнить либо из-за того, что один из операндов не является числовым (например, "abc" / 4), либо из-за того, что результат операции не является числовым.

Несмотря на то, что это кажется достаточно простым, у NaN есть пара несколько удивительных характеристик, которые могут привести к неприятным ошибкам, если о них не знать.

Во-первых, хотя NaN означает "не число", его тип, хотите верьте, хотите нет, Number:

console.log(typeof NaN === "number");  // logs "true"

Кроме того, NaN можно сравнить ни с чем — даже с самим собой! – неверно:

console.log(NaN === NaN);  // logs "false"

Полунадежным способом проверить, равно ли число NaN, является встроенная функция isNaN(), но даже использование isNaN() является несовершенным решением.

Лучшим решением было бы использовать value !== value, что даст true только в том случае, если значение равно NaN. Кроме того, ES6 предлагает новую функцию Number.isNaN(), которая отличается от старой глобальной функции isNaN() и является более надежной.

В-10. Каково значение и преимущества включения 'use strict' в начало исходного файла JavaScript?

Короткий и самый важный ответ заключается в том, что use strict – это способ добровольно применить более строгий синтаксический анализ и обработку ошибок в коде JavaScript во время выполнения. Ошибки кода, которые в противном случае были бы проигнорированы или завершились бы скрытым сбоем, теперь будут генерировать ошибки или вызывать исключения. В целом, это хорошая практика.

Некоторые из основных преимуществ строгого режима:

  • Облегчает отладку. Ошибки кода, которые в противном случае были бы проигнорированы или завершились бы скрытым сбоем, теперь будут генерировать ошибки или вызывать исключения, предупреждая вас о проблемах в вашем коде и быстрее направляя вас к их источнику.
  • Предотвращает случайные глобальные переменные. Без строгого режима присвоение значения необъявленной переменной автоматически создает глобальную переменную с таким именем. Это одна из самых распространенных ошибок в JavaScript. В строгом режиме попытка сделать это приводит к ошибке.
  • Устраняет this принуждение. Без строгого режима ссылка на this значение null или undefined автоматически приводится к глобальному значению. Это может привести к большому количеству подделок головы и ошибок типа «выдергивание волос». В строгом режиме ссылка на this значение null или undefined вызывает ошибку.
  • Запрещает повторяющиеся значения параметров. Строгий режим выдает ошибку при обнаружении повторяющегося именованного аргумента функции (например, function foo(val1, val2, val1){}), тем самым выявляя то, что почти наверняка является ошибкой в ​​вашем коде, на поиск которой в противном случае вы могли бы потратить много времени.
  • Примечание. Раньше (в ECMAScript 5) строгий режим запрещал повторяющиеся имена свойств (например, var object = {foo: "bar", foo: "baz"};), но начиная с ECMAScript 2015 это уже не так.
  • Делает eval() более безопасным. Существуют некоторые различия в поведении eval() в строгом и нестрогом режимах. Что наиболее важно, в строгом режиме переменные и функции, объявленные внутри инструкции eval(), не создаются в содержащей области (они создаются в содержащей области в нестрогом режиме, что также может быть распространенным источником проблем).
  • Выдает ошибку при неправильном использовании delete. Оператор delete (используемый для удаления свойств объектов) нельзя использовать для ненастраиваемых свойств объекта. Нестрогий код автоматически завершится ошибкой при попытке удалить ненастраиваемое свойство, тогда как строгий режим в таком случае вызовет ошибку.