basic js Flashcards

1
Q

Разница между function expression / function declaration

A
  1. Function Declaration (Объявление функции)

В объявлении функции ключевое слово function используется в начале оператора. Функции, созданные таким образом, могут быть вызваны до того, как код, содержащий их, выполнится. Это называется “подъемом” функции (hoisting), и это позволяет размещать вызовы функций до их фактического определения в коде.

  1. Function Expression (Функциональное выражение)

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

Главное различие между этими двумя заключается в том, как они обрабатываются во время фазы подъема (hoisting) и доступности в коде. В то время как объявления функций могут быть вызваны до своего фактического определения в коде, функциональные выражения должны быть определены до того, как они будут вызваны, иначе будет ошибка.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Как сравнить два объекта?

A

При обсуждении объектных сравнений в JavaScript следует иметь в виду два типа равенств:

  • Ссылочное равенство: Определяет, ссылаются ли два предоставленных операнда на одну и ту же ссылку/экземпляр объекта.
  • Глубокое равенство: Определяет, равны ли объекты, сравнивая каждое свойство в операндах.

Ссылочное равенство можно определить с помощью операторов равенства (===, ==), а также с помощью функций Object.is(), но определить глубокое равенство довольно сложно, поскольку объекты могут быть вложенными.

Глубокое равенство:

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

  1. Метод JSON.stringify()

Этот метод является скорее трюком, который мы можем использовать для определения того, являются ли два объекта глубоко равными или нет. Несмотря на то, что JavaScript не имеет готового решения для сравнения двух объектов, он без проблем сравнивает две строки. Поэтому в данном методе мы преобразуем наши два объекта в строки с помощью метода JSON.stringify() и сравним два значения, чтобы определить, равны ли объекты в глубину. Даже если объекты имеют вложенные свойства, этот метод может справиться и с ними. Важно отметить, что наличие различных порядков атрибутов может дать некорректные результаты при использовании данного метода.

  1. Сравнение с помощью библиотек (например Lodash).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Что такое строгий режим Strict Mode?

A

Строгий режим (Strict Mode) в JavaScript — это специальный режим выполнения кода, введенный в ECMAScript 5 (ES5), который изменяет семантику JavaScript, делая её более строгой и безопасной.

use strict это директива, которая вводит строгий режим выполнения кода. Указывается в начале скрипта или функции.

В строгом режиме:

  • Попытки присваивания значений необъявленным переменным вызывают ошибку.
    Использование зарезервированных слов для будущих версий ECMAScript, таких как let, static, implements, запрещено.
  • При попытке удаления неудаляемых свойств объекта (как свойств, определенных через Object.defineProperty()) будет выброшено исключение.
  • Использование with является запрещенным.
  • Параметр функции не может иметь одинаковые имена.
  • Запрещено использование eval в качестве метки или переменной функции.
  • Контекст this в нестрогом режиме может указывать на глобальный объект в некоторых случаях, в строгом режиме this остаётся неизменным, если функция вызывается без контекста.

Современный JavaScript поддерживает «классы» и «модули», которые автоматически включают строгий режим. Поэтому в них нет нужды добавлять директиву “use strict”.

В консоли браузера строгий режим по умолчанию выключен.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое переменная?

A

Переменная в JavaScript является именованным контейнером для хранения данных. Она позволяет нам сохранять, изменять и использовать значения в процессе выполнения программы. В JavaScript переменные объявляются с использованием ключевых слов var, let, или const.

Каждая переменная имеет имя, которое используется для обращения к ней в коде. Имя переменной должно быть уникальным в контексте своей области видимости.

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

В JavaScript есть два ограничения, касающиеся имён переменных:

  1. Имя переменной должно содержать только буквы, цифры или символы $ и _.
  2. Первый символ не должен быть цифрой.

Если имя переменной содержит несколько слов, то используется lowerCamelCase (стиль написания составных слов слитно).

Регистр имеет значение. apple и APPLE две разные переменные.

Нелатинские буквы разрешены, но не приветствуются.

Существует список зарезервированных слов, которые нельзя использовать в качестве имён переменных, потому что они используются самим языком. Например: let, class, return и function зарезервированы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Основные характеристики JavaScript

A

JavaScript (JS) — это легковесный интерпретируемый (или JIT-компилируемый) язык программирования с функциями первого класса. Наиболее широкое применение находит как язык сценариев веб-страниц, но также используется и в других программных продуктах, например, Node.js.

