Операторы в JavaScript: типы, использование, примеры кода
Основные категории операторов JavaScript
Операторы в JavaScript используются для выполнения операций над одним или несколькими операндами. Они делятся на арифметические, сравнения, логические, присваивания, строковые и другие. Рассмотрим каждую группу с примерами.
Арифметические операторы
К арифметическим операторам относятся +, -, *, /, % (остаток от деления), ** (возведение в степень). Инкремент ++ и декремент -- также входят в эту группу.
let a = 10;
let b = 3;
console.log(a + b); // 13
console.log(a - b); // 7
console.log(a * b); // 30
console.log(a / b); // 3.333...
console.log(a % b); // 1
console.log(a ** b); // 1000
оператор js (операторы в javascript)
Операторы сравнения
Операторы сравнения возвращают логическое значение. Строгое равенство === и неравенство !== проверяют и значение, и тип. Нестрогие == и != выполняют приведение типов.
console.log(5 === '5'); // false
console.log(5 == '5'); // true
console.log(10 > 5); // true
console.log(10 <= 5); // false
Логические операторы
Логические операторы && (И), || (ИЛИ) и ! (НЕ) работают с булевыми значениями, но могут возвращать не только true/false из-за короткого замыкания.
let x = 0;
console.log(x && 'выполнено'); // 0 (короткое замыкание)
console.log(x || 'значение по умолчанию'); // 'значение по умолчанию'
console.log(!x); // true
Оператор присваивания
Простое присваивание = и составные +=, -=, *= и т.д.
let counter = 0;
counter += 5;
console.log(counter); // 5
Строковый оператор +
Если один из операндов является строкой, оператор + выполняет конкатенацию.
console.log('Hello ' + 'World'); // Hello World
console.log(1 + '2'); // '12' (строка)
Тернарный оператор
Единственный тернарный оператор ? : позволяет записать условное выражение в одну строку.
let age = 20;
let status = age >= 18 ? 'взрослый' : 'несовершеннолетний';
console.log(status); // взрослый
Оператор typeof
Возвращает строку с типом операнда.
console.log(typeof 42); // 'number'
console.log(typeof 'John'); // 'string'
console.log(typeof undefined); // 'undefined'
Оператор запятая
Выполняет несколько выражений, возвращая результат последнего.
let result = (1 + 2, 3 + 4);
console.log(result); // 7
Оператор in
Проверяет существование свойства в объекте.
const obj = { name: 'Alice' };
console.log('name' in obj); // true
console.log('age' in obj); // false
Оператор instanceof
Проверяет, является ли объект экземпляром определённого класса.
const arr = [1, 2, 3];
console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // true
Как использовать оператор + для конкатенации строк?
Когда один из операндов является строкой, оператор + преобразует другой операнд в строку и объединяет их. Это удобно для построения сообщений. Однако нужно быть осторожным, чтобы не получить неожиданный результат при сложении чисел.
let a = 1, b = 2, c = '3';
console.log(a + b + c); // '33' (сначала сложение чисел 1+2=3, потом конкатенация с '3')
Типичная ошибка: предполагать, что a + b + c даст '123'. Решение: использовать явное преобразование или группировку скобками.
Как работает оператор строгого равенства ===?
Оператор === возвращает true только если операнды имеют одинаковое значение и одинаковый тип. Он предпочтительнее ==, так как исключает неявное преобразование типов.
console.log(0 === false); // false
console.log('' === false); // false
console.log(null === undefined); // false
Ошибка: использование == может привести к путанице, например 0 == false даёт true. Решение: всегда применять строгое равенство для предсказуемости.
Как оператор && используется для короткого замыкания?
Оператор && вычисляет операнды слева направо и возвращает первое ложное значение или последнее, если все истинны. Это позволяет выполнять условное выполнение функций.
let user = { name: 'Bob' };
user && console.log(user.name); // Bob (выполняется, если user истинен)
Проблема: если user равен 0 или пустой строке, оператор && не выполнит правую часть, что может быть неожиданным. Лучше использовать явную проверку if (user !== null && user !== undefined).
Как применять тернарный оператор вместо if-else?
Тернарный оператор условие ? выражение1 : выражение2 возвращает результат одного из двух выражений. Его удобно использовать для присваивания значения.
let isMember = true;
let discount = isMember ? 0.1 : 0;
console.log(discount); // 0.1
Ошибка: вложение нескольких тернарных операторов делает код нечитаемым. Рекомендуется ограничиться одним уровнем или использовать if.
Что такое оператор нулевого слияния ?? и его отличие от ||?
Оператор ?? возвращает правый операнд только если левый равен null или undefined. В отличие от ||, он не воспринимает 0, '', false как ложные.
let count = 0;
console.log(count || 10); // 10
console.log(count ?? 10); // 0
Путаница между || и ??. Нужно выбирать ??, когда требуется различать только null/undefined и другие ложные значения.
Как оператор опциональной цепочки ?. упрощает доступ к вложенным свойствам?
Оператор ?. позволяет безопасно обращаться к свойствам, не вызывая ошибки, если промежуточное значение равно null или undefined.
const user = { profile: { name: 'Kate' } };
const city = user?.profile?.address?.city;
console.log(city); // undefined, без ошибки
Раньше для такой проверки приходилось писать цепочку if или логические операторы. Теперь код стал короче, но нужно помнить, что ?. может скрыть некоторые баги.
Типичные проблемы при работе с операторами
Путаница между = и ==/===. Одиночное равно - присваивание, двойное или тройное - сравнение. Ошибка часто возникает в условиях.
if (x = 10) { console.log('всегда true'); } // присваивание, а не сравнение
Неявное преобразование типов. Операторы +, ==, > могут приводить к неожиданным результатам.
console.log('5' - 3); // 2 (строка преобразуется в число)
console.log('5' + 3); // '53' (число преобразуется в строку)
Приоритет операторов. Например, логическое И имеет более высокий приоритет, чем ИЛИ. Необходимо использовать скобки.
console.log(true || false && false); // true, так как && вычисляется первым: false && false = false, затем true || false = true
Результат && и || с небулевыми операндами. Они возвращают не обязательно true/false, а один из операндов. Это может быть неочевидно.
let name = '';
let displayName = name || 'гость';
console.log(displayName); // 'гость' (пустая строка ложна)
Забывание скобок в тернарном операторе. Без скобок выражение может интерпретироваться неверно из-за приоритета.
let value = a > b ? a + b : a - b; // работает корректно, но при более сложных условиях скобки обязательны
Расширенные примеры использования операторов
Комбинирование операторов и приоритет
let result = (2 + 3) * 4 - 1;
console.log(result); // 19Скобки изменяют порядок вычислений. Без скобок приоритет умножения выше сложения: 2 + 3 * 4 - 1 дало бы 13.
Оператор spread (...) для копирования массивов и объектов
const numbers = [1, 2, 3];
const copy = [...numbers];
console.log(copy); // [1, 2, 3]
const obj = { a: 1, b: 2 };
const clone = { ...obj, c: 3 };
console.log(clone); // { a: 1, b: 2, c: 3 }Оператор spread извлекает все свойства переданного объекта или элементы массива и помещает их в новый массив или объект. Это поверхностное копирование.
Оператор запятая в цикле for
for (let i = 0, j = 10; i < j; i++, j--) {
console.log(i, j);
}
// Вывод: 0 10
// 1 9
// 2 8
// 3 7
// 4 6Оператор запятая позволяет объявить несколько переменных в начале цикла и выполнять несколько действий на каждом шаге.
Оператор in для проверки ключей объекта
const car = { brand: 'Toyota', model: 'Camry' };
console.log('brand' in car); // true
console.log('year' in car); // false
// Отличие от hasOwnProperty: оператор in также проверяет унаследованные свойства
console.log('toString' in car); // trueОператор in проверяет наличие свойства как собственного, так и унаследованного по цепочке прототипов.
Оператор instanceof для проверки класса
class Animal {}
class Dog extends Animal {}
const rex = new Dog();
console.log(rex instanceof Dog); // true
console.log(rex instanceof Animal); // true
console.log(rex instanceof Object); // true
// Для примитивов instanceof всегда false
console.log('hello' instanceof String); // falseОператор instanceof проверяет, присутствует ли прототип класса в цепочке прототипов объекта.
Составные операторы присваивания с побитовыми операциями
let flags = 0b0011; // 3
flags |= 0b0100; // побитовое ИЛИ, теперь flags = 0b0111 (7)
console.log(flags); // 7
flags &= 0b0010; // побитовое И, теперь flags = 0b0010 (2)
console.log(flags); // 2Побитовые операторы (&, |, ^, <<, >>, >>>) редко используются в повседневной разработке, но могут быть полезны для работы с флагами или оптимизации.
Оператор typeof с вызовом функции
function greet() {
return 'Hello';
}
console.log(typeof greet); // 'function'
console.log(typeof greet()); // 'string'Оператор typeof безопасен даже для необъявленных переменных: typeof undeclaredVar вернёт 'undefined', а не вызовет ошибку.
Оператор delete для удаления свойства объекта
const user = { name: 'Alice', age: 25 };
delete user.age;
console.log(user); // { name: 'Alice' }
console.log(user.age); // undefined
// delete не работает с локальными переменными (var, let, const)
let x = 1;
console.log(delete x); // false (в строгом режиме ошибка)Оператор delete удаляет свойство из объекта, возвращая true при успехе. Нельзя удалить переменные, объявленные через let/const/var.