👉 @frontendInterview
Если вас интересует карьерный рост в сфере фронтенд-разработки, то канал "Frontend Interview - собеседования по Javascript / Html / Css" идеально подойдет для вас. Здесь вы найдете все необходимые материалы и советы для успешного прохождения собеседований по front-end технологиям.
Администраторы канала готовы помочь вам в подготовке к собеседованиям и ответить на любые вопросы. Для сотрудничества и рекламы вы можете обратиться к администраторам @seniorFrontPromo и @maria_seniorfront. Если вам нужна информация о размещении рекламы, то обратитесь к менеджеру по рекламе @Spiral_Yuri.
Не упустите возможность купить рекламное место на канале "Frontend Interview - собеседования по Javascript / Html / Css" и привлечь внимание целевой аудитории. Поднимите свои навыки фронтенд-разработки на новый уровень с помощью этого информативного и полезного ресурса!
25 Jan, 09:03
24 Jan, 08:00
24 Jan, 06:00
23 Jan, 16:02
22 Jan, 09:02
const array = [5, undefined, 0, false, '', null, true, 1]
array[15] = 'новый элемент'
console.log(array)
// [ 5, undefined, 0, false, '', null, true, 1, <7 empty items>, 'новый элемент']
const test = new Array(5)
test[2] = 42
2 in test // true
test.hasOwnProperty(2) // true
0 in test // false
test.hasOwnProperty(0) // false
const test = new Array(5)
test[2] = 42
test.forEach((value, key) => console.log(`значение по ключу ${key}: ${value}`))
// значение по ключу 2: 42
// консоль вывела значение только один раз
const calcEmpty = items => items.reduce(amount => --amount, items.length)
const test = new Array(5)
test[2] = 42
calcEmpty(test) // 4
test[10] = 2
calcEmpty(test) // 9
21 Jan, 15:14
20 Jan, 09:02
ref
(сокращение от reference) используется для доступа к DOM-элементам или компонентам напрямую. Он позволяет взаимодействовать с элементами, которые были созданы в процессе рендеринга, предоставляя механизм для манипуляции с ними, получения их размеров, положения или вызова методов у компонент. Это особенно полезно в ситуациях, когда необходимо выполнить операции, которые не могут быть выполнены исключительно через декларативный подход React.import React, { useRef, useEffect } from 'react';
function TextInputWithFocusButton() {
const inputEl = useRef(null);
const onButtonClick = () => {
// Установить фокус на текстовое поле
inputEl.current.focus();
};
return (
<div>
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>Установить фокус</button>
</div>
);
}
export default TextInputWithFocusButton;
import React, { useRef, useEffect, useState } from 'react';
function MeasureDiv() {
const divRef = useRef(null);
const [dimensions, setDimensions] = useState({ width: 0, height: 0 });
useEffect(() => {
if (divRef.current) {
const { width, height } = divRef.current.getBoundingClientRect();
setDimensions({ width, height });
}
}, []);
return (
<div>
<div ref={divRef} style={{ width: '100px', height: '100px', backgroundColor: 'lightblue' }}>
Измеряемый элемент
</div>
<p>Ширина: {dimensions.width}px, Высота: {dimensions.height}px</p>
</div>
);
}
export default MeasureDiv;
import React, { Component } from 'react';
class CustomComponent extends Component {
customMethod() {
console.log('Метод компонента вызван');
}
render() {
return <div>Custom Component</div>;
}
}
class ParentComponent extends Component {
constructor(props) {
super(props);
this.customComponentRef = React.createRef();
}
handleClick = () => {
this.customComponentRef.current.customMethod();
};
render() {
return (
<div>
<CustomComponent ref={this.customComponentRef} />
<button onClick={this.handleClick}>Вызвать метод компонента</button>
</div>
);
}
}
export default ParentComponent;
ref
следует использовать для случаев, которые не могут быть решены этим способом.19 Jan, 16:04
consonantCount('') => 0
consonantCount('aaaaa') => 0
consonantCount('XaeiouX') => 2
19 Jan, 10:04
18 Jan, 16:02
// webpack.config.js
module.exports = {
entry: './src/index.js',
};
// webpack.config.js
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
},
};
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
},
},
},
],
},
};
18 Jan, 09:05
16 Jan, 16:08
15 Jan, 14:00
14 Jan, 15:00
13 Jan, 09:07
<script>
тег, который будет выполнен браузером и может украсть данные пользователей или выполнить другие вредоносные действия.const userInput = "<img src='x' onerror='alert(\"XSS Attack\")'>";
document.getElementById('output').innerHTML = userInput;
const invalidHTML = "<div>Unclosed tag";
document.getElementById('output').innerHTML = invalidHTML;
// Это может привести к неправильному отображению содержимого.
createElement
, appendChild
, textContent
и другие. Эти методы позволяют безопасно добавлять элементы и текст в DOM.const userInput = "Safe text";
const outputElement = document.getElementById('output');
const textNode = document.createTextNode(userInput);
outputElement.appendChild(textNode);
const userInput = "<div>Safe content</div>";
const outputElement = document.getElementById('output');
outputElement.textContent = userInput;
// Использование textContent гарантирует безопасное добавление текста.
const userInput = "Some user-provided text";
const outputElement = document.getElementById('output');
outputElement.textContent = userInput;
const userInput = "Some user-provided text";
const outputElement = document.getElementById('output');
const paragraph = document.createElement('p');
paragraph.textContent = userInput;
outputElement.appendChild(paragraph);
12 Jan, 10:03
12 Jan, 09:04
"CodEWaRs" --> [0,3,4,6]
11 Jan, 16:07
11 Jan, 09:02
09 Jan, 16:06
08 Jan, 09:03
*
. Этот селектор выбирает все элементы в документе.* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
margin
) и внутренние отступы (padding
) всех элементов на странице до нуля. Это часто делается для того, чтобы избежать неожиданных отступов, которые могут быть заданы по умолчанию браузером. Также устанавливается box-sizing: border-box
, что изменяет модель коробки элемента, позволяя лучше контролировать размеры элементов при добавлении отступов и границ.06 Jan, 14:40
06 Jan, 12:40
06 Jan, 09:02
visibility
. Это свойство может принимать несколько значений, но основными для скрытия элемента являются visible
и hidden
..hidden-element {
visibility: hidden;
}
visibility: visible;
, что означает, что они видимы на странице.visibility: hidden;
, он становится невидимым, но продолжает занимать то же пространство в макете страницы, что и когда он был видимым.<div>
с классом hidden-element
скрыт, но продолжает занимать место на странице. Третий <div>
расположен после него, как если бы скрытый элемент был видимым.<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
.hidden-element {
visibility: hidden;
}
.visible-element {
background-color: lightblue;
padding: 20px;
}
</style>
</head>
<body>
<div class="visible-element">Этот элемент видим.</div>
<div class="hidden-element">Этот элемент скрыт, но сохраняет место.</div>
<div class="visible-element">Этот элемент тоже видим и расположен после скрытого элемента.</div>
</body>
</html>
display: none;
opacity: 0;
05 Jan, 16:07
['hello', 'world', 'this', 'is', 'great'] => 'hello world this is great'
05 Jan, 10:04
04 Jan, 16:04
04 Jan, 09:03
02 Jan, 16:02
01 Jan, 09:02
31 Dec, 16:08
30 Dec, 09:02
${}
.const name = 'Alice';
const age = 25;
const greeting = `Hello, my name is ${name} and I am ${age} years old.`;
console.log(greeting);
// Вывод: Hello, my name is Alice and I am 25 years old.
\n
).const multiLineString = `This is a string
that spans across
multiple lines.`;
console.log(multiLineString);
// Вывод:
// This is a string
// that spans across
// multiple lines.
const a = 5;
const b = 10;
const result = `The sum of ${a} and ${b} is ${a + b}.`;
console.log(result);
// Вывод: The sum of 5 and 10 is 15.
function toUpperCase(str) {
return str.toUpperCase();
}
const name = 'Alice';
const loudGreeting = `Hello, ${toUpperCase(name)}!`;
console.log(loudGreeting);
// Вывод: Hello, ALICE!
function tag(strings, ...values) {
console.log(strings);
console.log(values);
return 'Tagged template';
}
const name = 'Alice';
const age = 25;
const taggedResult = tag`Name: ${name}, Age: ${age}`;
console.log(taggedResult);
// Вывод:
// [ 'Name: ', ', Age: ', '' ]
// [ 'Alice', 25 ]
// Tagged template
29 Dec, 16:03
["Telescopes", "Glasses", "Eyes", "Monocles"] // ["Eyes", "Glasses", "Monocles", "Telescopes"]
29 Dec, 10:03
28 Dec, 16:07
28 Dec, 09:09
26 Dec, 16:09
25 Dec, 09:02
23 Dec, 09:02
function greet(name) {
return `Hello, ${name}!`;
}
function executeFunction(fn, arg) {
return fn(arg);
}
const result = executeFunction(greet, 'Alice');
console.log(result); // "Hello, Alice!"
greet
передается по ссылке в функцию executeFunction
, которая затем вызывает greet
с аргументом Alice
.function add(x) {
return function(y) {
return x + y;
};
}
const addFive = add(5);
console.log(addFive(3)); // 8
function fetchData(callback) {
setTimeout(() => {
const data = { name: 'Alice' };
callback(data);
}, 1000);
}
function handleData(data) {
console.log(`Received data: ${data.name}`);
}
fetchData(handleData);
map
, filter
, reduce
, принимают функции в качестве аргументов для обработки элементов массива.const numbers = [1, 2, 3, 4, 5];
const squared = numbers.map(num => num * num);
console.log(squared); // [1, 4, 9, 16, 25]
this
) может измениться. Это особенно актуально для методов объектов.const person = {
name: 'Alice',
greet() {
console.log(`Hello, ${this.name}`);
}
};
const greet = person.greet;
greet(); // undefined, так как контекст потерян
const boundGreet = person.greet.bind(person);
boundGreet(); // Hello, Alice
function createCounter() {
let count = 0;
return function() {
count++;
return count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
22 Dec, 16:08
"a" = 1, "b" = 2
Input = "The sunset sets at twelve o' clock."
Output = "20 8 5 19 21 14 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 3 12 15 3 11"
22 Dec, 10:03
21 Dec, 16:02
<menu>
<li>
<button onclick="signIn()">Войти</button>
</li>
<li>
<button onclick="signUp()">Зарегистрироваться</button>
</li>
</menu>
21 Dec, 09:04
19 Dec, 16:03
17 Dec, 16:00
div {
rotate: 30deg;
}
.element {
rotate: x 90deg;
}
.element {
rotate: 0 0 1 45deg;
}
16 Dec, 16:00
16 Dec, 09:06
15 Dec, 16:02
[1, 1, 2] ==> 2
[17, 17, 3, 17, 17, 17, 17] ==> 3
15 Dec, 10:03
14 Dec, 16:04
function reverseString(str) {
return str.split('').reverse().join('');
}
console.log(reverseString('hello')); // 'olleh'
function reverseString(str) {
let reversed = '';
for (let i = str.length - 1; i >= 0; i--) {
reversed += str[i];
}
return reversed;
}
console.log(reverseString('hello')); // 'olleh'
function reverseString(str) {
if (str === '') {
return '';
} else {
return reverseString(str.substr(1)) + str[0];
}
}
console.log(reverseString('hello')); // 'olleh'
function reverseString(str) {
return [...str].reduce((acc, char) => char + acc, '');
}
console.log(reverseString('hello')); // 'olleh'
function reverseString(str) {
return Array.from(str).reduceRight((acc, char) => acc + char, '');
}
console.log(reverseString('hello')); // 'olleh'
24 Nov, 16:03
health <= 0
. Fighter
. Смотрите ниже класс Fighter
на выбранном вами языке.health
и damagePerAttack
за атаку будут целыми числами, большими 0. Вы можете мутировать объекты Fighter
. declare_winner(Fighter("Lew", 10, 2), Fighter("Harry", 5, 4), "Lew") => "Lew"
Lew attacks Harry; Harry now has 3 health.
Harry attacks Lew; Lew now has 6 health.
Lew attacks Harry; Harry now has 1 health.
Harry attacks Lew; Lew now has 2 health.
Lew attacks Harry: Harry now has -1 health and is dead. Lew wins.
function Fighter(name, health, damagePerAttack) {
this.name = name;
this.health = health;
this.damagePerAttack = damagePerAttack;
this.toString = function() { return this.name; }
}
24 Nov, 10:03
23 Nov, 16:03
@media
для проверки пользовательских настроек. Отслеживает выбор настроек контрастности в системе.@media (prefers-contrast: more) {
.dialog {
border: 2px solid #FFFFFF;
}
}
23 Nov, 09:03
22 Nov, 08:00
21 Nov, 16:03
20 Nov, 13:00
20 Nov, 09:00
18 Nov, 12:02
18 Nov, 09:02
const input = document.querySelector('.input')
input.addEventListener('change', function (event) {
console.log(event.target.value)
})
17 Nov, 16:03
[], false, '', new Array(), null, NaN, undefined, 0, -0, 0n, -0n, '0'.
compareTrash(0, false) => false
compareTrash('', '') => true
compareTrash([], 0) => false
17 Nov, 10:03
16 Nov, 16:05
false
. Эти значения часто используются в условиях (например, в if
выражениях) для проверки истинности или ложности.false
является ложным.if (false) {
console.log('Это не выполнится');
}
if (0) {
console.log('Это не выполнится');
}
if (-0) {
console.log('Это тоже не выполнится');
}
if ("") {
console.log('Это не выполнится');
}
if (null) {
console.log('Это не выполнится');
}
if (undefined) {
console.log('Это не выполнится');
}
if (NaN) {
console.log('Это не выполнится');
}
16 Nov, 09:02
14 Nov, 16:03
13 Nov, 09:02
12 Nov, 16:00
11 Nov, 09:02
DocumentFragment
, а затем добавьте фрагмент в DOM одним действием.const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {
const div = document.createElement('div');
div.textContent = `Item ${i}`;
fragment.appendChild(div);
}
document.body.appendChild(fragment);
element.style.width = '100px';
element.style.height = '100px';
element.style.backgroundColor = 'red';
.new-style {
width: 100px;
height: 100px;
background-color: red;
}
offsetHeight
или offsetWidth
, после изменения стилей, заставляет браузер выполнять немедленную перерисовку. Избегайте таких действий..animated {
transition: transform 0.3s;
transform: translateX(100px);
}
resize
или scroll
), чтобы уменьшить количество вызовов обработчиков событий.function debounce(func, wait) {
let timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, args), wait);
};
}
window.addEventListener('resize', debounce(() => {
console.log('Resized!');
}, 200));
const height = element.offsetHeight;
element.style.height = out;
const height = element.offsetHeight;
element.style.height = ${height + 10}px;
.will-change-transform {
will-change: transform;
}
10 Nov, 18:07
findUniq([ 'Aa', 'aaa', 'aaaaa', 'BbBb', 'Aaaa', 'AaAaAa', 'a' ]) // => 'BbBb'
findUniq([ 'abc', 'acb', 'bac', 'foo', 'bca', 'cab', 'cba' ]) // => 'foo'
10 Nov, 10:02
09 Nov, 16:02
style="color: red;"
) имеют самую высокую специфичность.#header
)..class
, [type="text"]
, :hover
).div
, h1
, ::before
).#main-content
— (0, 1, 0, 0).article p
— (0, 0, 1, 1)header h1 span
— (0, 0, 0, 3)div#main .content .text
— (0, 1, 2, 1)<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Пример специфичности</title>
<style>
p {
color: black; /* (0, 0, 0, 1) */
}
.text {
color: blue; /* (0, 0, 1, 0) */
}
#highlight {
color: red; /* (0, 1, 0, 0) */
}
p#highlight {
color: green; /* (0, 1, 0, 1) */
}
</style>
</head>
<body>
<p class="text" id="highlight">Этот текст будет зелёным.</p>
</body>
</html>
<p>
элемент действует несколько селекторов с разной специфичностью:p
имеет специфичность (0, 0, 0, 1).text
имеет специфичность (0, 0, 1, 0)#highlight
имеет специфичность (0, 1, 0, 0)p#highlight
имеет специфичность (0, 1, 0, 1)p#highlight
имеет наивысшую специфичность (0, 1, 0, 1), он применяет стиль цвета зелёный.08 Nov, 17:45
06 Nov, 14:00
06 Nov, 09:02
05 Nov, 16:02
04 Nov, 12:02
z-index
работал, элемент должен иметь установленное значение position
, отличное от static
(например, relative
, absolute
, fixed
или sticky
). Без этого z-index
не будет применяться.z-index
принимает целые числа, включая отрицательные. Элементы с более высоким значением z-index
будут отображаться поверх элементов с более низким значением.<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Пример z-index</title>
<style>
.box {
position: absolute;
width: 100px;
height: 100px;
}
.box1 {
background-color: red;
z-index: 1;
top: 50px;
left: 50px;
}
.box2 {
background-color: blue;
z-index: 2;
top: 80px;
left: 80px;
}
</style>
</head>
<body>
<div class="box box1"></div>
<div class="box box2"></div>
</body>
</html>
z-index: 1
, а синий квадрат — z-index: 2
. Поскольку значение z-index
у синего квадрата выше, он будет отображаться поверх красного.03 Nov, 16:02
solution(["no", "dog", "on", "good"]) => false
solution(["engine", "endure", "elite"]) => true
30 Oct, 20:00
30 Oct, 16:00
30 Oct, 13:11
30 Oct, 09:11
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576 erid 2SDnjdtqneX
29 Oct, 16:02
28 Oct, 12:05
27 Oct, 16:02
a1 = ["arp", "live", "strong"]
a2 = ["lively", "alive", "harp", "sharp", "armstrong"]
returns ["arp", "live", "strong"]
a1 = ["tarp", "mice", "bull"]
a2 = ["lively", "alive", "harp", "sharp", "armstrong"]
return []
27 Oct, 10:03
26 Oct, 16:02
26 Oct, 09:01
23 Oct, 19:29
23 Oct, 09:16
22 Oct, 18:00
<input
type="text"
pattern="([a-zA-Z0-9]\s?)+"
placeholder="Enter full name"
required
/>
<span></span>
input + span {
position: relative;
}
input + span::before {
position: absolute;
right: -20px;
bottom: 0;
}
input:not(:placeholder-shown):invalid {
border: 2px solid red;
}
input:not(:placeholder-shown):invalid + span::before {
content: "✖️";
color: red;
}
input:not(:placeholder-shown):valid + span::before {
content: "✓";
color: green;
}
22 Oct, 14:00
22 Oct, 11:00
22 Oct, 09:04
21 Oct, 10:30
20 Oct, 16:02
"test" // "grfg"
20 Oct, 10:02
19 Oct, 13:35
<img
src="dog.png"
alt="Шоколадный лабрадор в соломенной шляпе наслаждается
солнечной погодой на пляже. Рядом лежит кокос с трубочкой
и миска с собачьим кормом."
>
<a>
<img src="link-icon.svg" alt="Инструкция по заполнению профиля">
</a>
19 Oct, 09:35
17 Oct, 16:03
16 Oct, 09:02
14 Oct, 16:12
14 Oct, 12:05
13 Oct, 16:02
[0] // "even"
[0, 1, 4] // "odd"
[0, -1, -5] // "even"