JavaScript это прототипно-ориентированный, мультипарадигменный язык с динамической типизацией, который поддерживает объектно-ориентированный, императивный и декларативный (например, функциональное программирование) стили программирования.

Основные архитектурные черты:
- динамическая типизация,
- слабая типизация,
- автоматическое управление памятью,
- прототипное программирование,
- функции как объекты первого класса.

Самая первая реализация JavaScript была создана Бренданом Эйхом (англ. Brendan Eich) в компании Netscape в 1995 году.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что такое функция первого класса (First-class function)?

A

Функция первого класса (First-class function) в программировании означает, что функции могут быть использованы так же, как и любые другие значения, такие как числа, строки или объекты. Это означает, что функции могут быть присвоены переменным, переданы в качестве аргументов другим функциям, возвращены из других функций, а также созданы во время выполнения программы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Что такое коллбек (callback function)?

A

Коллбэк (callback) - это функция, которая передается в качестве аргумента другой функции и вызывается этой функцией в определенный момент времени или при наступлении определенного события. Коллбэк функции позволяют реализовать асинхронное программирование и обработку событий в JavaScript.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

В чем разница между объявлением функции через const name = () => {} и function?

A

Объявление стрелочной функции const name = () => {} это присваивание некоторого выражения в константу. Выражением тут является анонимная функция () => {}, и это накладывает те же ограничения, какие существуют для констант: нельзя переназначить константу и нельзя ее использовать до того, как она объявлена, а так же ограничивается зона видимости по всем правилам создания переменных через const, let, var, нет hoisting.

Объявление через function () {} расширяет зону видимости функции и позволяет её использовать до создания функции, то есть имеет hoisting.

Также у стрелочных функций нет своего контекста. Если происходит обращение к this, его значение берётся снаружи.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Типы данных в JavaScript

A

Есть восемь основных типов данных в JavaScript.

  • Число Number / целые числа и числа с плавающей точкой, специальные числовые значения Infinity, -Infinity, NaN
  • BigInt / числа больше чем (2 ** 53 - 1) (т. е. 9007199254740991) или меньше, чем -(2 ** 53 - 1) для отрицательных чисел. Чтобы создать значение типа BigInt, необходимо добавить n в конец числового литерала.
  • Строка String
  • Логический тип Boolean
  • Null / специальное значение, которое представляет собой «ничего», «пусто» или «значение неизвестно».
  • Undefined / специальное значение, которое представляет собой «значение не было присвоено». Обычно null используется для присвоения переменной «пустого» или «неизвестного» значения, а undefined – для проверок, была ли переменная назначена.
  • Символ Symbol
  • Объект Object
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Как проверить тип данных в JavaScript?

A
  1. Оператор typeof позволяет нам увидеть, какой тип данных сохранён в переменной.
  • Имеет две формы: typeof x или typeof(x).
  • Возвращает строку с именем типа. Например, “string”.
  • Для null возвращается “object” – это ошибка в языке, на самом деле это не объект.
  • Функции относятся к объектному типу. Но typeof обрабатывает их особым образом, возвращая “function”.
  1. instanceof - это оператор в JavaScript, который используется для проверки принадлежности объекта к определенному типу или классу.
    myArray instanceof Array // true или false
  2. Метод Object.prototype.toString.call(): Этот метод возвращает строку, представляющую тип объекта.
Object.prototype.toString.call(42);        // "[object Number]"
Object.prototype.toString.call("hello");   // "[object String]"
Object.prototype.toString.call(true);      // "[object Boolean]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(null);      // "[object Null]"
Object.prototype.toString.call({});        // "[object Object]"
Object.prototype.toString.call([]);        // "[object Array]"
Object.prototype.toString.call(function(){}); // "[object Function]"
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Преобразование типов в JS

A

Виды преобразований:
- ToString
- ToNumber
- ToBoolean
- ToPrimitive
- JSON.Stringify

1.ToBoolean:

Boolean({})
!!42

Где происходит:
- Boolean()
- !!
- if, while, for, do/while
- тернарный оператор
- левая часть && и || (короткий цикл вычислений)

Любой объект => true
Все остальное тоже true кроме 7 falsy значений:
- NaN
- null
- undefined
- ‘’ / empty sting
- 0, -0
- 0n, -0n
- false

  1. ToString
  • Для примитивов String(42) => ‘42’
  • Для объектов вызовет преобразование к примитивному типу ToPrimitive

