---
title: 'Logika'
description: "Operator logika boolean dan eksekusi kondisional."
navigation:
  icon: 'i-ph-code-block'
seo:
  title: 'Logika'
  description: "Operator logika boolean dan eksekusi kondisional."
---

## `and` - Logika AND

Mengembalikan true hanya jika semua kondisi bernilai truthy. Menggunakan short-circuit (berhenti mengevaluasi) pada nilai falsy pertama.

### Sintaks
```json
{"and": [condition1, condition2, ...]}
```

### Parameter
- **conditions** (array): Satu atau lebih ekspresi untuk dievaluasi

### Tipe Kembalian
Any - Mengembalikan nilai falsy pertama, atau nilai terakhir jika semua bernilai truthy.

### Contoh

**AND dasar:**
```json
// Data: {"age": 25, "verified": true}
{"and": [
  {">": [{"var": "age"}, 18]},
  {"var": "verified"}
]}
// → true (kedua kondisi terpenuhi)
```

**Evaluasi Short-circuit:**
```json
{"and": [false, {"var": "never.evaluated"}]}
// → false (berhenti di false pertama, tidak error pada path yang hilang)
```

### Aturan Truthiness
- **Nilai Falsy**: `false`, `null`, `0`, `""` (string kosong)
- **Nilai Truthy**: Semua nilai lainnya

---

## `or` - Logika OR

Mengembalikan true jika ada salah satu kondisi yang bernilai truthy. Menggunakan short-circuit pada nilai truthy pertama.

### Sintaks
```json
{"or": [condition1, condition2, ...]}
```

### Parameter
- **conditions** (array): Satu atau lebih ekspresi untuk dievaluasi

### Tipe Kembalian
Any - Mengembalikan nilai truthy pertama, atau nilai terakhir jika semua bernilai falsy.

### Contoh

**OR dasar:**
```json
// Data: {"premium": false, "trial": true}
{"or": [
  {"var": "premium"},
  {"var": "trial"}
]}
// → true (trial bernilai truthy)
```

**Nilai default dengan OR:**
```json
{"or": [
  {"var": "username"},
  {"var": "email"},
  "Guest"
]}
// Mengembalikan nilai pertama yang tersedia atau "Guest"
```

---

## `not` / `!` - Logika NOT

Membalikkan nilai kebenaran (truthiness) dari suatu nilai.

### Sintaks
```json
{"not": value}
{"!": value}
{"!": [value]}
```

### Parameter
- **value** (any): Ekspresi untuk dinegasikan

### Tipe Kembalian
Boolean - Selalu mengembalikan `true` atau `false`

### Contoh

**Negasi dasar:**
```json
{"!": true}   // → false
{"!": false}  // → true
{"!": 0}      // → true (0 adalah falsy)
{"!": 1}      // → false (1 adalah truthy)
```

---

## `if` - Ekspresi Kondisional

Mengevaluasi kondisi dan mengembalikan salah satu dari dua cabang.

### Sintaks
```json
{"if": [condition, then_value, else_value]}
```

### Parameter
- **condition** (any): Ekspresi untuk dievaluasi kebenarannya
- **then_value** (any): Dikembalikan jika kondisi bernilai truthy
- **else_value** (any): Dikembalikan jika kondisi bernilai falsy

### Tipe Kembalian
Any - Mengembalikan either then_value atau else_value

### Contoh

**Kondisional dasar:**
```json
// Data: {"age": 25}
{"if": [
  {">": [{"var": "age"}, 18]},
  "Dewasa",
  "Anak-anak"
]}
// → "Dewasa"
```

**Kondisi bersarang (Nested):**
```json
{"if": [
  {"<": [{"var": "age"}, 13]},
  "Anak-anak",
  {"if": [
    {"<": [{"var": "age"}, 18]},
    "Remaja",
    "Dewasa"
  ]}
]}
```

---

## `xor` - Exclusive OR

Mengembalikan true jika tepat satu dari dua kondisi bernilai truthy (tidak keduanya, dan tidak juga keduanya salah).

### Sintaks
```json
{"xor": [value1, value2]}
```

### Parameter
- **value1** (any): Ekspresi pertama
- **value2** (any): Ekspresi kedua

### Tipe Kembalian
Boolean - `true` jika tepat satu nilai bernilai truthy

---

## `ifnull` - Null Coalescing

Mengembalikan nilai pertama jika tidak bernilai null, jika tidak mengembalikan alternatifnya.

### Sintaks
```json
{"ifnull": [value, alternative]}
```

### Parameter
- **value** (any): Ekspresi untuk diperiksa
- **alternative** (any): Nilai fallback

### Contoh

**Check null dasar:**
```json
// Data: {"name": null}
{"ifnull": [{"var": "name"}, "Anonim"]}
// → "Anonim"
```

### Nilai yang dianggap Null
Dianggap sebagai null:
- `null`
- `""` (string kosong)
- `undefined` (variabel yang hilang)

Bukan dianggap null:
- `0` (angka nol)
- `false` (boolean)
- `[]` (array kosong)

---

## `isempty` - Cek Kosong

Memeriksa apakah suatu nilai bernilai null atau string kosong.

### Sintaks
```json
{"isempty": value}
```

### Parameter
- **value** (any): Ekspresi untuk diperiksa

### Tipe Kembalian
Boolean - `true` jika nilai adalah null atau string kosong

---

## `empty` - Literal String Kosong

Mengembalikan konstanta string kosong.

### Sintaks
```json
{"empty": null}
```

### Tipe Kembalian
String - `""`

---

## Praktik Terbaik

1. **Gunakan evaluasi short-circuit** untuk menghindari kalkulasi yang tidak perlu.
2. **Lebih baik gunakan ifnull daripada if bersarang** untuk pengecekan null sederhana.
3. **Gunakan isempty** untuk validasi input string yang wajib diisi.

---

## Catatan Performa

- **Evaluasi Short-circuit** mencegah komputasi yang tidak diperlukan.
- **Flattening otomatis** mengoptimalkan rantai `and`/`or` yang bersarang.
- **Eliminasi negasi ganda** menghapus operasi `not` yang redundan.
- **Evaluasi Lazy** dalam `if` hanya mengevaluasi cabang yang diambil.
