M3 | WebDev
103 subscribers
105 photos
4 videos
14 links
Your guide to the world of programming 🌐🚀
Download Telegram
👾 Что будет выведено в консоль?
Anonymous Quiz
65%
"105nulltruefalse"
25%
"15nulltruefalse"
5%
"1051false"
5%
"105truefalse"
🚀 Массивы в JavaScript: Методы и манипуляции! 🚀

Массивы в JavaScript — это мощный инструмент для работы с упорядоченными данными! 🛠 Они позволяют хранить и управлять коллекциями элементов. Давайте подробнее рассмотрим массивы и некоторые полезные методы для работы с ними. 📚

🌟 Что такое массив?

Массив — это объект, который позволяет хранить несколько значений в одном месте. Эти значения могут быть любого типа: числа, строки, объекты и даже другие массивы! 📊

1️⃣ Создание массива

Вы можете создать массив несколькими способами:

С помощью литерала массива

const fruits = ['Apple', 'Banana', 'Orange'];
console.log(fruits); // Выведет: ["Apple", "Banana", "Orange"]


С помощью конструктора массива

const numbers = new Array(1, 2, 3);
console.log(numbers); // Выведет: [1, 2, 3]


2️⃣ Основные методы массива

`push` и `pop`

Добавляют и удаляют элементы с конца массива.

const stack = [1, 2, 3];
stack.push(4); // Добавляет 4 в конец
console.log(stack); // Выведет: [1, 2, 3, 4]

stack.pop(); // Удаляет последний элемент
console.log(stack); // Выведет: [1, 2, 3]


`shift` и `unshift`

Добавляют и удаляют элементы с начала массива.

const queue = [1, 2, 3];
queue.unshift(0); // Добавляет 0 в начало
console.log(queue); // Выведет: [0, 1, 2, 3]

queue.shift(); // Удаляет первый элемент
console.log(queue); // Выведет: [1, 2, 3]


`map`

Создает новый массив с результатами вызова функции для каждого элемента.

const numbers = [1, 2, 3];
const doubled = numbers.map(x => x * 2);
console.log(doubled); // Выведет: [2, 4, 6]


`filter`

Создает новый массив с элементами, которые прошли проверку функции.

const numbers = [1, 2, 3, 4];
const even = numbers.filter(x => x % 2 === 0);
console.log(even); // Выведет: [2, 4]


`reduce`

Применяет функцию к каждому элементу массива (слева направо) и возвращает одно значение.

const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((acc, current) => acc + current, 0);
console.log(sum); // Выведет: 10


`find`

Возвращает первый элемент, который удовлетворяет условию функции.

const numbers = [1, 2, 3, 4];
const found = numbers.find(x => x > 2);
console.log(found); // Выведет: 3


`forEach`

Выполняет функцию для каждого элемента массива.

const numbers = [1, 2, 3];
numbers.forEach(x => console.log(x));
// Выведет:
// 1
// 2
// 3


### 3️⃣ Методы для поиска и сортировки

`includes`

Проверяет, содержит ли массив определенный элемент.

const fruits = ['Apple', 'Banana', 'Orange'];
console.log(fruits.includes('Banana')); // Выведет: true
console.log(fruits.includes('Grape')); // Выведет: false


`sort`

Сортирует элементы массива.

const numbers = [4, 2, 3, 1];
numbers.sort((a, b) => a - b);
console.log(numbers); // Выведет: [1, 2, 3, 4]


🔍 Заключение

Массивы и их методы в JavaScript — это неотъемлемая часть работы с данными. Они позволяют эффективно управлять коллекциями элементов и выполнять множество операций. 🌟 Надеюсь, этот пост помог вам лучше понять массивы и их методы!

Тэги : #javascript
🫧 Что будет выведено в консоль?
Anonymous Quiz
0%
14
24%
12
71%
18
6%
16
Понимание this в JavaScript 🔍

Ключевое слово this в JavaScript — это один из самых важных, но и наиболее запутанных аспектов языка. Оно указывает на объект, в контексте которого выполняется функция. Важно понимать, как this изменяется в зависимости от того, как функция была вызвана. Давайте разберем основные случаи и методы управления this:

1. Методы объекта 🧩

Когда функция вызывается как метод объекта, this ссылается на этот объект:

const person = {
name: 'Alice',
greet: function() {
console.log(this.name); // Выводит 'Alice'
}
};
person.greet();


2. Функции как вызов 🚀

Когда функция вызывается без привязки к объекту (как обычная функция), this ссылается на глобальный объект в нестрогом режиме (window в браузере) или undefined в строгом режиме:

function show() {
console.log(this); // В браузере выведет объект window
}
show();


