[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Eq](https://evolu.dev/docs/api-reference/common/Eq) › eqData

```ts
function eqData<Actual, Expected>(
  actual: Actual,
  expected: Expected,
  ...dataError: EqDataError<Actual | Expected>
): boolean;
```

Defined in: [packages/common/src/Eq.ts:255](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Eq.ts#L255)

Compares two [Data](https://evolu.dev/docs/api-reference/common/Type/variables/Data) values.

Primitive values use SameValueZero, so `NaN` equals itself and `0` equals
`-0`. Arrays and Object properties are ordered and keyed respectively. Sets
and Maps compare their elements and entries without regard to insertion
order. Dates compare their time values, while Uint8Arrays compare their
bytes. Cyclic and shared data graphs are supported.

The compile-time validation recursively accepts ordinary interfaces whose
properties consist only of Data. Runtime representation details are trusted;
use the [Data](https://evolu.dev/docs/api-reference/common/Type/variables/Data) Type at an unknown boundary.

### Example

```ts

interface User {
  readonly name: string;
  readonly roles: ReadonlySet<string>;
}

const first: User = { name: "Ada", roles: new Set(["admin", "author"]) };
const second: User = {
  name: "Ada",
  roles: new Set(["author", "admin"]),
};

assertTrue(eqData(first, second));
```