この章では、いくつかの一般的なJavaScriptの間違いを指摘しています。
誤って代入演算子を使用して
プログラマが誤って代入演算子使用している場合はJavaScriptプログラムが予期しない結果を生成することがあります(=)の代わりに、比較演算子の、 (==) if文で。
このifのステートメントを返しfalse 、xが10に等しくないので、(期待通りに):
var x = 0;
if (x == 10)
»それを自分で試してみてください このif文が返すtrue 10が真であるので、(多分期待されないように):
var x = 0;
if (x = 10)
»それを自分で試してみてください このifのステートメントを返すfalse 0がfalseであるため、(多分期待されないように):
var x = 0;
if (x = 0)
»それを自分で試してみてください 代入は常に代入の値を返します。
ルースの比較を期待
定期的な比較では、データ型は重要ではありません。 この文を返す場合true :
var x = 10;
var y = "10";
if (x == y)
»それを自分で試してみてください 厳密な比較では、データ型は問題ありません。 この文を返す場合false :
var x = 10;
var y = "10";
if (x === y)
»それを自分で試してみてください switch文は、厳密な比較を使用することを忘れることはよくある間違いです。
この場合、スイッチは、警告が表示されます。
var x = 10;
switch(x) {
case 10: alert("Hello");
}
»それを自分で試してみてください この場合、スイッチは、警告が表示されません。
var x = 10;
switch(x) {
case "10": alert("Hello");
}
»それを自分で試してみてください 混乱追加&連結
さらには、 数字を追加することについてです。
連結は 、文字列を追加することについてです。
JavaScriptでは両方の操作は、同じ+演算子を使用します。
このため、数値として番号を追加すると、文字列として番号を追加することから異なる結果が生成されます。
var x = 10 + 5; //
the result in x is 15
var x = 10 + "5";
// the result in x is "105"
»それを自分で試してみてください 2つの変数を追加する場合、結果を予測することは困難です。
var x = 10;
var y = 5;
var z = x + y;
// the result in z is 15
var x = 10;
var y = "5";
var z =
x + y;
// the result in z is "105"
»それを自分で試してみてください 誤解フロート
JavaScriptの中の数字はすべて64ビットの浮動小数点数 (フロート)として保存されます。
JavaScriptを含むすべてのプログラミング言語は、正確な浮動小数点値との難しさを持っています:
var x = 0.1;
var y = 0.2;
var z = x + y
// the result in z will not be 0.3
if (z == 0.3)
// this if test will fail
»それを自分で試してみてください 上記課題を解決するために、それは、乗算と除算のに役立ちます。
JavaScriptの文字列を壊します
JavaScriptは、あなたが2行に文を破ることができます:
しかし、文字列の途中で文を破壊することは動作しません。
あなたは、文字列内のステートメントを破る必要がある場合には、「バックスラッシュ」を使用する必要があります。
入れ違いセミコロン
そのため置き忘れセミコロン、このコードブロックは、xの値にかかわらず実行されます:
if (x == 19);
{
// code block
}
»それを自分で試してみてください returnステートメントを壊します
行の末尾に自動的に文を閉じるためにデフォルトのJavaScriptの動作です。
このため、これらの2つの例は同じ結果を返します。
JavaScriptはまた、あなたが2行に文を破ることができます。
このため、実施例3も同じ結果を返します。
あなたはこのような2行にreturn文を破るなら、何が起こるのだろう。
この関数は未定義を返します!
どうして? JavaScriptは、あなたが意味考えているので:
説明
文は不完全のようであれば:
var
JavaScriptは、次の行を読み取ることによって、ステートメントを完了しようとします:
power = 10;
しかし、以来、この文は完了です。
return
JavaScriptは自動的にこのようにそれを閉じます。
return;
閉鎖セミコロンで文(終了)はJavaScriptでオプションであるためです。
それは完全なステートメントであるため、JavaScriptは、行の最後にreturn文を閉じます。
return文を破ることはありません。
名前付きインデックスで配列へのアクセス
多くのプログラミング言語は、指定されたインデックスを持つ配列をサポート。
名前のインデックスの配列は連想配列(またはハッシュ)と呼ばれています。
JavaScriptは名前のインデックスの配列をサポートしていません 。
JavaScriptでは、 配列は 、番号のインデックスを使用します。
例
var person = [];
person[0] = "John";
person[1] = "Doe";
person[2] = 46;
var x = person.length;
// person.length will return 3
var y = person[0];
// person[0] will return "John"
»それを自分で試してみてください JavaScriptでは、使用という名前のインデックスオブジェクト 。
名前付きインデックスを使用している場合は、アレイにアクセスする際に、JavaScriptは標準オブジェクトに配列を再定義します。
自動再定義した後、配列のメソッドとプロパティが定義されていないか、誤った結果が生成されます。
例:
var person = [];
person["firstName"] = "John";
person["lastName"] = "Doe";
person["age"] = 46;
var x = person.length; // person.length will
return 0
var y = person[0];
// person[0] will return undefined
»それを自分で試してみてください カンマと配列定義を終了
誤:
points = [40, 100, 1, 5, 25, 10,];
いくつかのJSONとJavaScriptエンジンが失敗、または予期しない動作をします。
正しい:
points = [40, 100, 1, 5, 25, 10];
カンマでオブジェクト定義を終了
誤:
person = {firstName:"John", lastName:"Doe", age:46,}
いくつかのJSONとJavaScriptエンジンが失敗、または予期しない動作をします。
正しい:
person = {firstName:"John", lastName:"Doe", age:46}
未定義はNULLではありません
JavaScriptで、nullは 未定義の変数 、プロパティ、メソッドのためのものである、オブジェクトのためのものです。
ヌルであるためには、オブジェクトを定義する必要があり、それ以外の場合は未定義になります。
あなたは、オブジェクトが存在するかどうかをテストしたい場合は、オブジェクトが定義されていない場合、これはエラーがスローされます。
誤:
if (myObj !== null && typeof myObj !== "undefined")
このためには、まず)(typeof演算をテストする必要があります。
正しい:
if (typeof myObj !== "undefined" && myObj !== null)
期待ブロックレベルのスコープ
JavaScriptは、各コードブロックのための新しいスコープを作成しません 。
これは、JavaScriptでの多くのプログラミング言語での真のではなく 、 本当です。
それは、このコードはundefinedを返していることを信じて、新しいJavaScript開発者の間で、共通の間違いです。