Где происходит:
- String()
- object[value]
- ${value} шаблонные строки

  1. ToNumber
  • true/false => 1/0
  • строку попробует конвертировать в число
    '42' => 42
    ' 42\n ' => 42
    '42px' => NaN
    пустая строка => 0
    если в строке есть пробелы и экранированные символы (\n) то они отбросятся
    методы parseInt parseFloat распознают число до первого лишнего символа
    parseInt('42x') => 42
  • Для объектов также вызывает преобразование к примитивному типу ToPrimitive
  • undefined => NaN
  • null => 0
  • NaN => NaN

Где происходит:
- Number()
- Математические и битовые операции кроме бинарного +
- В случае бинарного + если один операнд строка, то второй преобразуется в строку. Но для объектов вызовется метод valueOf а затем это значение преобразуется в строку

  1. Алгоритм ToPrimitive
  • вызывает Symbol.toPrimitive если он реализован
  • если нет то вызывает методы toString или valueOf
  1. JSON.stringify
  • попробует вызвать метод toJson
  • свойства function, undefined, symbol в объекте удаляются, в массиве превратятся в null
  • NaN Infinity превратятся в null
  • встроенные объекты без метода toJSON превратся в {}

Сравнения:

  • Сравнения без преобразования типов === !==
  • == === сравнивают объекты по ссылке
  • == != > < >= <= предпочитают числа
  • особый случай undefined == null // true

NaN
- NaN === NaN // false
- isNaN(‘string’) //true
- Object.is(NaN, NaN) //true

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Свойства объекта

A

[[Class]]
[[Prototype]]
[[Extensible]]

Флаги свойств
- Свойства-данные value, writable, enumerable, configurable
- Свойства-аксессоры get, set

Object.getOwnPropertyDescriptor/s
Object.defineProperty

Информация о свойствах объекта
- in - проверит объект и всю цепочку прототипов
- Object.keys - только перечисляемые свойства
- Object.getOwnPropertyNames - все свойства
- Object.getOwnPropertySymbols - все символы
- Object.getOwnPropertyDescriptors - все дескрипторы

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Символы

A

const s1 = Symbol(‘apple’)

Глобальный реестр символов для всего окружения

const s1 = Symbol.for

Symbol.keyFor

Встроенные символы:
- Symbol.iterator
- Symbol.toStringTag
- Symbol.toPrimitive
и другие

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Свойство [[Prototype]]

A
  • Это служебное свойство для переиспользования кода.
  • Проставляется вручную или при вызове функции с new
  • Поиск свойства произойдет по цепочке прототипов если обратиться к этому свойству
  • у встроенных объектов уже есть своя иерархия прототипов

Связь prototype и [[Prototype]]
- [[Prototype]] указывает на объект в свойстве prototype
- prototype это свойство функции в JavaScript. Когда функция используется как конструктор (т.е. вызывается с оператором new), prototype определяет прототип для новых объектов, создаваемых этим конструктором.

const proto = {question: 42}

function Class () {}
Class.prototype = proto

const object = new Class()
object.question // 42

object.\_\_proto\_\_ === Class.prototype // true
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

__proto__

A

Нестандартное свойство для доступа прямо к [[Prototype]]

Object.setPrototypeOf(object, prototype)
Object.setPrototypeOf(object)
const object = Object.create(prototype)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Функция-конструктор

A

Функция может быть либо просто функцией или функцией-конструктором.

  • Название с Большой Буквы (просто соглашение)
  • Вызывается только вместе с new
  • использует свойство prototype
  • скорее всего внутри себя использует обращение к ключевому слову this
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Оператор New

A
  • Создается новый объект
  • Он же назначается в качестве this
  • Для него же выставляется [[Prototype]]
  • Функция конструктор возвращает новый объект
  • При возвращении другого объекта созданный объект отбросится

```
function Language (name) {
this.name = name
}

new Language (name) {
// this = {}
// this.[[Prototype]] = Language.prototype
this.name = name
//return this
}
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Классы ES6

A
  • Вызываются только вместе с new
  • Не всплывают
  • Класс родителя должен быть объявлен выше чем дочерний класс
  • Strict mode
  • синтаксическая обертка для функций-конструкторов
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Контекст, this

A

this – способ связать функцию с объектом

4 способа связывания:
- по умолчанию
- неявное связывание
- явное связывание
- связывание через new

  1. По умолчанию this - глобальный объект или undefined в строгом режиме
const value = 42

function something () {
  return this.value
}

something() // 42

'use strict'
something() // TypeError
  1. Неявное связывание

Одновременный доступ и вызов метода

```
const object = {
value: 42,
getValue: function () { return this.value }
}

