на самом деле всё немного сложнее
== сравнивает, приводя типы друг к другу
=== не приводит типы друг к другу
чтобы получить pure component в функциональном компоненте нужно его весь завернуть в React.memo
code_notes
Why Do We Write super(props) super(props) ссылается к родительскому конструктору. привязывает родительские методы к дочернему элементу если мы не прокидываем props, то они всё равно привяжутся из родительского конструктора, но только после того, как весь…
до объявления super мы не можем использовать this
Function Declaration
Function Expression
function sum(a, b) {
let result = a + b;
return result;
}Function Expression
let sum = function(a, b) {
let result = a + b;
return result;
};свойства объекта упорядочены особым образом: свойства с целочисленными ключами сортируются по возрастанию, остальные располагаются в порядке создания
(термин «целочисленное свойство» означает строку, которая может быть преобразована в целое число и обратно без изменений.)
(термин «целочисленное свойство» означает строку, которая может быть преобразована в целое число и обратно без изменений.)
let codes = {
"49": "Германия",
"41": "Швейцария",
"44": "Великобритания",
// ..,
"1": "США"
};
for (let code in codes) {
alert(code); // 1, 41, 44, 49
}1. при копировании переменной, указывающей на объект, копируется ссылка на объект
let user = { name: "John" };
let admin = user; // копируется ссылка
2. объекты равны только если это один и тот же объектuser === admin // true3. способы нормально скопировать объект
let a = {};
let b = {}; // два независимых объекта
alert( a == b ); // false
let user = {
name: "John",
age: 30
};
- let clone = Object.assign({}, user);
- let clone2 = { ...user }
- let clone3 = JSON.parse(JSON.stringify(user))
!глубокое клонирование!
- let clone4 = _.cloneDeep(user);
https://lodash.com/docs/4.17.15#cloneDeep
4. проверить объект на пустотуObject.keys(user).length == 0
убрать повторяющиеся элементы массива
1. arr.filter((el, index) => arr.indexOf(el) >= index)
2. Array.from(new Set(arr))
Symbol
примитивный тип данных
все символы уникальны
примитивный тип данных
все символы уникальны
let id1 = Symbol("id");
let id2 = Symbol("id");
alert(id1 == id2); // false
Symbol можно использовать как ключ в объекте:let id = Symbol("id");
let user = {
name: "Егор",
[id]: 123
};
прочитать все символы объекта:Object.getOwnPropertySymbols(obj)
Global symbol registry
чтобы символы с одинаковыми именами были одной сущностью нужно использовать глобальный реестр символов
запись:
the symbol registry is mostly built by JavaScript's compiler infrastructure, and the symbol registry's content is not available to JavaScript's run-time infrastructure
чтобы символы с одинаковыми именами были одной сущностью нужно использовать глобальный реестр символов
запись:
const id = Symbol.for("id")
чтение:const first = Symbol.keyFor(id)
const second = Symbol.keyFor(id)
first === second // true
the symbol registry is mostly built by JavaScript's compiler infrastructure, and the symbol registry's content is not available to JavaScript's run-time infrastructure
если нам требуется создать много однотипных объектов, мы должны использовать функцию-конструктор и оператор
new
const User = function(name) {
this.name = name;
this.isAdmin = false;
}
const masha = new User("Masha");// { name: "Masha", isAdmin: false }Свойство length автоматически обновляется при изменении массива. Если быть точными, это не количество элементов массива, а наибольший цифровой индекс плюс один.
let fruits = [];
fruits[123] = "Яблоко";
alert( fruits.length ); // 124
Map – это коллекция ключ/значение, как и
Object. Но основное отличие в том, что Map позволяет использовать ключи любого типа.Веб-документация MDN
Map
Объект Map содержит пары ключ-значение и сохраняет порядок вставки.
вот так можно создать Map из object
let obj = {
name: "John",
age: 30
};
let map = new Map(Object.entries(obj));вот так можно создать object из Map:
let map = new Map();
map.set('banana', 1);
map.set('orange', 2);
map.set('meat', 4);
let obj = Object.fromEntries(map);
// готово!
// obj = { banana: 1, orange: 2, meat: 4 }
alert(obj.orange); // 2timestamp — целое число, представляющее собой количество миллисекунд, прошедших с начала 1970 года
const stamp = 999999999276;из таймстампа можно легко получить дату:
new Date(stamp);а из даты можно сделать таймстамп:
// Sun Sep 09 2001 05:46:39 GMT+0400 (Moscow Summer Time)
new Date().getTime()
// 1565845435771
рекурсия
функция, которая вызывает сама себя.
любую рекурсию можно представить в виде цикла.
код легче читать и поддерживать, но выполняется медленнее, чем цикл.
функция, которая вызывает сама себя.
любую рекурсию можно представить в виде цикла.
код легче читать и поддерживать, но выполняется медленнее, чем цикл.
const pow = (x, n) => {
if (n === 1) return x
return x * pow (x - 1)
}
pow(2, 3) // 8
pow(2, 5) // 32функция навсегда запоминает ссылку на лексическое окружение, где она была создана. И [[Environment]] – скрытое свойство функции, которое содержит эту ссылку
В программировании есть общий термин: «замыкание», – которое должен знать каждый разработчик.
Замыкание – это функция, которая запоминает свои внешние переменные и может получить к ним доступ. В некоторых языках это невозможно, или функция должна быть написана специальным образом, чтобы получилось замыкание. Но, как было описано выше, в JavaScript, все функции изначально являются замыканиями, кроме функций, объявленных через new Function().
(Функции, объявленные через new Function, имеют [[Environment]], ссылающийся на глобальное лексическое окружение, а не на родительское. Это позволяет избежать проблем при минификации.)
То есть, они автоматически запоминают, где были созданы, с помощью скрытого свойства [[Environment]] и все они могут получить доступ к внешним переменным.
Когда на собеседовании фронтенд-разработчик получает вопрос: «что такое замыкание?», – правильным ответом будет определение замыкания и объяснения того факта, что все функции в JavaScript являются замыканиями, и, может быть, несколько слов о технических деталях: свойстве [[Environment]] и о том, как работает лексическое окружение.