← Назад к вопросам
Как писать переменную если не знаешь изменится ли она?
2.0 Middle🔥 181 комментариев
#JavaScript Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Выбор между const, let и var
Это важный вопрос о правильном использовании ключевых слов объявления переменных в JavaScript. Ответ зависит от того, будет ли переменная изменяться.
Основное правило
// 1. Используй const по умолчанию
// 2. Если переменная изменяется, используй let
// 3. НИКОГДА не используй var
const vs let
const - для константных значений
// Правильное использование const:
// Примитивные типы (никогда не изменяются)
const PI = 3.14159;
const MAX_USERS = 100;
const APP_NAME = 'PrepBro';
// Объекты и массивы (сама ссылка не изменяется)
const user = { name: 'John', age: 30 };
const items = [1, 2, 3];
// Функции (никогда не переприсваиваются)
const calculateSum = (a, b) => a + b;
// Важно: const означает, что ссылка не изменяется,
// но содержимое объекта/массива может меняться!
user.name = 'Jane'; // Разрешено!
user.age = 31; // Разрешено!
items.push(4); // Разрешено!
// Но само присваивание запрещено:
user = {}; // ОШИБКА!
items = []; // ОШИБКА!
PI = 3.14; // ОШИБКА!
let - для изменяющихся переменных
// Используй let когда переменная ТОЧНО будет изменяться
// Счетчики
let count = 0;
count++; // Нормально
// Переменные в циклах
let sum = 0;
for (let i = 0; i < 10; i++) {
sum += i;
}
// Переменные состояния
let isLoading = false;
isLoading = true; // Нормально
// Аккумуляторы
let result = [];
result.push('item'); // Нормально
// Условные присваивания
let userStatus = 'inactive';
if (authenticated) {
userStatus = 'active'; // Нормально
}
var - ЗАПРЕЩЕН!
// НИКОГДА не используй var!
// Причины:
// 1. Function scope вместо block scope
for (var i = 0; i < 5; i++) {
// i доступно ВНЕ цикла (неожиданно!)
}
console.log(i); // 5 (может быть неприятным сюрпризом)
// 2. Hoisting (поднятие переменных)
console.log(x); // undefined (не ошибка, но странно)
var x = 5;
// 3. Можно переобъявить в одной области видимости
var x = 5;
var x = 10; // Разрешено (может быть ошибкой)
// 4. Присваивается глобальному объекту
function test() {
var x = 5;
}
var y = 10;
console.log(window.y); // 10 (загрязнение глобального объекта)
Правильное решение: Когда const не подходит
// Ситуация 1: Заранее не известно, изменится ли переменная
// Решение: начни с const, если потребуется изменение, переделай на let
const userData = fetchUser(); // Начинаем с const
// Если позже нужно переприсвоить:
let userData = null;
if (condition1) {
userData = fetchUser();
} else if (condition2) {
userData = getDefaultUser();
}
// Ситуация 2: Переменная может измениться в будущем
// Решение: всё равно начинай с const и меняй при необходимости
const config = { debug: false };
// Позже:
config.debug = true; // Это OK, мы изменяем содержимое
// Если нужно переприсвоить сам объект:
let config = { debug: false };
config = { debug: true, verbose: true };
Лучшая практика: ESLint правило
// Настроить в .eslintrc:
{
"rules": {
"prefer-const": "error",
"no-var": "error"
}
}
// ESLint автоматически предложит использовать const вместо let,
// если переменная не переприсваивается
Практические примеры
// Пример 1: React компонент
function UserCard({ user }) {
const [isEditing, setIsEditing] = useState(false);
const [name, setName] = useState(user.name);
const handleEdit = () => {
setIsEditing(true);
};
const handleSave = async () => {
await updateUser(name);
setIsEditing(false);
};
return (
<div>
{isEditing ? (
<input value={name} onChange={(e) => setName(e.target.value)} />
) : (
<p>{user.name}</p>
)}
<button onClick={isEditing ? handleSave : handleEdit}>
{isEditing ? 'Сохранить' : 'Редактировать'}
</button>
</div>
);
}
// Пример 2: Обработка данных
const items = [1, 2, 3, 4, 5];
const filtered = items.filter(x => x > 2);
const mapped = filtered.map(x => x * 2);
const result = mapped.reduce((sum, x) => sum + x, 0);
// Все переменные используют const, потому что не переприсваиваются
Итоговая рекомендация
- const - для всех переменных по умолчанию
- let - только если переменная явно будет изменяться
- var - никогда не используй
- ESLint - используй для автоматической проверки