JavaScript Genel Hataları
Bu bölüm bazı yaygın JavaScript hatalarına dikkat çekiyor.
Atama Operatörünü Yanlışlıkla Kullanma
Bir programcı yanlışlıkla bir if ifadesinde =
karşılaştırma operatörü ( ) yerine bir atama operatörü ( ) kullanırsa, JavaScript programları beklenmedik sonuçlar üretebilir .==
Bu if
ifade (beklendiği gibi) döner false
çünkü x, 10'a eşit değildir:
let x = 0;
if (x == 10)
Bu if
ifade döndürülür true
(belki beklendiği gibi değildir), çünkü 10 doğrudur:
let x = 0;
if (x = 10)
Bu ifade (beklendiği gibi olmayabilir) if
döner , çünkü 0 yanlıştır:false
let x = 0;
if (x = 0)
Bir atama her zaman atamanın değerini döndürür.
Gevşek Karşılaştırma Beklemek
Düzenli karşılaştırmada, veri türü önemli değildir. Bu if
ifade doğru döndürür:
let x = 10;
let y = "10";
if (x == y)
Kesin karşılaştırmada, veri türü önemlidir. Bu if
ifade false döndürür:
let x = 10;
let y = "10";
if (x === y)
switch
İfadelerin katı karşılaştırmalar kullandığını unutmak yaygın bir hatadır :
Bu case switch
bir uyarı görüntüler:
let x = 10;
switch(x) {
case 10: alert("Hello");
}
Bu case switch
bir uyarı göstermez:
let x = 10;
switch(x) {
case "10": alert("Hello");
}
Kafa karıştırıcı Toplama ve Birleştirme
Toplama , sayıların eklenmesiyle ilgilidir .
Birleştirme , dizeler eklemekle ilgilidir .
JavaScript'te her iki işlem de aynı +
operatörü kullanır.
Bu nedenle, bir sayıyı sayı olarak eklemek, bir sayıyı dize olarak eklemekten farklı bir sonuç üretecektir:
let x = 10;
x = 10 + 5; //
Now x is 15
let y = 10;
y += "5";
// Now y is "105"
İki değişken eklerken sonucu tahmin etmek zor olabilir:
let x = 10;
let y = 5;
let z = x + y; // Now z is 15
let x = 10;
let y = "5";
let z = x + y; // Now z is "105"
Yanlış anlama Yüzer
JavaScript'teki tüm sayılar 64-bit Kayan noktalı sayılar (Floats) olarak saklanır.
JavaScript dahil tüm programlama dilleri, kesin kayan nokta değerleriyle ilgili zorluklara sahiptir:
let x = 0.1;
let y = 0.2;
let z = x + y
// the result in z will not be 0.3
Yukarıdaki sorunu çözmek için çarpmaya ve bölmeye yardımcı olur:
Örnek
let z = (x * 10 + y * 10) / 10; // z will be 0.3
JavaScript Dizesini Kırmak
JavaScript, bir ifadeyi iki satıra ayırmanıza izin verir:
örnek 1
let x =
"Hello World!";
Ancak, bir dizenin ortasındaki bir ifadeyi kırmak işe yaramaz:
Örnek 2
let x = "Hello
World!";
Bir dizede bir ifadeyi kesmeniz gerekiyorsa "ters eğik çizgi" kullanmalısınız:
Örnek 3
let x = "Hello \
World!";
Noktalı virgülü yanlış yerleştirme
Yanlış yerleştirilmiş bir noktalı virgül nedeniyle, bu kod bloğu, x değerinden bağımsız olarak yürütülür:
if (x == 19);
{
// code block
}
İade Bildirimini Kırmak
Bir satırın sonunda bir ifadeyi otomatik olarak kapatmak varsayılan bir JavaScript davranışıdır.
Bu nedenle, bu iki örnek aynı sonucu verecektir:
örnek 1
function myFunction(a) {
let power = 10
return a * power
}
Örnek 2
function myFunction(a) {
let power = 10;
return a * power;
}
JavaScript ayrıca bir ifadeyi iki satıra ayırmanıza da izin verir.
Bu nedenle, örnek 3 de aynı sonucu verecektir:
Örnek 3
function myFunction(a) {
let
power = 10;
return a * power;
}
Ancak, return ifadesini aşağıdaki gibi iki satıra bölerseniz ne olur:
Örnek 4
function myFunction(a) {
let
power = 10;
return
a * power;
}
İşlev geri dönecek undefined
!
Niye ya? JavaScript, şunu demek istediğinizi düşündüğü için:
Örnek 5
function myFunction(a) {
let
power = 10;
return;
a * power;
}
Açıklama
Bir ifade aşağıdaki gibi eksikse:
let
JavaScript, sonraki satırı okuyarak ifadeyi tamamlamaya çalışacaktır:
power = 10;
Ancak bu ifade tamamlandığından:
return
JavaScript otomatik olarak şu şekilde kapatacaktır:
return;
Bunun nedeni, JavaScript'te ifadeleri noktalı virgülle kapatmak (bitirmek) isteğe bağlıdır.
JavaScript, tam bir ifade olduğu için satırın sonundaki return ifadesini kapatacaktır.
Bir return ifadesini asla bozmayın.
Dizilere Adlandırılmış Dizinlerle Erişme
Birçok programlama dili, adlandırılmış dizinlere sahip dizileri destekler.
Adlandırılmış dizinlere sahip dizilere ilişkisel diziler (veya karmalar) denir.
JavaScript, adlandırılmış dizinlere sahip dizileri desteklemez .
JavaScript'te diziler numaralı dizinleri kullanır :
Örnek
const person = [];
person[0] = "John";
person[1] = "Doe";
person[2] = 46;
person.length;
// person.length will return 3
person[0];
// person[0] will return "John"
JavaScript'te nesneler adlandırılmış dizinleri kullanır .
Adlandırılmış bir dizin kullanırsanız, bir diziye erişirken JavaScript diziyi standart bir nesne olarak yeniden tanımlar.
Otomatik yeniden tanımlamadan sonra, dizi yöntemleri ve özellikleri tanımsız veya yanlış sonuçlar üretecektir:
Örnek:
const person = [];
person["firstName"] = "John";
person["lastName"] = "Doe";
person["age"] = 46;
person.length; // person.length will
return 0
person[0];
// person[0] will return undefined
Tanımları Virgülle Bitirmek
Nesne ve dizi tanımında sondaki virgüller ECMAScript 5'te yasaldır.
Nesne Örneği:
person = {firstName:"John", lastName:"Doe", age:46,}
Dizi Örneği:
points = [40, 100, 1, 5, 25, 10,];
UYARI !!
Internet Explorer 8 çökecek.
JSON, sondaki virgüllere izin vermez.
JSON:
person = {"firstName":"John", "lastName":"Doe", "age":46}
JSON:
points = [40, 100, 1, 5, 25, 10];
Tanımsız, Boş Değil
JavaScript nesneleri, değişkenleri, özellikleri ve yöntemleri olabilir undefined
.
Ayrıca, boş JavaScript nesnelerinin değeri olabilir null
.
Bu, bir nesnenin boş olup olmadığını test etmeyi biraz zorlaştırabilir.
You can test if an object exists by testing if the type is undefined
:
Example:
if (typeof myObj === "undefined")
But you cannot test if an object is null
, because this will throw an error if the
object is undefined
:
Incorrect:
if (myObj === null)
To solve this problem, you must test if an object is not null
,
and not undefined
.
But this can still throw an error:
Incorrect:
if (myObj !== null && typeof myObj
!== "undefined")
Because of this, you must test for not undefined
before you can
test for not null
:
Correct:
if (typeof myObj !== "undefined" && myObj !== null)