Если включить строгий режим ('use strict';), то this будет undefined:

'use strict';
function show() {
console.log(this); // Выводит undefined
}
show();


3. Конструкторы 🛠

При использовании функции как конструктора с помощью new, this ссылается на создаваемый объект:

function Person(name) {
this.name = name;
}
const person = new Person('Bob');
console.log(person.name); // Выводит 'Bob'


4. Стрелочные функции →

Стрелочные функции не имеют собственного this. Вместо этого они захватывают значение this из окружающего контекста, в котором были определены:

const person = {
name: 'Carol',
greet: function() {
setTimeout(() => {
console.log(this.name); // Выводит 'Carol'
}, 1000);
}
};
person.greet();


5. Управление this с помощью call, apply и bind 🎯

JavaScript предоставляет несколько способов явного управления значением this в функциях:

- call: Метод call позволяет вызвать функцию с определенным значением this и передать аргументы:


function greet(greeting) {
console.log(`${greeting}, ${this.name}`); // Выводит 'Hello, Dave'
}

const person = { name: 'Dave' };
greet.call(person, 'Hello');


- apply: Метод apply похож на call, но принимает аргументы в виде массива:


function greet(greeting, punctuation) {
console.log(`${greeting}, ${this.name}${punctuation}`); // Выводит 'Hi, Eve!'
}

const person = { name: 'Eve' };
greet.apply(person, ['Hi', '!']);


- bind: Метод bind создает новую функцию, которая при вызове будет иметь заданное значение this и, при необходимости, переданные аргументы. В отличие от call и apply, bind не вызывает функцию сразу, а возвращает новую функцию:


function greet(greeting) {
console.log(`${greeting}, ${this.name}`); // Выводит 'Hey, Frank'
}

const person = { name: 'Frank' };
const greetPerson = greet.bind(person);
greetPerson('Hey');


Заключение 🎉

Понимание того, как this работает в различных контекстах и как управлять его значением с помощью call, apply и bind, является ключом к написанию надежного и предсказуемого кода в JavaScript. Эти правила помогают избежать распространенных ошибок и сделать код более понятным и поддерживаемым.

Тэги : #javascript
🌐 Что будет выведено в консоль?
Anonymous Quiz
69%
hello
13%
undefined
6%
ReferenceError
13%
TypeError
На днях на LinkedIn появилась публикация от старшего менеджера по продуктам в Amazon, который проработал в компании 1,5 года, практически ничего не делая. Вот ключевые моменты:

📉 Перешел в Amazon после увольнения из Google с намерением «ничего не делать», получать деньги и в конечном итоге попасть под сокращение.

🛠 За все это время он:
• Выполнил одну цель.
• Разобрал семь тикетов.
• Создал автоматизированную панель, на разработку которой ушло 3 дня (хотя заявил, что это заняло три месяца).

🚫 Его основная работа заключалась в отказе другим командам в интеграции, предоставляя им возможность выполнять 95% работы самостоятельно.

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

🤔 Интересно, сколько бы вы ему дали?
🎯 Основные уязвимости при разработке на чистом HTML + JS и как их минимизировать с помощью Vue и React

Если вы разрабатываете на чистом HTML и JavaScript, обратите внимание на следующие уязвимости:

XSS (Cross-Site Scripting): Вредоносный код на странице. Решение: Vue и React автоматически экранируют данные, снижая риск XSS-атак. Но избегайте использования небезопасных методов, таких как v-html или dangerouslySetInnerHTML.

CSRF (Cross-Site Request Forgery): Опасные действия от имени пользователя. Решение: Vue и React облегчают внедрение CSRF-токенов, но защита зависит от правильной настройки сервера.

Инъекции через URL и параметры запроса: Риск передачи вредоносных данных. Решение: Встроенные роутеры позволяют безопасно обрабатывать маршруты, но нужна дополнительная защита на сервере.

Управление состоянием и утечка данных: Проблемы с состоянием в больших приложениях. Решение: Использование Vuex или Redux помогает структурировать данные и минимизировать ошибки, но безопасность данных зависит от общей архитектуры.

Повторное использование кода и безопасность компонентов: Дублирование кода ведет к ошибкам. Решение: Компонентный подход позволяет создавать повторно используемые и безопасные элементы, но важно продумывать безопасность на этапе разработки.

Отсутствие защиты на уровне UI: Ошибки взаимодействия с интерфейсом. Решение: Vue и React предлагают инструменты для безопасного взаимодействия с пользователем, но корректная реализация — на вашей ответственности.

Vue и React облегчают внедрение мер безопасности, но полная защита требует комплексного подхода и грамотного использования фреймворков.

