← Назад к вопросам

Что такое двойное равно?

1.3 Junior🔥 112 комментариев
#Dart

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Двойное равно (==) в Dart: Сравнение значений

Двойное равно == в Dart — это оператор сравнения по значению, который проверяет, равны ли значения двух объектов. Это отличается от оператора идентичности identical() и одиночного равно = (присваивание).

Три типа операторов равенства

1. = (присваивание):

int x = 5; // Присваиваем значение 5 переменной x
String name = 'Alice'; // Присваиваем строку

2. == (сравнение по значению):

int a = 5;
int b = 5;
print(a == b); // true — значения одинаковые

String name1 = 'Alice';
String name2 = 'Alice';
print(name1 == name2); // true — строки содержат один текст

3. identical() (проверка идентичности):

int a = 5;
int b = 5;
print(identical(a, b)); // true для чисел (кэширование)

List list1 = [1, 2, 3];
List list2 = [1, 2, 3];
print(list1 == list2);        // true — содержимое одинаковое
print(identical(list1, list2)); // false — разные объекты в памяти

Как работает == с примитивными типами

Числа:

print(5 == 5);        // true
print(5 == 5.0);      // true — разные типы, но равные значения
print(5 == 6);        // false

int a = 5;
int b = 5;
print(a == b);        // true

Строки:

String str1 = 'Hello';
String str2 = 'Hello';
print(str1 == str2);  // true — содержимое одинаковое

String str3 = 'hello';
print(str1 == str3);  // false — разный регистр (case sensitive)

Булевы:

print(true == true);   // true
print(true == false);  // false
bool a = true;
bool b = true;
print(a == b);        // true

Сравнение коллекций

Списки:

List<int> list1 = [1, 2, 3];
List<int> list2 = [1, 2, 3];
List<int> list3 = [1, 2, 4];

print(list1 == list2); // true — все элементы одинаковые
print(list1 == list3); // false — последний элемент отличается
print(list1 == list1); // true

Карты:

Map<String, int> map1 = {'a': 1, 'b': 2};
Map<String, int> map2 = {'a': 1, 'b': 2};
Map<String, int> map3 = {'a': 1};

print(map1 == map2);   // true
print(map1 == map3);   // false
print(map2 == map1);   // true (порядок не важен)

Sets:

Set<int> set1 = {1, 2, 3};
Set<int> set2 = {3, 2, 1};
Set<int> set3 = {1, 2};

print(set1 == set2);   // true — порядок не важен
print(set1 == set3);   // false

Сравнение пользовательских объектов

Проблема по умолчанию:

class User {
  final String name;
  final int age;
  
  User(this.name, this.age);
}

User user1 = User('Alice', 30);
User user2 = User('Alice', 30);

print(user1 == user2); // false! — разные объекты в памяти
print(identical(user1, user2)); // false

Решение: переопределить == и hashCode:

class User {
  final String name;
  final int age;
  
  User(this.name, this.age);
  
  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;
    
    return other is User && 
           other.name == name && 
           other.age == age;
  }
  
  @override
  int get hashCode => name.hashCode ^ age.hashCode;
}

User user1 = User('Alice', 30);
User user2 = User('Alice', 30);

print(user1 == user2); // true! — теперь работает

Использование equatable пакета

Удобный способ:

import 'package:equatable/equatable.dart';

class User extends Equatable {
  final String name;
  final int age;
  
  const User(this.name, this.age);
  
  @override
  List<Object> get props => [name, age]; // Поля для сравнения
}

User user1 = User('Alice', 30);
User user2 = User('Alice', 30);

print(user1 == user2); // true — equatable сделал это за нас

Null-aware сравнение

Работа с null:

int? a = null;
int? b = null;
int? c = 5;

print(a == b);   // true — оба null
print(a == c);   // false — null не равен 5
print(c == null); // false

Безопасное сравнение:

String? name1 = null;
String? name2 = 'Alice';

if (name1 == null) {
  print('Имя не заполнено');
}

if (name2 != null) {
  print('Имя: $name2');
}

Сравнение в условных операторах

If условия:

int status = 200;
if (status == 200) {
  print('Успешный запрос');
} else if (status == 404) {
  print('Не найдено');
} else if (status == 500) {
  print('Ошибка сервера');
}

Switch выражение:

enum RequestStatus { success, notFound, error }

RequestStatus status = RequestStatus.success;
String message = switch(status) {
  RequestStatus.success => 'Успешно',
  RequestStatus.notFound => 'Не найдено',
  RequestStatus.error => 'Ошибка',
};

Лучшие практики

1. Используйте == для значений:

// Правильно
if (user.age == 18) { }
if (list.length == 0) { }

// Неправильно
if (user.age = 18) { } // Присваивание!

2. Переопределяйте == в кастомных классах:

// ВСЕГДА делайте это для моделей данных
class Product {
  final int id;
  final String name;
  
  // Используйте equatable или вручную реализуйте
  @override
  bool operator ==(Object other) => /* реализация */;
  
  @override
  int get hashCode => id.hashCode ^ name.hashCode;
}

3. Помните о производительности:

// Сравнение больших объектов может быть дорогим
// Кэшируйте результаты, если используете часто

4. Не забывайте о null безопасности:

// Проверяйте на null перед сравнением
if (value != null && value == targetValue) { }

Понимание разницы между =, == и identical() — это основа правильной работы с данными в Dart.