Бинарные операторы в JavaScript — это операторы, которые работают с двумя операндами. Они делятся на несколько категорий:
+
, -
, *
, /
, %
, **
)==
, ===
, !=
, !==
, <
, >
, <=
, >=
)&&
, ||
, ??
)=
, +=
, -=
, *=
, /=
, %=
)&
, |
, ^
, <<
, >>
, >>>
)Категория | Операторы | Назначение | Пример |
---|---|---|---|
Арифметические | + , - , * , / , % , ** | Математические операции | 5 + 3 = 8 |
Сравнения | == , === , != , !== , < , > | Сравнение значений | 5 > 3 = true |
Логические | && , ` | , ??` | |
Присваивания | = , += , -= , *= , /= | Присвоение значений | x += 5 |
Битовые | & , ` | , ^, <<, >>` | Операции с битами |
// Сложение
let sum = 5 + 3; // 8
let concat = "Hello" + " World"; // "Hello World"
// Вычитание
let diff = 10 - 4; // 6
// Умножение
let product = 6 * 7; // 42
// Деление
let quotient = 15 / 3; // 5
let decimal = 10 / 3; // 3.3333...
// Остаток от деления (модуло)
let remainder = 17 % 5; // 2
// Возведение в степень (ES2016)
let power = 2 ** 3; // 8
+
// Приведение типов
console.log(5 + "3"); // "53" (строка)
console.log(5 + 3); // 8 (число)
console.log("5" + 3); // "53" (строка)
console.log(+"5" + 3); // 8 (число, унарный +)
// С булевыми значениями
console.log(5 + true); // 6 (true = 1)
console.log(5 + false); // 5 (false = 0)
Оператор | Название | Приведение типов | Пример |
---|---|---|---|
== | Равенство | Да | "5" == 5 → true |
=== | Строгое равенство | Нет | "5" === 5 → false |
!= | Неравенство | Да | "5" != 5 → false |
!== | Строгое неравенство | Нет | "5" !== 5 → true |
// Примеры сравнения
console.log(5 == "5"); // true (приведение типов)
console.log(5 === "5"); // false (разные типы)
console.log(null == undefined); // true
console.log(null === undefined); // false
console.log(0 == false); // true
console.log(0 === false); // false
console.log("" == false); // true
console.log("" === false); // false
// Числовое сравнение
console.log(5 > 3); // true
console.log(10 <= 10); // true
console.log(7 < 7); // false
// Строковое сравнение (лексикографическое)
console.log("apple" < "banana"); // true
console.log("Apple" < "apple"); // true (заглавные буквы меньше)
// Смешанное сравнение
console.log("10" > 9); // true (строка приводится к числу)
console.log("10" > "9"); // false (строковое сравнение)
// Возвращает первое falsy значение или последнее truthy
console.log(true && true); // true
console.log(true && false); // false
console.log(5 && 3); // 3
console.log(0 && 5); // 0
console.log("" && "hello"); // ""
// Короткое замыкание
let user = { name: "Alex" };
user && console.log(user.name); // "Alex"
let emptyUser = null;
emptyUser && console.log(emptyUser.name); // ничего не выведет
// Возвращает первое truthy значение или последнее falsy
console.log(false || true); // true
console.log(0 || 5); // 5
console.log("" || "default"); // "default"
console.log(null || undefined || "fallback"); // "fallback"
// Установка значений по умолчанию
function greet(name) {
name = name || "Гость";
console.log(`Привет, ${name}!`);
}
greet(); // "Привет, Гость!"
greet("Александр"); // "Привет, Александр!"
// Возвращает правый операнд, если левый null или undefined
console.log(null ?? "default"); // "default"
console.log(undefined ?? "default"); // "default"
console.log(0 ?? "default"); // 0
console.log("" ?? "default"); // ""
console.log(false ?? "default"); // false
// Отличие от ||
let value = 0;
console.log(value || "default"); // "default"
console.log(value ?? "default"); // 0
Оператор | Эквивалент | Описание |
---|---|---|
x += y | x = x + y | Сложение и присваивание |
x -= y | x = x - y | Вычитание и присваивание |
x *= y | x = x * y | Умножение и присваивание |
x /= y | x = x / y | Деление и присваивание |
x %= y | x = x % y | Остаток и присваивание |
x **= y | x = x ** y | Возведение в степень и присваивание |
let x = 10;
x += 5; // x = 15
x -= 3; // x = 12
x *= 2; // x = 24
x /= 4; // x = 6
x %= 4; // x = 2
x **= 3; // x = 8
// Со строками
let message = "Hello";
message += " World"; // "Hello World"
// С массивами (через +=)
let arr = [1, 2];
arr += [3, 4]; // "1,23,4" (приведение к строке!)
// Логическое И с присваиванием
let a = true;
a &&= false; // a = a && false → false
// Логическое ИЛИ с присваиванием
let b = false;
b ||= true; // b = b || true → true
// Нулевое слияние с присваиванием
let c = null;
c ??= "default"; // c = c ?? "default" → "default"
let d = 0;
d ??= "default"; // d остается 0
Оператор | Название | Описание | Пример |
---|---|---|---|
& | Битовое И | Возвращает 1, если оба бита равны 1 | 5 & 3 = 1 |
` | ` | Битовое ИЛИ | Возвращает 1, если хотя бы один бит равен 1 |
^ | Битовое исключающее ИЛИ | Возвращает 1, если биты разные | 5 ^ 3 = 6 |
<< | Сдвиг влево | Сдвигает биты влево | 5 << 1 = 10 |
>> | Сдвиг вправо | Сдвигает биты вправо | 5 >> 1 = 2 |
>>> | Беззнаковый сдвиг вправо | Сдвиг без учета знака | -5 >>> 1 |
// Примеры битовых операций
console.log(5 & 3); // 1
// 5 = 101, 3 = 011 → 001 = 1
console.log(5 | 3); // 7
// 5 = 101, 3 = 011 → 111 = 7
console.log(5 ^ 3); // 6
// 5 = 101, 3 = 011 → 110 = 6
console.log(5 << 1); // 10
// 5 = 101 → 1010 = 10
console.log(5 >> 1); // 2
// 5 = 101 → 10 = 2
// Практическое применение
// Проверка четности
function isEven(n) {
return (n & 1) === 0;
}
// Умножение/деление на степени двойки
let num = 8;
console.log(num << 1); // 16 (умножение на 2)
console.log(num >> 1); // 4 (деление на 2)
Приоритет | Операторы | Ассоциативность |
---|---|---|
15 | ** | Справа налево |
14 | * , / , % | Слева направо |
13 | + , - | Слева направо |
12 | << , >> , >>> | Слева направо |
11 | < , <= , > , >= | Слева направо |
10 | == , != , === , !== | Слева направо |
9 | & | Слева направо |
8 | ^ | Слева направо |
7 | ` | ` |
6 | && | Слева направо |
5 | ` | |
3 | = , += , -= , etc. | Справа налево |
// Примеры приоритета
console.log(2 + 3 * 4); // 14 (не 20)
console.log((2 + 3) * 4); // 20
console.log(2 ** 3 ** 2); // 512 (не 64, справа налево)
console.log((2 ** 3) ** 2); // 64
console.log(true || false && false); // true
console.log((true || false) && false); // false
console.log("5" + 3 + 2);
console.log(3 + 2 + "5");
"532"
и "55"
В первом случае: "5" + 3
→ "53"
, затем "53" + 2
→ "532"
Во втором случае: 3 + 2
→ 5
, затем 5 + "5"
→ "55"
let a = 5;
let b = a++ + ++a;
console.log(b);
console.log(a);
b = 12
, a = 7
a++
возвращает 5, затем a
становится 6
++a
увеличивает a
до 7 и возвращает 7
b = 5 + 7 = 12
console.log(null == 0);
console.log(null >= 0);
console.log(null > 0);
false
, true
, false
null == 0
→ false
(специальное правило)null >= 0
→ true
(null приводится к 0)null > 0
→ false
(null приводится к 0)let result = "" || 0 || null || undefined || "default";
console.log(result);
let value = 0 ?? null ?? undefined ?? "fallback";
console.log(value);
"default"
и 0
||
возвращает первое truthy значение??
возвращает первое не-null и не-undefined значениеconsole.log(~5);
console.log(~~5.7);
console.log(5 & 1);
console.log(6 & 1);
-6
, 5
, 1
, 0
~5
→ -6
(битовое НЕ)~~5.7
→ 5
(двойное битовое НЕ = Math.floor для положительных)5 & 1
→ 1
(5 нечетное)6 & 1
→ 0
(6 четное)// Установка значений по умолчанию
function createUser(name, age, role) {
return {
name: name || "Аноним",
age: age ?? 18,
role: role || "user",
isAdmin: role === "admin"
};
}
// Условное выполнение
function processData(data) {
data && data.length > 0 && data.forEach(item => {
console.log(item);
});
}
// Переключение булевых значений
let isVisible = true;
isVisible = !isVisible; // false
// Или через XOR (для переключения)
let flag = 1;
flag ^= 1; // 0
flag ^= 1; // 1
// Проверка прав доступа (битовые маски)
const PERMISSIONS = {
READ: 1, // 001
WRITE: 2, // 010
EXECUTE: 4 // 100
};
let userPermissions = PERMISSIONS.READ | PERMISSIONS.WRITE; // 011
// Проверка разрешения
function hasPermission(user, permission) {
return (user & permission) === permission;
}
console.log(hasPermission(userPermissions, PERMISSIONS.READ)); // true
console.log(hasPermission(userPermissions, PERMISSIONS.EXECUTE)); // false
// Быстрое округление вниз
Math.floor(5.7); // обычный способ
~~5.7; // битовый способ (быстрее)
// Проверка четности/нечетности
function isEven(n) {
return n % 2 === 0; // обычный способ
// return (n & 1) === 0; // битовый способ
}
// Умножение/деление на степени двойки
let num = 16;
num * 4; // обычное умножение
num << 2; // битовый сдвиг (быстрее)
num / 4; // обычное деление
num >> 2; // битовый сдвиг (быстрее)
// Обмен значений без временной переменной
let a = 5, b = 10;
a ^= b;
b ^= a;
a ^= b;
console.log(a, b); // 10, 5
// Неожиданное поведение
console.log("10" - "5"); // 5 (числа)
console.log("10" + "5"); // "105" (строка)
console.log("10" * "5"); // 50 (числа)
console.log("10" / "5"); // 2 (числа)
// Только + приводит к конкатенации строк!
// Опасные сравнения
console.log("" == 0); // true
console.log(false == 0); // true
console.log(null == undefined); // true
console.log(" \t\n" == 0); // true
// Всегда используйте строгое сравнение
console.log("" === 0); // false
console.log(false === 0); // false
// Может вызвать ошибку
let user = null;
user && user.name.toUpperCase(); // TypeError если user.name undefined
// Безопасный вариант
user && user.name && user.name.toUpperCase();
// Или с optional chaining (ES2020)
user?.name?.toUpperCase();
// Неожиданный результат
let result = 5 + 3 * 2; // 11, не 16
let correct = (5 + 3) * 2; // 16
// С логическими операторами
let condition = true || false && false; // true, не false
let intended = (true || false) && false; // false
// Безопасный доступ к свойствам
let user = { profile: { name: "Alex" } };
// Старый способ
let name = user && user.profile && user.profile.name;
// Новый способ
let name2 = user?.profile?.name;
// С методами
user?.profile?.getName?.();
// С массивами
let firstItem = arr?.[0];
// Присваивание только если null или undefined
let config = { theme: null, lang: "en" };
config.theme ??= "dark"; // присвоится
config.lang ??= "ru"; // не присвоится
console.log(config); // { theme: "dark", lang: "en" }
Бинарные операторы в JavaScript — это основа языка. Важно понимать:
✅ Различия между типами операторов и их назначение
✅ Приведение типов и когда оно происходит
✅ Приоритет операторов для правильного порядка выполнения
✅ Короткое замыкание в логических операторах
✅ Строгое vs нестрогое сравнение (===
vs ==
)
✅ Битовые операции для оптимизации и работы с флагами
В современной разработке предпочитайте:
===
вместо ==
??
вместо ||
для значений по умолчанию?.
) для безопасного доступаХочешь больше статей по подготовке к собеседованию? Подпишись на EasyAdvice(@AleksandrEmolov_EasyAdvice), добавляй сайт в избранное и прокачивай себя каждый день 💪