👨‍💻 Выбирайте фреймворки, которые помогут вам минимизировать риски и упростить разработку!
Идеальная карьера для айтишника выглядит так :
🔄 Event Loop в JavaScript

Event Loop — это механизм, который позволяет JavaScript работать с неблокирующей моделью ввода-вывода. Хотя Event Loop не является частью самого JavaScript, его реализация зависит от среды, в которой выполняется код (например, браузер или Node.js). Однако, несмотря на различия в реализации, цель Event Loop везде одна — управление асинхронными задачами.

Основные компоненты:

1. Call Stack (Стек вызовов): В нем выполняются функции в порядке LIFO (Last In, First Out). Когда функция вызывает другую функцию, она добавляется на вершину стека. Когда выполнение функции завершается, она удаляется из стека. Если стек пуст, Event Loop начинает извлекать задачи из очереди.

2. Task Queue (Очередь задач): Это очередь, куда попадают асинхронные задачи, такие как колбэки, промисы и другие операции, которые не могут быть выполнены немедленно. Когда стек вызовов становится пустым, Event Loop берет первую задачу из этой очереди и помещает ее в стек вызовов для выполнения.

3. Web API: Это интерфейсы, предоставляемые окружением (например, браузером), такие как setTimeout, DOM events, XHR и т.д. Эти API не входят в спецификацию JavaScript, но они обеспечивают взаимодействие с Call Stack и Task Queue через Event Loop.

Важные детали:

Task Queue делится на два типа очередей :

- Microtask Queue: Помимо обычной очереди задач, существует отдельная очередь для микрозадач, таких как Promise. Microtask Queue имеет более высокий приоритет, чем обычная Task Queue, и обрабатывается Event Loop сразу после выполнения всех синхронных операций и до начала выполнения макрозадач.

- Macrotask Queue: В эту очередь попадают такие задачи, как таймеры, события, AJAX-запросы и другие макрозадачи. Они обрабатываются после выполнения всех микрозадач.

Взаимодействие между компонентами:

1. Выполнение синхронного кода: Все синхронные операции выполняются в Call Stack. Например, вызов функции и ее выполнение.

2. Взаимодействие с Web API: При вызове асинхронных функций, таких как setTimeout, браузер или Node.js перемещают их в Web API, где они ждут своего завершения.

3. Добавление задач в очередь: Как только асинхронная операция завершается (например, таймер истекает), соответствующий колбэк перемещается в Macrotask Queue или Microtask Queue, в зависимости от типа задачи.

4. Обработка задач Event Loop: Event Loop проверяет, есть ли задачи в Microtask Queue и Macrotask Queue. Сначала выполняются все задачи из Microtask Queue, затем Event Loop переходит к задачам из Macrotask Queue.

Пример работы Event Loop:
console.log('Start'); // 1

setTimeout(() => {
console.log('Timeout'); // 4
}, 0);

Promise.resolve().then(() => {
console.log('Promise'); // 3
});

console.log('End'); // 2

Последовательность выполнения:
1. Выполняется первый console.log('Start') и выводится в консоль.
2. Вызов setTimeout передает колбэк в Web API, где он ожидает выполнения.
3. Промис перемещает свой колбэк в Microtask Queue.
4. Выполняется второй console.log('End').
5. Event Loop проверяет Microtask Queue, видит там колбэк промиса и выполняет его.
6. После выполнения всех микрозадач, Event Loop переходит к Task Queue и выполняет колбэк из setTimeout.

Результат в консоли:
StartEndPromiseTimeout

Заключение:
Event Loop — это механизм, который поддерживает однопоточность JavaScript, управляя асинхронными задачами и обеспечивая выполнение операций в правильной последовательности. Это позволяет JavaScript эффективно обрабатывать пользовательские события, запросы к серверу и другие задачи, не блокируя основной поток выполнения.

Такое глубокое понимание Event Loop помогает писать более эффективный код и лучше разбираться в особенностях работы JavaScript. 🚀

Тэги : #javascript
🌟 Понимаем конструкцию `try...catch` и оператор `throw` в JavaScript 🌟

В JavaScript обработка ошибок выполняется с помощью конструкции try...catch и оператора throw. Давайте разберемся в деталях!

🔄 Конструкция try...catch

- Блок `try`: Здесь размещается код, в котором потенциально может возникнуть ошибка.
- Блок `catch`: Если в блоке try произошла ошибка, исполнение передается в блок catch. Здесь мы можем обработать ошибку и принять меры для продолжения работы приложения.

try {
// Код, который может вызвать ошибку
let data = JSON.parse('{"name": "John"}');
} catch (error) {
console.error("Ошибка: " + error.message);
}


