Giriş bölümünde, JavaScript’in verdiğiniz hemen hemen tüm programları, hatta tuhaf şeyler yapan programları bile kabul etmediğini belirttim. Bu, aşağıdaki ifadelerle güzel bir şekilde gösterilmiştir:
console.log(8 * null)
// → 0
console.log(“5” – 1)
// → 4
console.log(“5” + 1)
// → 51
console.log(“five” * 2)
// → NaN
console.log(false == 0)
// → true
Bir operatör “yanlış” tür değere uygulandığında, JavaScript, bu değeri istediğiniz veya beklediğiniz gibi olmayan bir kural kümesini kullanarak ihtiyaç duyduğu türe sessizce dönüştürecektir. Buna tip baskısı denir. İlk ifadedeki null 0 olur ve ikinci ifadedeki “5” 5 olur (dizeden numaraya). Ancak üçüncü ifadede +, sayısal ekleme işleminden önce dizgi birleştirmeyi dener; bu nedenle 1, “1” e (sayıdan dizeye) dönüştürülür.
Açık bir şekilde bir sayıya (“beş” veya undefined gibi) eşlenmeyen bir şey bir sayıya dönüştürüldüğünde, NaN değerini alırsınız. NaN ile ilgili diğer aritmetik işlemler NaN üretmeye devam eder, bu nedenle kendilerinden beklenmedik bir yerden birini bulursanız, yanlışlıkla tip dönüşümleri arayın.
== kullanarak aynı türdeki değerleri karşılaştırırken, sonucun tahmin edilmesi kolaydır: her iki değer de aynı olduğunda, NaN durumu dışında doğru olmalısınız. Ancak türler farklı olduğunda, JavaScript ne yapacağını belirlemek için karmaşık ve kafa karıştırıcı kurallar kullanır. Çoğu durumda, erp yazılımı firmaları değerlerden birini diğer değerlerin türüne dönüştürmeye çalışır. Bununla birlikte, null veya undefined, operatörün her iki tarafında gerçekleştiğinde, her iki tarafın da boş veya tanımsız olması durumunda doğrudur.
console.log(null == undefined);
// → true
console.log(null == 0);
// → false
Bu davranış genellikle yararlıdır. Bir değerin null veya undefined yerine gerçek bir değere sahip olup olmadığını sınamak istediğinizde, onu null olarak == (veya! =) Operatörüyle karşılaştırabilirsiniz.
Ama ya bir şeyin kesin değere yanlış olup olmadığını test etmek istersen ne olur? Otomatik tür dönüşümü nedeniyle 0 == false ve “” == false gibi ifadeler de doğrudur. Herhangi bir tür dönüşümün gerçekleşmesini istemediğinizde, iki ek işleç vardır: === ve! ==. İlk, bir değerin diğerine tam olarak eşit olup olmadığını ve ikinci testin tam olarak eşit olmadığını test eder. Yani “” === false beklendiği gibi yanlıştır.
Beklenmeyen tür dönüşümlerinin sizi tetiklemesini önlemek için üç karakterli karşılaştırma operatörünü savunmanızı öneririz. Ancak, iki taraftaki türlerin aynı olacağından emin olduğunuzda, kısa operatörleri kullanmakta sorun yoktur.