JavaScript Flashcards
Что такое Websokets?
Websokets - это протокол связи поверх TCP-соединения, предназначенный для обмена сообщениями между браузером и веб-сервером.
В отличие от HTTP, котором общение идёт в формате запрос-ответ - при использовании websokets возможно установить соединение и затем получать полезные данные в виде ответов от сервера. Отправлять данные от себя так же возможно в любой момент.
Отладка в браузере, debugger
Можно запустить с помощью добавления строчки debugger
или вручную выбрав файл в Chrome.
В отладке можно определить точки остановки, пошагово выполнять код и видеть все текущие переменные.
Паттерны JS (декоратор)
Способ добавить объекту новый функционал не изменяя его.
В качестве аргумента принимает декорируемый объект.
Возвращает новый объект, который содержит в себе старый объект + дополнительный функционал.
Паттерны JS (модуль)
Модуль - отдельный файл, из которого возможно выполнить экспорт.
Коротко:
экспорт
- до объявления
- отдельно от объявления
- с другим именем
- по умолчанию
- по умолчанию с другим именем
импорт
- нескольких объектов в одном с деструктуризацией
- с изменением имени
- всего в одном объекте
- по умолчанию
export
1. экспорт до объявления (конкретной переменной, функции или класса):export const bullet = 'a'
2. экспорт отдельно от объявления (нескольких значений в объекте):const a = 1
const b = 2
export {a, b}
3. возможно эскортировать под другим именемexport {a as alpha, b as beta}
4. экспорт по умолчанию (может быть только один)export default class User {…}
import
1. импорт нескольких объектов (возможно с заменой имени)import {a, b as beta} from file.js
2. импорт всего в одном объектеimport * as abc from file.js
3. импорт по умолчаниюimport abc from file.js
Модули нужны для повышения читаемости, облегчения поддержки кода, возможности повторного использования кода и сохранения чистоты глобального пространства имён.
Generators.
Что такое генераторы?
Генераторы могут по мере необходимости возвращать множество значений одно за другим.
Их особенность является в том, что выполняясь они могут остановить своё исполнение, вернуть промежуточное значение, а затем продолжить выполняться.
- Функции-генераторы объявляются с помощью
function*
. - Оператор
yield
используется для приостановки выполнения функции-генератора и возврата значения вызывающему коду. Выполнение функции можно возобновить с помощью методаnext()
. - Генератор возвращает объект итератор, который можно использовать для обхода значений, генерируемых функцией.
Определение генератора:
function* simpleGenerator() { yield 1; yield 2; yield 3; }
Использование генератора:
const generator = simpleGenerator(); // итератор console.log(generator.next()); // { value: 1, done: false } console.log(generator.next()); // { value: 2, done: false } console.log(generator.next()); // { value: 3, done: false } console.log(generator.next()); // { value: undefined, done: true }
“use strict”
Строгий режим
Активируется если первой строкой написать “use strict” (можно в файле, можно только в функции).
Заставляет работать код только в современном режиме, убирает обратную совместимость с очень старым кодом.
Объясните делегирование событий.
Когда стоит его использовать?
Какие плюсы от этого?
Это обработка события для множества элементов одним из родителей элементов (общим предком).
Ставится один обработчик на общего предка. А в нём определяем нужный элемент через event.target
.
Экономит память, удобство изменения, меньше кода (не надо каждый раз ставить и снимать обработчик для каждого элемента).
Что такое IIFE (ифи)?
Immediately Invoked Function Expression - немедленно вызываемая функция.
(function () { console.log('Hello World'); })();
Такое выражение выполняется немедленно после создания.
До появления ES6 модулей - использовалось что бы не загрязнить глобальное пространство имён. Переменные объявленные внутри - не видимы за его пределами.
Объясните, почему это не является IIFE: function foo(){ }();. Что необходимо изменить, чтобы это стало IIFE?
Не хватает скобок вокруг функции, что бы скобки в конце считались указанием к исполнению функции: (function foo(){ })().
В каких случаях обычно используются анонимные функции?
Для выполнения какого-то кода в коллбэках, где не нужно создавать отдельную именную функцию под это действие.
В чём различие между переменными, значение которых: null, undefined? Как бы вы проверили их на каждое из этих значений?
undefined - переменная, которая была объявлена, но у неё нет значения или результат выполнения функции, которая ничего не возвращает.
null - значение, которое явно обозначает отсутствие значения.
Проверить можно с помощью typeof или строгим равенством ===.
Можете ли вы описать основное различие между циклом .forEach()
и циклом .map()
? И в каких случаях каждый из них используется?
map
- коллбек выполняется для каждого элемента массива
- результат выполнения становится элементом массива
- возвращает новый массив
forEach
- коллбек выполняется для каждого элемента массива
- результат выполнения никуда не запишется
- возвращает undefined
В чем разница между host-объектами и нативными объектами?
host-объекты - это объекты, которые предоставляются средой выполнения. То есть в нашем случае браузером: window
, document
, location
, history
итд.
нативные объекты - это объекты, которые являются частью языка Java Script: String
, Array
, Math
, Object
, Function
итд.
В чем разница между:function Person(){}
var person = Person()
var person = new Person()
function Person(){}
- создание функции с именем Person.var person = Person()
- вызов функции Person и помещение результата в переменную person.var person = new Person()
- создание нового объекта, используя функцию-конструктор Person.
Подробно расскажите об Ajax.
Asynchronous Javascript And Xml - технология обращения к серверу без перезагрузки страницы. Использовать XML не обязательно, под AJAX подразумевают любое общение с сервером без перезагрузки страницы, организованное при помощи JavaScript.
Плюсы:
- Повышение интерактивности - новые данные с сервера можно добавить динамически без перезагрузки страницы
- Скрипты и стили надо скачать всего 1 раз для страницы
Минусы:
- Сложность реализации закладки для страницы
- Не работает без JS
- Динамический контент не виден некоторым роботам.
Вы когда-нибудь использовали шаблонизацию на JavaScript? Если да, то какие библиотеки вы использовали?
Стандартный <template>
и JSX.
Содержимое шаблона доступно по его свойству content
в качестве DocumentFragment – особый тип DOM-узла.
Например:const tmpl = document.querySelector('#text-template').content;
let elem = document.createElement('div');
// Клонируем содержимое шаблона для того, чтобы переиспользовать его несколько разelem.append(tmpl.content.cloneNode(true));
Расскажите, что такое поднятие (hoisting).
Hoisting - поднятие переменной. Это поведение переменных, объявленых с помощью var
.
Переменные объявленные с var
- поднимаются в верхнюю часть текущей области, что позволяет к ним обращаться. Поднимается только объявление. Присвоение остаётся на своём месте. Это значит что до присвоения значения этой переменной - она будет равняться undefined
.
В случае попытки провернуть такое с let
или const
- будет ошибка reference error
.
С функциями это работает так, что функции можно объявить в конце и пользоваться ими где угодно.
Объясните, что такое всплытие событий (event bubbling).
Это одна из фаз прохода события.
После срабатывания события на целевом элементе - событие “проходит” по всем родительским элементам. На этом механизме основано делегирование событий.
В чём разница между “атрибутом” (attribute) и “свойством” (property)?
Атрибуты - в разметке HTML.
Свойства - у объектов DOM.
Большинство стандартных HTML-атрибутов становятся свойствами соответствующих объектов.
Нестандартные атрибуты надо записывать в dataset-*.
Почему не следует расширять нативные JavaScript-объекты?
В том случае если используется несколько библиотек, которые будут использовать расширение нативных объектов - может произойти пересечение названий методов.
Единственное оправданное расширение нативного объекта - создание полифила для устаревшего браузера.
В чём разница между == и ===?
=== - строгое равенство. Сравнивает значение и тип
== - не строгое равенство. Сравнивает только значение. Могут быть неявные преобразования
Объясните Same Origin policy в контексте JavaScript.
Политика одного источника.
- Ограничивает доступ из js к localStorage и cookies, которые были получены с другого домена.
- Запрещает ajax запросы на другие домены, если на этих доменах не настроен CORS соответсвующим образом.
- Скрипт с одного домена не может манипулировать элементами DOM другого домена. Например, iframe с example.com не может изменять содержимое iframe с another-domain.com.
Сделайте так, чтобы этот код работал:duplicate([1,2,3,4,5])
результат:[1,2,3,4,5,1,2,3,4,5]
function duplicate(arr) { return arr.concat(arr) }
Почему тернарный оператор так называется?
“Тернарный” означает три.
Троичное выражение принимает три операнда: условие, выражение then
и выражение else
.
условие
? выражение1
: выражение2