💥 Оператор throw

Если необходимо намеренно создать ошибку, используется оператор throw. Это полезно, когда нужно остановить выполнение кода при возникновении определенных условий.

function divide(a, b) {
if (b === 0) {
throw new Error("Деление на ноль невозможно!");
}
return a / b;
}

try {
let result = divide(10, 0);
} catch (error) {
console.error("Произошла ошибка: " + error.message);
}


🛠 Объект Error

Когда возникает ошибка, создается объект Error, содержащий информацию об ошибке:
- `error.message`: Текст ошибки.
- `error.name`: Имя ошибки (например, TypeError, ReferenceError).
- `error.stack`: Стек вызовов, указывающий путь выполнения кода до места возникновения ошибки.

📚 Кастомные ошибки

Вы можете создать свои собственные ошибки, расширяя класс Error:

class CustomError extends Error {
constructor(message) {
super(message);
this.name = "CustomError";
}
}

try {
throw new CustomError("Это моя собственная ошибка!");
} catch (error) {
console.error(`${error.name}: ${error.message}`);
}


Когда использовать?

1. Валидация данных: Убедитесь, что передаваемые данные соответствуют ожиданиям.
2. Асинхронные операции: Обработайте ошибки, возникающие при работе с промисами или асинхронными вызовами.
3. Неожиданные состояния: Выявляйте и обрабатывайте состояния, которые не должны возникать в нормальных условиях.

🚀 Заключение

Использование try...catch, throw, и объекта Error помогает сделать код более надежным, предсказуемым и легким для отладки. Обработка ошибок — это залог создания стабильных приложений! 💻
🚀 Базовое Понимание и Возможности Классов в JavaScript

В JavaScript классы появились в ES6 и предоставляют новый способ работы с объектами, однако под капотом классы — это всё ещё функции. Классы упрощают создание объектов, наследование и использование методов, делая код более понятным и структурированным. Давайте рассмотрим основные аспекты работы с классами.

📚 Базовый синтаксис класса

Класс объявляется с использованием ключевого слова class, после которого следует имя класса. Внутри класса можно объявить методы. Например:

class User {
constructor(name) {
this.name = name;
}

sayHi() {
console.log(`Привет, я ${this.name}!`);
}
}

const user = new User('Иван');
user.sayHi(); // Привет, я Иван!

Здесь constructor — это специальный метод, который вызывается при создании нового объекта через new. Внутри конструктора определяются свойства объекта.

🧬 Наследование классов

В JavaScript классы поддерживают наследование. Для этого используется ключевое слово extends, которое позволяет одному классу наследовать методы и свойства другого.

class Animal {
constructor(name) {
this.name = name;
}

speak() {
console.log(`${this.name} издает звук.`);
}
}

class Dog extends Animal {
speak() {
console.log(`${this.name} лает.`);
}
}

const dog = new Dog('Барбос');
dog.speak(); // Барбос лает.

📊 Статические свойства и методы

Статические методы и свойства принадлежат классу, а не его экземплярам. Они определяются с помощью ключевого слова static.

class MathUtils {
static square(x) {
return x * x;
}
}

console.log(MathUtils.square(4)); // 16

🔒 Приватные и защищённые методы и свойства

С появлением ES2022 в JavaScript были введены приватные свойства и методы, которые начинаются с символа #. Такие свойства и методы доступны только внутри класса.

class User {
#password;

constructor(name, password) {
this.name = name;
this.#password = password;
}

checkPassword(password) {
return this.#password === password;
}
}

const user = new User('Иван', '1234');
console.log(user.checkPassword('1234')); // true

🔧 Расширение встроенных классов

Вы можете расширять встроенные классы JavaScript, такие как Array, добавляя собственные методы.

class PowerArray extends Array {
isEmpty() {
return this.length === 0;
}
}

const arr = new PowerArray(1, 2, 3);
console.log(arr.isEmpty()); // false

🔍 Проверка класса: "instanceof"

Оператор instanceof используется для проверки, принадлежит ли объект определённому классу или его наследнику.

console.log(arr instanceof PowerArray); // true

🧩 Примеси

Примеси позволяют разделять функциональность между классами. В JavaScript примеси реализуются через простое добавление методов в прототип класса.

let sayHiMixin = {
sayHi() {
console.log(`Привет, ${this.name}`);
}
};

class User {
constructor(name) {
this.name = name;
}
}

Object.assign(User.prototype, sayHiMixin);

const user = new User('Иван');
user.sayHi(); // Привет, Иван

🧭 Заключение:

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

Тэги : #javascript