JavaScript のデータ型は非常に弱いです (そうでなければ、弱い型指定言語とは言えません)。算術演算子を使用する場合、演算子の両側のデータ型は任意にすることができます。たとえば、文字列を数値に加算できます。異なるデータ型間で操作を実行できる理由は、JavaScript エンジンが操作の前にそれらに対して暗黙的な型変換を実行するためです。次に示すのは、数値型とブール型の追加です。
isNaN を使用して上記のコードをテストした結果、文字列、未定義、さらにはオブジェクトがすべて true を返すことがわかりました。 ! !しかし、それらも NaN であるとは言えませんよね。全体として、結論は次のとおりです。isNaN による NaN の検出は信頼できません。 ! !
幸いなことに、NaN を検出する信頼性が高く正確な方法があります。 NaN がそれ自体に等しくない唯一のものであることは誰もが知っています。次に、次のように、不等号 (!==) を使用して数値がそれ自体に等しいかどうかを判断し、NaN を検出できます。 >
var a = NaN; a !== a; // true var b = "foo"; b !== b; // false var c = undefined; c !== c; // false var d = {}; d !== d; // false var e = { valueOf: "foo" }; e !== e; // false
function isReallyNaN(x) { return x !== x; }
オブジェクトはプリミティブ値に変換できます。最も一般的な方法は、次のように文字列に変換することです。
"the Math object: " + Math; // "the Math object: [object Math]" "the JSON object: " + JSON; // "the JSON object: [object JSON]"
Math.toString(); // "[object Math]" JSON.toString(); // "[object JSON]"
"J" + { toString: function() { return "S"; } }; // "JS" 2 * { valueOf: function() { return 3; } }; // 6
ただし、ほとんどの場合、これは望ましいことではありません。一般に、valueOf と toString で表される値を同じにするようにしてください (ただし、型は異なる場合があります)。
var obj = { toString: function() { return "[object MyObject]"; }, valueOf: function() { return 17; } }; "object: " + obj; // "object: 17"
この関数は、0、-0 を含む、真の値が false のパラメータを無視します。
function point(x, y) { if (!x) { x = 320; } if (!y) { y = 240; } return { x: x, y: y }; }
コードをコピーします
この書き方では 0 と未定義を区別できます:
function point(x, y) { if (typeof x === "undefined") { x = 320; } if (typeof y === "undefined") { y = 240; } return { x: x, y: y }; }
もう 1 つの方法は、次のようにパラメータを使用して未定義と比較することです:
point(); // { x: 320, y: 240 } point(0, 0); // { x: 0, y: 0 }
if (x === undefined) { ... }
1. 型変換により型エラーが隠れる場合があります。 2. 「+」は、オペランドに応じて、文字列の連結と算術加算の両方を表すことができます。一方が文字列の場合、それは文字列の連結です。
3. オブジェクトは、valueOf メソッドを通じてそれ自体を数値に変換し、toString メソッドを通じてそれ自体を文字列に変換します。
4. valueOf メソッドを持つオブジェクトは、文字列形式で等しい数値を返すように対応する toString メソッドを定義する必要があります。
5. 一部の未定義変数を検出する場合は、直接真値演算を行うのではなく、typeOf または未定義との比較を使用する必要があります。
JavaScript の暗黙的な型変換については以上です。お役に立てば幸いです。