object.getValue() // 42
~~~

  1. Явное связывание call apply bind
    ~~~
    const object = {
    value: 42,
    getValue: function () { return this.value }
    }

const method = object.getValue
method.call(object) // 42
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Разница между call/apply/bind

A
  • Call - берет аргументы и передает последовательно
  • Apply - берет массив
  • Bind - привязывает контекст и возвращает функцию
21
Q

Как написать проверку на массив?

A

Array.isArray
Array.isArray(HTMLCollection) // false

22
Q

Как создать массив?

A

Array(length)
Array.from(HTMLCollection)
Array.of(3) // [3]
Array.of(1, 2, 3) // [1, 2, 3]
[1, 2, 3]

23
Q

Методы массивов

A

.includes
.find
.findIndex
.flat(2)
.flatMap()

24
Q

Set

A

Set - это коллекция уникальных значений любого типа, которая позволяет хранить только уникальные элементы.

Основные методы и свойства:

  • add(value): Добавляет элемент в Set. Возвращает тот же Set.
  • delete(value): Удаляет элемент из Set. Возвращает true, если значение было в Set и было удалено успешно, в противном случае возвращает false.
  • has(value): Проверяет, содержит ли Set указанное значение. Возвращает true, если содержит, иначе false.
  • clear(): Удаляет все элементы из Set.
  • size: Свойство, возвращающее количество элементов в Set.
25
Q

Map

A

Map - это коллекция пар ключ-значение, где ключи и значения могут быть любого типа.

Основные методы и свойства:

  • set(key, value): Устанавливает значение value для ключа key. Возвращает тот же Map.
  • get(key): Возвращает значение, связанное с ключом key, или undefined, если ключа не существует в Map.
  • delete(key): Удаляет значение, связанное с ключом key. Возвращает true, если значение было успешно удалено, иначе false.
  • has(key): Проверяет, существует ли ключ в Map. Возвращает true, если ключ существует, иначе false.
  • clear(): Удаляет все элементы из Map.
  • size: Свойство, возвращающее количество элементов в Map.
  • forEach(callbackFn): Выполняет указанную функцию для каждого элемента в Map.
26
Q

WeakSet

A

WeakSet - это специальный тип коллекции в JavaScript, представленный в стандарте ECMAScript 2015 (ES6). WeakSet является подклассом Set и предназначен для хранения только объектов.

Основные особенности WeakSet:

  • Слабые ссылки: Ключи в WeakSet могут быть только объектами, и они хранятся в коллекции как слабые ссылки. Это означает, что если объект, который является ключом в WeakSet, больше не используется нигде в программе, он может быть удален из WeakSet сборщиком мусора JavaScript.
  • Отсутствие перебора: В отличие от Set, WeakSet не имеет методов для перебора своих элементов, таких как keys(), values(), entries(), и forEach(). Это связано с тем, что объекты, хранящиеся в WeakSet, нельзя перебирать из-за их потенциальной неустойчивости.
  • Отсутствие размерности: WeakSet не имеет свойства size, так как нельзя точно определить, сколько элементов в нем хранится из-за удаления объектов сборщиком мусора.
  • Не перечислимый: Ключи WeakSet не являются перечислимыми, поэтому нельзя получить список ключей с помощью циклов for…of или forEach().
27
Q

Оператор нулевого слияния (??)

A

Оператор нулевого слияния представляет собой два вопросительных знака ??.

Так как он обрабатывает null и undefined одинаковым образом, то для этой статьи мы введём специальный термин. Для краткости будем говорить, что значение «определено», если оно не равняется ни null, ни undefined.

Результат выражения a ?? b будет следующим:
- если a определено, то a,
- если a не определено, то b.

Иначе говоря, оператор ?? возвращает первый аргумент, если он не null/undefined, иначе второй.

28
Q

Оператор нулевого присваивания (??=)

A

Предположим, нам необходимо проверить, равна ли переменная null или undefined, и если это так — присвоить этой переменной какое-либо другое значение.

x ??= y

Оператор ??= присвоит x значение y только в том случае, если x не определено (null/undefined).

29
Q

Логические операторы

A

В JavaScript есть семь логических операторов:

  • || (ИЛИ)
  • ||= (Оператор логического присваивания ИЛИ)
  • && (И)
  • &&= (Оператор логического присваивания И)
  • ! (НЕ)
  • ?? (Оператор нулевого слияния)
  • ??= (Оператор нулевого присваивания)

