[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:267](https://github.com/evoluhq/evolu/blob/dd96d79f1dbe9a49fa12ce8e0aa7d3d0177795ca/packages/common/src/Eq.ts#L267)

Deeply compares two [Data](https://evolu.dev/docs/api-reference/common/Type/variables/Data) values using platform-independent structural
equality.

Primitive values use `Object.is`. Arrays are ordered; plain Objects compare
their own string-keyed properties regardless of property order or prototype;
Sets and Maps ignore insertion order; Dates compare their time values; and
Uint8Arrays compare their bytes. Cyclic and shared data graphs are
supported.

Arguments are restricted to Data at compile time. 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));
```