よくある間違い
この章では、JavaScriptのよくある間違いを指摘します。
代入演算子の誤った使用
プログラマがifステートメントで、比較演算子(==
)の代わりに誤って代入演算子(=
)を使用すると、 JavaScriptプログラムで予期しない結果が生成されることがあります 。
xが10に等しくないため、このif
ステートメントはfalse
を返します。
10がtrueであるため、次のif
ステートメントはtrue
(期待どおりではないかもしれません)を返します。
0はfalseであるため、このif
ステートメントはfalse
(期待どおりではない可能性があります) を返します。
代入は常に代入の値を返します。
緩やかな比較を期待
通常の比較では、データ型は関係ありません。このif
ステートメントはtrueを返します。
厳密な比較では、データ型が重要です。このif
はfalseを返します。
switch
ステートメントで厳密な比較が使用されていることを忘れてしまうのは、よくある間違いです。
これにより、case switch
アラートが表示されます。
これにより、case switch
アラートを表示しません。
紛らわしい加算と連結
足し算は数字を足し算することです。
連結とは文字列を追加することです。
JavaScriptでは、両方の操作で同じ+
演算子が使用されます。
このため、数値を数値として追加すると、数値を文字列として追加する場合とは異なる結果が生成されます。
2つの変数を追加する場合、結果を予測するのが難しい場合があります。
誤解されたフロート
JavaScriptのすべての数値は、64ビット浮動小数点数(Float)として保存されます。
JavaScriptを含むすべてのプログラミング言語では、正確な浮動小数点値を扱うのが困難です。
上記の問題を解決するには、乗算と除算が役立ちます。
JavaScript 文字列の分割
JavaScriptでは、ステートメントを2行に分割できます。
ただし、文字列の途中でステートメントを分割しても機能しません。
文字列内のステートメントを分割する必要がある場合は、「バックスラッシュ」を使用する必要があります。
セミコロンの置き忘れ
セミコロンの位置が間違っているため、このコードブロックはxの値に関係なく実行されます。
リターンステートメントを破る
行末でステートメントを自動的に閉じるのは、JavaScriptのデフォルトの動作です。
このため、次の2つの例は同じ結果を返します。
JavaScriptでは、ステートメントを2行に分割することもできます。
このため、例3も同じ結果を返します。
しかし、次のようにreturnステートメントを2行に分割するとどうなるでしょうか。
関数は、undefined
を返します!
なぜならJavaScriptがあなたの意図を次のように判断したためです。
説明
ステートメントが次のように不完全な場合:
JavaScriptは、次の行を読み取ってステートメントを完成させようとします。
しかし、このステートメントは完全であるため、次のようになります。
JavaScriptは次のように自動的に閉じます。
これは、JavaScriptではセミコロンでステートメントを閉じる(終了する)ことがオプションであるために発生します。
JavaScriptはreturnステートメントを行末で閉じます。これは完全なステートメントであるためです。
代入は常に代入の値を返します。
名前付きインデックスを使用した配列へのアクセス
多くのプログラミング言語は、名前付きインデックスを持つ配列をサポートしています。
名前付きインデックスを持つ配列は、連想配列(またはハッシュ)と呼ばれます。
JavaScriptは名前付きインデックスを持つ配列をサポートしていません。
JavaScriptでは、配列は番号付きインデックスを使用します。:
例
JavaScriptでは、オブジェクトは名前付きインデックスを使用します。
名前付きインデックスを使用する場合、配列にアクセスするときに、JavaScriptは配列を標準オブジェクトに再定義します。
自動再定義の後、配列のメソッドとプロパティは未定義または不正確な結果を生成します。
例:
カンマで定義を終了する
ECMAScript5では、オブジェクトと配列の定義の末尾のカンマは有効です。
オブジェクトの例:
配列の例:
警告 !!
Internet Explorer8がクラッシュします。
JSONでは、末尾のコンマを使用できません。
JSON:
JSON:
未定義はnullではありません
JavaScriptのオブジェクト、変数、プロパティ、およびメソッドは、undefined
です。
さらに、空のJavaScriptオブジェクトはnull
値を持つことができます。
これにより、オブジェクトが空かどうかをテストするのが少し難しくなる可能性があります。
型が未定義かどうかテストすることで、オブジェクトが存在するかどうかをテストできます。:
ただし、オブジェクトがnull
かどうかをテストすることはできません、オブジェクトがundefined
の場合にエラーがスローされるためです。:
正しくない:
この問題を解決するには、オブジェクトがnull
ではないか、undefined
ではないかをテストする必要があります。.
ただし、これでもエラーが発生する可能性があります。
正しくない:
このため、notをundefined
でテストする前にnotをnull
でテストする必要があります。:
プログラミング学習を加速させる
プログラミングをプロの講師に教えてもらいませんか。