Оператор ИЛИ || возвращает первое истинное значение или последнее, если такое значение не найдено.

Оператор ||= принимает два операнда и выполняет следующие действия:
- Вычисляет операнды слева направо.
- Конвертирует a в логическое значение.
- Если a ложно, присваивает a значение b.

Оператор И && возвращает первое ложное значение. Или последнее, если ничего не найдено.

Оператор &&= принимает два операнда и выполняет следующие действия:
- Вычисляет операнды слева направо.
- Конвертирует a в логическое значение.
- Если a истинно, присваивает a значение b.

30
Q

Цикл «while»

A

```
while (condition) {
// тело цикла
}
~~~

31
Q

Цикл «do…while»

A

Проверку условия можно разместить под телом цикла, используя специальный синтаксис do..while:

```
do {
// тело цикла
} while (condition);
~~~
Цикл сначала выполнит тело, а затем проверит условие condition, и пока его значение равно true, он будет выполняться снова и снова.

Такая форма синтаксиса оправдана, если вы хотите, чтобы тело цикла выполнилось хотя бы один раз, даже если условие окажется ложным. На практике чаще используется форма с предусловием: while(…) {…}.

32
Q

Цикл «for»

A

```
for (начало; условие; шаг) {
// … тело цикла …
}
~~~

Любая часть for может быть пропущена.

Обычно цикл завершается при вычислении условия в false.

Но мы можем выйти из цикла в любой момент с помощью специальной директивы break.

Директива continue – «облегчённая версия» break. При её выполнении цикл не прерывается, а переходит к следующей итерации (если условие все ещё равно true).

33
Q

Конструкция “switch”

A

Конструкция switch заменяет собой сразу несколько if.

Она представляет собой более наглядный способ сравнить выражение сразу с несколькими вариантами.

```
switch(x) {
case ‘value1’: // if (x === ‘value1’)

[break]

case ‘value2’: // if (x === ‘value2’)

[break]

default:

[break]
}
~~~

  • Переменная x проверяется на строгое равенство первому значению value1, затем второму value2 и так далее.
  • Если соответствие установлено – switch начинает выполняться от соответствующей директивы case и далее, до ближайшего break (или до конца switch).
  • Если ни один case не совпал – выполняется (если есть) вариант default.
34
Q

Когда лучше использовать if-else, а когда switch?

A

Использование if-else:
- Когда есть несколько условий, каждое из которых должно быть проверено независимо от остальных.
- Если условия сложные и могут быть описаны лучше в виде отдельных проверок.
- Когда нужно проверить выражение на соответствие нескольким возможным значениям.
- Например, если нужно проверить переменную на несколько различных значений, каждому из которых требуется выполнить определенное действие.
- Когда нужно выполнить действия, основанные на сложных логических условиях.

Использование switch:
- Когда есть больше двух вариантов, которые нужно сравнить с одним и тем же значением
- когда есть несколько вариантов сравнения с одним и тем же значением, особенно когда каждый вариант выполняет разные действия.
- когда есть много вариантов сравнения

35
Q

Разница между параметрами и аргументами функции

A
  • Параметр – это переменная, указанная в круглых скобках в объявлении функции.
  • Аргумент – это значение, которое передаётся функции при её вызове.
36
Q

Функции в JS

A

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

Вот пример простой функции в JavaScript:

function greet(name) {
    console.log("Hello, " + name + "!");
}
greet("John"); // Вывод: "Hello, John!"

Основные характеристики функций в JavaScript:

  • Определение функций: Функции могут быть определены с помощью ключевого слова function.
  • Function Expression: функции можно присвоить переменным
  • Arrow Function: функции могут быть объявлены с помощью синтаксиса let func = (arg1, arg2, ...argN) => expression;
  • Параметры и аргументы: Функции могут принимать ноль или более параметров, которые могут использоваться внутри функции. При вызове функции значения, переданные в качестве аргументов, становятся значениями параметров функции.
  • Вызов функций: Функции вызываются с помощью их имени, за которым следуют скобки (), в которых передаются аргументы (если они есть).
  • Возвращаемые значения: Функции могут возвращать значение с помощью ключевого слова return. Если в функции отсутствует оператор return, она возвращает undefined.
  • Анонимные функции: Функции могут быть также определены без имени и использоваться как аргументы других функций или быть назначены переменной.
  • Замыкания (Closures): В JavaScript функции могут создавать и возвращать другие функции, что позволяет использовать концепцию замыкания для доступа к переменным из области видимости родительской функции.
  • Рекурсия: Функции могут вызывать сами себя, что позволяет реализовывать рекурсивные алгоритмы.

