JavaScript, gerektiğinde tipleri otomatik dönüştürür. Buna coercion denir. Genelde sorun çıkarır, bu yüzden iyi anlamak gerekir.
Explicit (açık) dönüşüm
String'e
String(123) // "123"
String(true) // "true"
String(null) // "null"
(123).toString() // "123"
`${123}` // "123" ← template literalNumber'a
Number("42") // 42
Number("42.5") // 42.5
Number("") // 0
Number("abc") // NaN
Number(true) // 1
Number(false) // 0
Number(null) // 0
Number(undefined) // NaN
parseInt("42px") // 42
parseFloat("3.14") // 3.14
+("5") // 5 ← unary plusBoolean'a
Boolean(1) // true
Boolean(0) // false
Boolean("hello") // true
Boolean("") // false
Boolean([]) // true ← dikkat
Boolean({}) // true ← dikkat
!!"hello" // true ← çift değil hilesiImplicit (örtük) dönüşüm
İşlem sırasında JavaScript tipi kendi kendine değiştirir:
"5" + 1 // "51" — string'e dönüşür (concat)
"5" - 1 // 4 — number'a dönüşür
"5" * "2" // 10 — ikisi de number
true + 1 // 2 — true=1
[] + [] // "" — boş string
[] + {} // "[object Object]"
{} + [] // 0 — bazı bağlamlardaKarşılaştırmada coercion
"5" == 5 // true ← tip dönüştürür
"5" === 5 // false ← strict, dönüştürmez
0 == false // true
"" == 0 // true
null == undefined // true
null === undefined // falsePratik kurallar
- Her zaman
===kullan.==hata kaynağıdır. - Açık dönüşüm tercih et.
Number(x)yaz,+xdeğil. - Boolean kontrolü:
if (value) { ... } // truthy check if (Boolean(value)) // explicit, gereksiz ama açık - String birleştirme için template literal:
`Total: ${count}` // ✅ "Total: " + count // çalışır ama daha az okunaklı
⚠️Sürpriz
[1,2,3].toString() → "1,2,3" döner. Dolayısıyla
[1,2,3] == "1,2,3" → true. JavaScript bu yüzden coercion'ı bilmek
gereken bir dildir.