Сверхбыстрые повторные упражнения по JavaScript
Введение
Готовитесь к предстоящему собеседованию или возвращаетесь к фронтенд-работе после долгого перерыва в другом месте?
Вы пришли в нужное место!
Каждый раздел этой статьи состоит из «упражнений», в которых рассматриваются часто используемые операции JavaScript, а также интересные нюансы языка.
Имена переменных и методов преднамеренно короткие, чтобы свести к минимуму объем ввода, необходимый для выполнения упражнений с кодом.
Чем не является эта статья
Эта статья посвящена обучению на практике и не предлагает подробных объяснений используемых операций. Вам остается изучить эти операции более подробно самостоятельно.
Настраивать
Браузер
В Google Chrome откройте Инструменты разработчика и запустите JavaScript прямо в консоли:
Repl
Здесь я создал среду Node.js без необходимости что-либо устанавливать. Вы можете либо ввести свой код слева и запустить его, либо выполнить его прямо из терминала справа.
Я создал метод «o», который избавляет от необходимости повторно писать console.log(…):
Скачайте и установите Node.js
Если вы предпочитаете работать с локальной средой, установите Node.js:
Затем откройте терминал, введите «узел» и нажмите ENTER. Затем выполните свой код JavaScript. Выполнение JavaScript таким образом намного быстрее для изучения основных операций, так как вывод на консоль выполняется:
Если вы предпочитаете работать с файлами в IDE, используйте редактор, например VS Code:
Результаты кода
Я показываю ожидаемый результат справа с комментарием. Например:
Number.isInteger(1) // true
Для операций, вызывающих исключения, я использую эмодзи 🔥. Например:
Math.PI.toPrecision(0) // 🔥
Давайте начнем!
Струны
В этом упражнении мы будем использовать следующие постоянные строки:
const s = ‘Abc’ const t = ‘ def ‘
Корпус и длина
s // ‘Abc’ s.toLowerCase() // ‘abc’ s.toUpperCase() // ‘ABC’ s.length // 3
Извлечь символы
s[0] // ‘A’ s[s.length 1] // ‘c’ s[3] // undefined s[-1] // undefined s.substring(0,2) // ‘Ab’ s.substring(2) // ‘c’ s.substring(3) // ‘’ s.substring(-1) // ‘Abc’ s.substring(-3) // ‘Abc’
Конкатенация и интерполяция
s + t // ‘Abc def ‘ `s: ${s}` // ‘s: Abc’ `s: ${s} t: ${t}` // ‘s: Abc // t: def ‘
Удалить пробел
t.trimStart() // ‘def ‘ t.trimEnd() // ‘ def’ t.trim() // ‘def’
Проверьте начальные и конечные символы строки
s.startsWith(‘A’) // true s.startsWith(‘a’) // false s.endsWith(‘c’) // true s.endsWith(‘x’) // false
Извлечение частей строк
s.slice(0) // ‘Abc’ s.slice(1) // ‘bc’ s.slice(2) // ‘c’ s.slice(3) // ‘’ s.slice(0,1) // ‘A’ s.slice(0,2) // ‘Ab’ s.slice(1,2) // ‘b’ s.slice(1,3) // ‘bc’ s.slice(1,4) // ‘bc’ s.slice(-1) // ‘c’ s.slice(-2) // ‘bc’ s.slice(-3) // ‘Abc’ s.slice(-2,-1) // ‘b’ s.slice(-3,-2) // ‘A’ s.slice(-3,-1) // ‘Ab’ s.slice(2,1) // ‘’ s.slice(-2,-3) // ‘’
Stringify
String(true) // ‘true’ String(null) // ‘null’ String(undefined) // ‘undefined’
Сравнить строки
‘1’ < ‘2’ // true ‘2’ < ‘1’ // false ‘a’ < ‘b’ // true ‘b’ < ‘a’ // false ‘A’ < ‘b’ // true ‘a’ < ‘B’ // false ‘A’ < ‘B’ // true
Включает
s.includes(‘A’) // true s.includes(‘a’) // false
Поиск индекса
s.indexOf(‘A’) // 0 s.indexOf(‘a’) // 1 s.match(/A/g) // [‘A’] s.match(/a/g) // null const u = s.repeat(2) u.indexOf(‘A’) // 0 u.lastIndexOf(‘A’) // 3 u.indexOf(‘A’, 0) // 0 u.indexOf(‘A’, 1) // 3 u.indexOf(‘A’, 2) // 3 u.indexOf(‘A’, 3) // 3 u.indexOf(‘A’, 4) // 0 u.match(/A/g) // [‘A’,’A’]
Числа
Упражнение В этом упражнении мы будем использовать следующие постоянные числа и строки:
const a = 2 const b = ‘3’ const c = Math.PI const d = 123.456
Арифметика
a + 3 // 5 a 3 // 1 a * 2 // 4 a * 1.25 // 2.5 a / 2 // 1 a / 3 // 0.6666666666666666 a % 2 // 0 a % 3 // 2 a ** 2 // 4 a ** 1.5 // 2.82842712474619
Число в строку
d.toString() // ‘123.456’ `d: ${d}` // ‘d: 123.456’ null.toString() // 🔥 undefined.toString() // 🔥
Строка в число
Number.parseInt(a) // 2 Number.parseInt(d) // 123 Number.parseInt(a, 10) // 2 Number.parseInt(null) // NaN Number.parseInt(undefined) // NaN Number.parseFloat(a) // 2 Number.parseFloat(d) // 123.456 Number.parseFloat(null) // NaN Number.parseFloat(undefined) // NaN
Конкатенация строк вместо арифметической операции
a + b // ‘23’ a + parseInt(b) // 5
Преобразование числа в строку и округление до десятичных разрядов
c.toFixed() // ‘3’ c.toFixed(0) // ‘3’ c.toFixed(1) // ‘3.1’ c.toFixed(2) // ‘3.14’ c.toFixed(3) // ‘3.142’ d.toFixed() // ‘123’ d.toFixed(0) // ‘123’ d.toFixed(1) // ‘123.5’ d.toFixed(2) // ‘123.46’ d.toFixed(3) // ‘123.456’ d.toFixed(null) // ‘123’ d.toFixed(undefined) // ‘123’ d.toFixed(-1) // 🔥
Преобразование числа в строку и округление по значащим цифрам
a.toPrecision(1) // ‘2’ a.toPrecision(4) // ‘2.000’ c.toPrecision() // ‘3.141592653589793’ c.toPrecision(0) // 🔥 c.toPrecision(1) // ‘3’ c.toPrecision(2) // ‘3.1’ c.toPrecision(3) // ‘3.14’ d.toPrecision() // ‘123.456’ d.toPrecision(0) // 🔥 d.toPrecision(1) // ‘1e+2’ d.toPrecision(2) // ‘1.2e+2’ d.toPrecision(3) // ‘123’ d.toPrecision(undefined) // ‘123.456’ d.toPrecision(null) // 🔥 d.toPrecision(-1) // 🔥
Экспоненты
c.toExponential(0) // ‘3e+0’ c.toExponential(1) // ‘3.1e+0’ c.toExponential(2) // ‘3.14e+0’ d.toExponential(0) // ‘1e+2’ d.toExponential(1) // ‘1.2e+2’ d.toExponential(2) // ‘1.23e+2’ d.toExponential(null) // ‘1e+2’ d.toExponential(undefined) // ‘1.23456e+2’ d.toExponential(-1) // 🔥
Круглый, потолочный и напольный
Math.round(c) // 3 Math.floor(c) // 3 Math.ceil(c) // 4 Math.round(‘’) // 0 Math.round(‘2.5’) // 3 Math.round(‘a’) // NaN Math.round(null) // 0 Math.floor(null) // 0 Math.ceil(null) // 0 Math.round(undefined) // NaN
Преобразование числа в строку и округление по значащим цифрам
a.toPrecision(1) // ‘2’ a.toPrecision(4) // ‘2.000’ c.toPrecision() // ‘3.141592653589793’ c.toPrecision(0) // 🔥 c.toPrecision(1) // ‘3’ c.toPrecision(2) // ‘3.1’ c.toPrecision(3) // ‘3.14’ d.toPrecision() // ‘123.456’ d.toPrecision(0) // 🔥 d.toPrecision(1) // ‘1e+2’ d.toPrecision(2) // ‘1.2e+2’ d.toPrecision(3) // ‘123’ d.toPrecision(undefined) // ‘123.456’ d.toPrecision(null) // 🔥 d.toPrecision(-1) // 🔥 Exponentials c.toExponential(0) // ‘3e+0’ c.toExponential(1) // ‘3.1e+0’ c.toExponential(2) // ‘3.14e+0’ d.toExponential(0) // ‘1e+2’ d.toExponential(1) // ‘1.2e+2’ d.toExponential(2) // ‘1.23e+2’ d.toExponential(null) // ‘1e+2’ d.toExponential(undefined) // ‘1.23456e+2’ d.toExponential(-1) // 🔥
Круглый, потолочный и напольный
Math.round(c) // 3 Math.floor(c) // 3 Math.ceil(c) // 4 Math.round(‘’) // 0 Math.round(‘2.5’) // 3 Math.round(‘a’) // NaN Math.round(null) // 0 Math.floor(null) // 0 Math.ceil(null) // 0 Math.round(undefined) // NaN Math.floor(undefined) // NaN Math.ceil(undefined) // NaN
Числовой класс
Number(true) // 1 Number(false) // 0 Number(null) // 0 Number(undefined) // NaN Number(b) // 3 Number(d) // 123.456 Number(` ${a} `) // 2 Number(‘1,2’) // NaN Number(‘1 2’) // NaN Number(‘a’) // NaN
Проверка числа является целым числом
Number.isInteger(1) // true Number.isInteger(2.5) // false Number.isInteger(‘1’) // false Number.isInteger(null) // false Number.isInteger(undefined) // false
Большие и маленькие числа
Number.MAX_VALUE // 1.7976931348623157e+308 Number.MIN_VALUE // 5e-324 Number.POSITIVE_INFINITY // Infinity 1/0 // Infinity Number.NEGATIVE_INFINITY // Infinity 1/0 // Infinity
логический
Стандарт против строгого равенства
2 == '2' // true 2 === '2' // false '' == 0 // true '' === 0 // false 1 == true // true 1 === true // false 0 == false // true 0 === false // false null == undefined // true null === undefined // false
Равенство ссылки на объект
class Book { constructor(title) { this.title = title } } const book1 = new Book('Drills in JavaScript') const book2 = new Book('Drills in JavaScript') book1 == book1 // true book1 === book1 // true book1 == book2 // false book1 === book2 // false const book3 = book1 book1 == book3 // true book1 === book3 // true
Строка для логического значения
Boolean('test') // true Boolean('true') // true Boolean('false') // true Boolean('') // false
Число в логическое значение
Boolean(2) // true Boolean(0) // false Boolean(-1) // true
Массив в логическое значение
Boolean(['a']) // true Boolean([]) // true
Объект для логического значения
Boolean({}) // true Boolean(null) // false Boolean(undefined) // false
Резюме правды и лжи
const j = (x) => x ? true : false j(1); // true j([]); // true j('1'); // true j(true); // true j({}); // true j(0) // false j(NaN) // false j('') // false j(false) // false j(null) // false j(undefined) // false
Функции
В этом упражнении мы исследуем функции Javascript и рассмотрим поток управления, основы итерации, операторы переключения и обработку ошибок, а несколько примеров приведены ниже.
Арифметика
let a = (x,y) => { return x + y } let b = (x,y) => { return x - y } let c = (x,y) => { return x * y } let d = (x,y) => { return x / y } a(2,3) // 5 b(2,3) // -1 c(2,3) // 6 d(2,3) // 0.6666666666666666
Суммирование с forEach
const n = [1,2,3] let x = 0 n.forEach(function(y){ x += y }) x // 6
Основы потока управления
const f = x => { if (x === 2) { return 'a' } else if (x === 1) { return 'b' } else { return 'c' } } f(2) // 'a' f(1) // 'b' f(0) // 'c'
Управление потоком с помощью переключателя
function f(x) { switch(x) { case 1: return 'a' case 0: return 'b' default: return 'c' } } f(1) // 'a' f(0) // 'b' f(-1) // 'c'
Переключение с несколькими значениями для проверки
function f(x,y) { switch(true) { case x * y > 4: return 'a' break case x * y > 2: return 'b' break default: return 'c' } } f(2,3) // 'a' f(2,2) // 'b' f(1,0) // 'c'
Проверка нулевых параметров
function f(x,y) { if (y) { console.log(`x: ${x}, y: ${y}`) } else { console.log(`x: ${x}`) } } f('a','b') // 'x: a, y: b' f('a') // 'x: a'
Стрелочные функции
let f = x => x >= 0 f(3) // true f(-1) // false let g = (x,y) => x / y g(8,2) // 4 g(1,3) // 0.3333333333333333
Теринарный оператор
const f = x => (x < 10) ? true : false f(5) // true f(15) // false
Try-Catch на блоке кода
function f() { try { throw 'e' } catch (e) { console.log(e) } } f() // 'e'
Моделирование вызова функции, который иногда не работает
const f = (x) => { try { g() } catch(e) { console.log(`${x} failed: ${e}`) } } function g() { var x = Math.random() <= 0.1 if (x) { throw 'error' } } for (let i = 0; i < 10; i++) { f(i); } // 2 failed: error // 8 failed: error
Stringify
function f() { return true } String(f) // 'function f() { return true }'
Массивы
В этом упражнении мы рассмотрим итерации и манипулирование значениями массива, а также некоторые ценные методы для выполнения операций фильтрации и проверки выполнения условий. Мы также будем использовать оператор расширения Javascript для объединения двух массивов, разделения строк на массивы и объединения элементов массива в строки.
Давайте начнем с определения переменных, к которым мы еще вернемся в этом упражнении, чтобы запомнить операции с массивами:
const m = ['a','b','c','d'] const n = [1,2,3] const s = 'A;b;c'
Доступ к массиву
m // ['a','b','c','d'] m.length // 4 m[0] // 'a' m[1] // 'b' m[4] // undefined m[m.length - 1] // 'd' m[m.length - 2] // 'c'
Удалить элементы
m.pop() // 'd' m // ['a','b','c'] m.splice(2,99) // ['c'] m // ['a','b'] m.shift() // 'a' m // ['b']
Добавить элементы
m.push('e') // 2 m // ['b','e'] m.unshift('g','h') // 4 m // ['g','h','b','e']
Очистить массив
m.length = 0 m // []
Оператор спреда
const f = (x) => [...x] f('c') // ['c'] f('ab') // ['a','b']
Деконструкция массива
const y = ['a', 1] const [a, b] = y a // 'a' b // 1
Объединение массивов с помощью оператора Spread
const a = ['a'] const b = ['b'] const c = [...'ab'] [...a, ...b] // ['a','b'] c // ['a','b']
Найдите среднее число, используя ForEach
function f(m){ let x = 0 m.forEach(y => { x += y }) return Math.round(x / m.length) } f([1,2,3]) // 2
Найти индекс записи
const f = (x) => x === 2 const g = (x) => x === 5 n.findIndex(f) // 1 n.findIndex(g) // -1
Фильтровать записи
n.filter(x => x > 1) // [2,3] n.filter(x => x < 1) // []
Найдите подходящую запись
n.find(x => x === 1) // 1 n.find(x => x === 0) // undefined n.find(x => x > 0) // 1 n.find(x => x > 1) // 2
Обратные элементы
n.reverse() // [3,2,1]
Проверить, выполнены ли условия
n.every(x => x > 0) // true n.every(x => x > 1) // false n.includes(1) // true n.includes(4) // false
Создайте массив из переменного количества аргументов
Array.of(1) // [1] Array.of(1,2,3) // [1,2,3]
Разделить строку на массив
'a,b,c'.split(',') // ['a','b','c'] 'a,b,c'.split('.') // ['a,b,c']
карта
const t = s.split(';') t.map(x => x.toUpperCase()) // ['A','B','C'] t.map(x => x.toLowerCase()) // ['a','b','c']
Уменьшать
const m = [2, 4, 2] m.reduce((x, y) => x * y, 2) // 32
Объединение элементов массива в строку
n.join('|') // 1|2|3
Конкатенация с forEach
const f = x => { let s = '' x.forEach((y) => { s += `${y} ` }) return s } f([1,2,3]) // '1 2 3'
Строковые массивы
String(n) // '1,2,3' String([['a','b'],n]) // 'a,b,1,2,3'
Математическая библиотека
Встроенный в JavaScript объект Math содержит константы и методы, позволяющие выполнять числовые операции. Все свойства и методы являются статическими.
Усечение чисел
const trunc = (x) => Math.trunc(x) trunc(1) // 1 trunc(Math.PI) // 3
Круглый, потолочный и напольный
Math.round(1.4) // 1 Math.round(1.5) // 2 Math.floor(1.9) // 1 Math.ceil(1.1) // 2 Math.round(null) // 0 Math.floor(null) // 0 Math.ceil(null) // 0
Полномочия, корни и абсолютная ценность
const abs = (x) => Math.abs(x) const pow = (x,y) => Math.pow(x,y) const sqrt = (x) => Math.sqrt(x) const cbrt = (x) => Math.cbrt(x)
Работа с математическими статическими свойствами
const {PI} = Math const pow = (x,y) => Math.pow(x,y) const area = (r) => (4 * PI * pow(r,2)) .toFixed(2) area(5) // '314.16'
Максимум и минимум
const a = [-1,1,2] Math.min(...a) // -1 Math.max(...a) // 2 Math.min(-1,1,2) // -1 Math.max(-1,1,2) // 2
Знак
const s = (x) => Math.sign(x) s(2) // 1 s(-2) // -1
Экспонента и логарифм
const exp = (x) => Math.exp(x) const log = (x) => Math.log(x) const log10 = (x) => Math.log10(x) const log2 = (x) => Math.log2(x) exp(1) // 2.718281828459045 log(Math.E) // 1 log10(10) // 1 log2(4) // 2
Случайный
const rand = () => Math.random() const ceil = (x) => Math.ceil(x) const tossCoin = () => ceil(rand() * 2) let heads = 0, tails = 0 for (let i = 0; i < 100; i++) { const result = tossCoin() if (result === 1) heads++ if (result === 2) tails++ } console.log(heads) // 52 console.log(tails) // 48
JSON
Мы можем переместить преобразование из объекта Javascript в JSON с помощью метода stringify и в другом направлении с помощью метода parse.
Преобразование строки JSON в объект Javascript
const x = JSON.parse( "\{\"a\":\"1\",\"b\":\"2\",\"c\":{\"d\":\"3\"}}") x.a // '1' x.b // '2' x.c.d // '3'
Преобразовать объект Javascript в строку JSON
const x = { a: "1", b: "2", c: { d: "3" } } JSON.stringify(x) // '{"a":"1","b":"2","c":{"d":"3"}}'
Итерация
const f = x => { let s = "" x.forEach((y) => { s += `${y.a}:${y.b};` }) return s; } const x = { a:"1", b:"2" } const y = { a:"3", b:"4" } f([x,y]) // '1:2;3:4;'
Классы и объекты
В этом упражнении мы будем повторно использовать следующий класс, функцию и константу:
class A { constructor(x,y) { this.x = x this.y = y this.m = [] } get p() { return (this.x * this.y) > 10 } get q() { return `x: ${this.x}, y: ${this.y}` } r(x) { this.m.push(x) } s(x) { return this.m.includes(x) } } function B(x,y) { this.x = x this.y = y } const c = { p: 'a', q: { r: 1, s: 2 } }
Проверка на равенство
1 == '1'; // true 1 == [1]; // true '1' == [1]; // true 1 === '1'; // false 1 === [1]; // false '1' === [1]; // false
Доступ к значениям
c.p; // 'a' c.q.r; // 1 c.q.s; // 2 Object.keys(c); // [ 'p','q' ] Object.values(c); // ['a',{ r: 1,s: 2 }] c['p']; // 'a' c['q']; // { r: 1, s: 2 } c['q']['r'] // 1 c['q']['s'] // 2
Объединение объектов
const d = { q: 'c' }; console.log({ ...c, ...d }) // { p: 'a', q: 'c' }
Разрушение объектов
const { p, q, r ='r' } = c; p; // 'a' q; // { r: 1, s: 2 } r; // 'r'
Экземпляры класса
const a1 = new A(1,2) const a2 = new A(3,4) a1.x // 1 a1.y // 2 a2.x // 3 a2.y // 4 a1.p // false a2.p // true a1.q // x: 1, y: 2 a2.q // x: 3, y: 4 a1.s(1) // true a1.s(3) // false
Наследование
B.prototype.r = function() { return `x: ${this.x}, y: ${this.y}` } b = new B(1,2) b.r() // x: 1, y: 2 class E extends B { r() { return 'r'; }; s() { return 3; }; } const e = new E(); e.r() // 'r' e.s() // 3
Настройка свойств объекта
const f = (x) => { x.find(z => z.a === 2).b = true return x } const x = [{ a: 1, b: true }, { a: 2, b: false }] f(x) // [ // { a: 1, b: true }, // { a: 2, b: true } // ]
Печать значений свойств объекта
const f = (x) => { let s = x.map(z => z.a) return s.join(' ') } const x = [{ a: 1, b: true }, { a: 2, b: false }] f(x) // '1 2' const h = (x, z) => { const y = { "a": `1 ${x}`, "b": `2 ${x}` } return y[z.p] } const a = { p: 'a' } const b = { p: 'b' } h('a', a) // '1 a' h('b', b) // '2 b' const i = x => { const y = { 1: "a", 2: "b" } return y[x] || 'error' } i(1) // 'a' i(2) // 'b' i(3) // 'error' const array = []typeof array === 'object' // true array.constructor === Array // true Object.prototype.toString.apply(array) === '[object Array]' // true
Не число
typeof NaN === 'number' // true NaN === NaN // false NaN !== NaN // true isNaN(NaN) // true
Сортировка и массив объектов
const m = [ { 'a': 't', 'b': 2 }, { 'a': 'r', 'b': 1 }, { 'a': 's', 'b': 3 } ] const k = function(x) { return function(y, z) { if (!y || !z || typeof y !== 'object' || typeof z !== 'object') return const a = y[x], b = z[x] if (a === b) return 0 if (typeof a === typeof b) return a < b ? -1 : 1 return typeof a < typeof b ? -1 : 1 } } m.sort(k('a')) // [ // { a: 'r', b: 1 }, // { a: 's', b: 3 }, // { a: 't', b: 2 } // ] m.sort(k('b')) // [ // { a: 'r', b: 1 }, // { a: 't', b: 2 }, // { a: 's', b: 3 } // ]
Проверка объекта на наличие свойства
const x = { a: 1 } const y = Object.create(x) x.hasOwnProperty('a') // true y.hasOwnProperty('a') // false x.a // 1 y.a // 1
Спасибо за прочтение! Дайте мне знать, что вы думаете в разделе комментариев ниже, и не забудьте подписаться 👍