Функции являются ключевым элементом в JavaScript и используются повсеместно для организации кода, повторного использования, абстракции и модульности.

37
Q

Что такое JSDoc?

A

Специальный синтаксис JSDoc для документирования функций: использование, параметры, возвращаемое значение.

Пример:

```
/**
* Возвращает x, возведённое в n-ную степень.
*
* @param {number} x Возводимое в степень число.
* @param {number} n Степень, должна быть натуральным числом.
* @return {number} x, возведённое в n-ную степень.
*/
function pow(x, n) {

}
~~~

38
Q

Что такое полифил?

A

Полифил (polyfill) - это код, который реализует функциональность, недоступную в старых версиях браузеров или других сред выполнения, но доступную в более современных версиях.

Примеры полифилов могут включать в себя полифилы для новых методов массивов или объектов, для современных методов работы с DOM, для некоторых API браузера, таких как fetch, и многих других возможностей, добавленных в JavaScript или веб-стандарты.

Полифилы могут быть написаны самими разработчиками или взяты из сторонних библиотек.

39
Q

Объект

A

Пустой объект можно создать, используя один из двух вариантов синтаксиса:

let user = new Object(); // синтаксис "конструктор объекта"
let user = {};  // синтаксис "литерал объекта или литеральная нотация"

При использовании литерального синтаксиса {…} мы сразу можем поместить в объект несколько свойств в виде пар «ключ: значение».

Ключ может быть только строкой или символом. Значение может быть любого типа.

Доступ к свойству:
- Запись через точку: obj.property.
- Квадратные скобки obj[“property”]. Квадратные скобки позволяют взять ключ из переменной, например, obj[varWithKey].

Добавить новое свойство в объект:
user.isAdmin = true;

Удалить свойство из объекта:
delete user.isAdmin

Имя свойства (ключ) может состоять из нескольких слов, но тогда оно должно быть заключено в кавычки.

Объект, объявленный через const, может быть изменён (мутирован).

40
Q

Как проверить существует ли свойство в объекте?

A

В отличие от многих других языков, особенность JavaScript-объектов в том, что можно получить доступ к любому свойству. Даже если свойства не существует – ошибки не будет!

При обращении к свойству, которого нет, возвращается undefined. Это позволяет просто проверить существование свойства:

let user = {};

alert( user.noSuchProperty === undefined ); // true означает "свойства нет"
````

Также существует специальный оператор "in" для проверки существования свойства в объекте.

Синтаксис оператора:

`"key" in object``

Пример:

let user = { name: “John”, age: 30 };

alert( “age” in user ); // true, user.age существует
alert( “blabla” in user ); // false, user.blabla не существует
~~~

Обратите внимание, что слева от оператора in должно быть имя свойства. Обычно это строка в кавычках.

Если мы опускаем кавычки, это значит, что мы указываем переменную, в которой находится имя свойства. Например:

let user = { age: 30 };

let key = "age";
alert( key in user ); // true, имя свойства было взято из переменной key

Для чего вообще нужен оператор in? Разве недостаточно сравнения с undefined?

В большинстве случаев прекрасно сработает сравнение с undefined. Но есть особый случай, когда оно не подходит и нужно использовать “in”.

Это когда свойство существует, но содержит значение undefined.

41
Q

Цикл “for..in”

A

Для перебора всех свойств объекта используется цикл for..in. Этот цикл отличается от изученного ранее цикла for(;;).

Синтаксис:

