В-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
(используемый для удаления свойств объектов) нельзя использовать для ненастраиваемых свойств объекта. Нестрогий код автоматически завершится ошибкой при попытке удалить ненастраиваемое свойство, тогда как строгий режим в таком случае вызовет ошибку.