for (key in object) {
  // тело цикла выполняется для каждого свойства объекта
}
```

К примеру, давайте выведем все свойства объекта user:

let user = {
name: “John”,
age: 30,
isAdmin: true
};

for (let key in user) {
// ключи
alert( key ); // name, age, isAdmin
// значения ключей
alert( user[key] ); // John, 30, true
}
~~~

42
Q

Упорядочены ли свойства объекта?

A

Свойства упорядочены особым образом: свойства с целочисленными ключами сортируются по возрастанию, остальные располагаются в порядке создания.

Термин «целочисленное свойство» означает строку, которая может быть преобразована в целое число и обратно без изменений.

43
Q

Как скопировать объект?

A

Объекты присваиваются и копируются по ссылке. Другими словами, переменная хранит не «значение объекта», а «ссылку» (адрес в памяти) на это значение. Таким образом, копирование такой переменной или передача её в качестве аргумента функции копирует эту ссылку, а не сам объект.

Все операции с использованием скопированных ссылок (например, добавление/удаление свойств) выполняются с одним и тем же объектом.

Чтобы создать «реальную копию» (клон), мы можем использовать Object.assign для так называемой «поверхностной копии» (вложенные объекты копируются по ссылке) или функцию «глубокого клонирования» в сторонней библиотеке lodash.

let user = {
  name: "John",
  age: 30
};

let clone = {}; // новый пустой объект

// давайте скопируем все свойства user в него
for (let key in user) {
  clone[key] = user[key];
}

Также мы можем использовать для этого метод Object.assign.

Синтаксис:
Object.assign(dest, [src1, src2, src3...])

  • Первый аргумент dest — целевой объект.
  • Остальные аргументы src1, …, srcN (может быть столько, сколько необходимо) являются исходными объектами
  • Метод копирует свойства всех исходных объектов src1, …, srcN в целевой объект dest. Другими словами, свойства всех аргументов, начиная со второго, копируются в первый объект.
  • Возвращает объект dest.

Мы также можем использовать Object.assign для замены цикла for..in для простого клонирования:

let user = {
  name: "John",
  age: 30
};

let clone = Object.assign({}, user);

Он копирует все свойства user в пустой объект и возвращает его.

Также существуют и другие методы клонирования объекта. Например, с использованием оператора расширения clone = {...user}.

44
Q

Опциональная цепочка ?.

A

Опциональная цепочка (optional chaining) - это новая функция, добавленная в JavaScript в стандарте ECMAScript 2020. Она представляет собой удобный синтаксис для обращения к свойствам объекта или вызова методов объекта, когда объект может быть null или undefined, без вызова ошибки.

Раньше, если вы пытались обратиться к свойству объекта или вызвать метод у объекта, который был null или undefined, это приводило к ошибке “TypeError”. Опциональная цепочка позволяет избежать таких ошибок и просто вернуть undefined, если объект, к которому обращаются, равен null или undefined.

Синтаксис опциональной цепочки ?. имеет три формы:

  1. obj?.prop – возвращает obj.prop если obj существует, в противном случае undefined.
  2. obj?.[prop] – возвращает obj[prop] если obj существует, в противном случае undefined.
  3. obj.method?.() – вызывает obj.method(), если obj.method существует, в противном случае возвращает undefined.

?. проверяет левую часть на null/undefined и позволяет продолжить вычисление, если это не так.

Цепочка ?. позволяет безопасно получать доступ к вложенным свойствам.

Тем не менее, мы должны использовать ?. осторожно, только там, где по логике кода допустимо, что левая часть не существует. Чтобы он не скрывал от нас ошибки программирования, если они возникнут.

45
Q

Число в JS (тип данных и его методы)

A

Два типа чисел в JS:
- числа с плавающей точкой двойной точности (в 64-битном формате IEEE-754)
- целые числа произвольной длины (больше (2 в 53 степени - 1) и меньше -(2 в 53 степени - 1) bigInt

Как записать число:

let billion = 1000000000;
let billion = 1_000_000_000 // _ просто разделитель
let billion = 1e9 // 1 миллиард, буквально: 1 и 9 нулей
1.23e6 === 1.23 * 1000000 // e6 означает *1000000

let mcs = 0.000001;
let ms = 1e-6; // шесть нулей слева от 1

// 1.23 делится на 1 с 6 нулями
1.23e-6 === 1.23 / 1000000 (=0.00000123)

JS поддерживает шестнадцатеричные, двоичные и восьмеричные числа.

let a = 0b11111111; // двоичная (бинарная) форма записи числа 255
let b = 0o377; // восьмеричная форма записи числа 255
let c = 0xff; // шестрадцатиричная форма записи числа 255

Метод num.toString(base) возвращает строковое представление числа num в системе счисления base. base может варьироваться от 2 до 36 (по умолчанию 10).

Если нам надо вызвать метод непосредственно на числе, как toString в примере выше, то нам надо поставить две точки .. после числа.

Две точки в 123456..toString(36) это не опечатка. Если мы поставим одну точку: 123456.toString(36), тогда это будет ошибкой, поскольку синтаксис JavaScript предполагает, что после первой точки начинается десятичная часть.

Округление:
- Math.ceil // Округление в большую сторону: 3.1 становится 4, а -1.1 — -1.
- Math.floor // Округление в меньшую сторону: 3.1 становится 3, а -1.1 — -2
- Math.round // Округление до ближайшего целого: 3.1 становится 3, 3.6 — 4, а -1.1 — -1.
- Math.trunc // Производит удаление дробной части без округления: 3.1 становится 3, а -1.1 — -1.

Округлить число до n-ого количества цифр в дробной части:
1. Умножить, округлить до целого и разделить
Math.round(num * 100) / 100
2. Метод toFixed(n) округляет число до n знаков после запятой и возвращает строковое представление результата. Округляет значение до ближайшего числа, как в большую, так и в меньшую сторону, аналогично методу Math.round Результатом toFixed является строка. Если десятичная часть короче, чем необходима, будут добавлены нули в конец строки.

Преобразовать строку в число:
- parseInt(str, base) преобразует строку в целое число в соответствии с указанной системой счисления: 2 ≤ base ≤ 36.
- parseFloat(str, base) преобразует строку в число c плавающей точкой в соответствии с указанной системой счисления: 2 ≤ base ≤ 36.

Для проверки на NaN и Infinity:
- isNaN(value) преобразует аргумент в число и проверяет, является ли оно NaN
- Number.isNaN(value) проверяет, является ли аргумент числом, и если да, то проверяет, является ли оно NaN
- isFinite(value) преобразует аргумент в число и проверяет, что оно не является NaN/Infinity/-Infinity
- Number.isFinite(value) проверяет, является ли аргумент числом, и если да, то проверяет, что оно не является NaN/Infinity/-Infinity

Для дробей:
- Используйте округления Math.floor, Math.ceil, Math.trunc, Math.round или num.toFixed(precision).
- Помните, что при работе с дробями происходит потеря точности.

46
Q

Методы Number

A

Number.isFinite()
Number.isInteger()
Number.isNaN()
Number.isSafeInteger()
Number.parseFloat()
Number.parseInt()
Number.prototype.toExponential()
Number.prototype.toFixed()
Number.prototype.toLocaleString()
Number.prototype.toPrecision()
Number.prototype.toString()
Number.prototype.valueOf()

Number.isFinite(): Этот метод определяет, является ли переданное значение конечным числом. Возвращает true, если аргумент является конечным числом, иначе false.

Number.isInteger(): Проверяет, является ли переданное значение целым числом. Возвращает true, если аргумент является целым числом, иначе false.

Number.isNaN(): Проверяет, является ли переданное значение NaN (не числом). Возвращает true, если аргумент является NaN, иначе false.

Number.isSafeInteger(): Проверяет, является ли переданное значение безопасным целым числом. Безопасное целое число - это такое целое число, которое точно представимо в JavaScript без потери точности при использовании 64 бит двоичной арифметики. Возвращает true, если аргумент является безопасным целым числом, иначе false.

Number.parseFloat(): Парсит переданную строку и возвращает десятичное число. Аналог глобальной функции parseFloat(), но представлен в виде метода Number.

Number.parseInt(): Парсит переданную строку и возвращает целое число в соответствии с указанным основанием системы счисления. Аналог глобальной функции parseInt(), но представлен в виде метода Number.

Number.prototype.toExponential(): Возвращает строковое представление числа в экспоненциальной нотации.

Number.prototype.toFixed(): Возвращает строковое представление числа с фиксированным количеством знаков после запятой (определяемым параметром).

Number.prototype.toLocaleString(): Возвращает строковое представление числа с использованием локали (языка и региональных настроек).

Number.prototype.toPrecision(): Возвращает строковое представление числа с указанной точностью.

Number.prototype.toString(): Возвращает строковое представление числа в указанной системе счисления (по умолчанию десятичной).

Number.prototype.valueOf(): Возвращает примитивное значение числа объекта.

47
Q

Строки (тип данных и методы)

A

Есть три типа кавычек. Строки, использующие обратные кавычки, могут занимать более одной строки в коде и включать выражения ${…}.

Строки в JavaScript кодируются в UTF-16.

Есть специальные символы, такие как разрыв строки \n.

Для получения символа используйте [] или метод at.

Для получения подстроки используйте slice или substring.

Для того, чтобы перевести строку в нижний или верхний регистр, используйте toLowerCase/toUpperCase.

Для поиска подстроки используйте indexOf или includes/startsWith/endsWith, когда надо только проверить, есть ли вхождение.

str.trim() — убирает пробелы в начале и конце строки.
str.repeat(n) — повторяет строку n раз.

48
Q

Как сгенерировать рандомное число в заданном диапазоне min, max?

A
const randomNum = Math.floor(Math.random() * (max - min + 1) + min)
49
Q
A