ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript の暗黙的な型変換_JavaScript のヒント

JavaScript の暗黙的な型変換_JavaScript のヒント

WBOY
リリース: 2016-05-16 15:10:40
オリジナル
1226 人が閲覧しました

JavaScript のデータ型は非常に弱いです (そうでなければ、弱い型指定言語とは言えません)。算術演算子を使用する場合、演算子の両側のデータ型は任意にすることができます。たとえば、文字列を数値に加算できます。異なるデータ型間で操作を実行できる理由は、JavaScript エンジンが操作の前にそれらに対して暗黙的な型変換を実行するためです。次に示すのは、数値型とブール型の追加です。

コードをコピーします コードは次のとおりです:
3 + true // 4

結果は数値です! C または Java 環境の場合、演算子の両側のデータ型が一致しないため、上記の操作は確実にエラーになります。ただし、JavaScript では、次のような、関数以外の呼び出し時や null または未定義のプロパティの読み取り時など、間違った型によってエラーが発生するケースはほとんどありません。

コードをコピーします コードは次のとおりです:
"hello"(1); // エラー: 関数ではありません
null.x; // エラー: null
のプロパティ 'x' を読み取れません
ほとんどの場合、JavaScript はエラーを起こしませんが、対応する型変換を自動的に実行します。たとえば、-、*、/、% などの算術演算子はオペランドを数値に変換しますが、「+」記号は場合によっては算術プラス記号である場合もあれば、算術プラス記号である場合もあります。は文字列です。具体的な詳細は次のようにオペランドによって異なります。

コードをコピーします コードは次のとおりです:
2 + 3; // 5
"hello" + " world" // "hello world"
;

しかし、文字列と数値を追加すると、結果はどうなるでしょうか? JavaScript は、次のように、数値と文字列のどちらが先に来るかに関係なく、数値を文字に自動的に変換します。

コードをコピーします コードは次のとおりです: "2" + 3; // "23"
2 + "3" // "23"



文字列と数値を加算した結果は文字列です。 文字列と数値を加算した結果は文字列です。 重要なことは 3 回言います。 ! ! ! ! !
なお、「+」の操作方向は以下のように左から右となります。

コードをコピーします コードは次のとおりです: 1 + 2 + "3" // "33"
;


これは次と同等です:

コードをコピーします コードは次のとおりです: (1 + 2) + "3" // "33"
;


対照的に、次の結果は異なります:

コードをコピーします コードは次のとおりです: 1 + "2" + 3 // "123"


ただし、暗黙的な型変換では、いくつかのエラーが隠れることがあります。たとえば、null は 0 に変換され、未定義は NaN に変換されます。次のように、NaN と NaN は等しくないことに注意してください (これは浮動小数点数の精度によるものです):

コードをコピーします コードは次のとおりです: var x = NaN;
x === NaN // false



JavaScript は特定の値が NaN かどうかを検出する isNaN を提供しますが、isNaN 関数を呼び出す前に暗黙的な変換プロセスがあり、元々 NaN ではない値が NaN に変換されるため、これはあまり正確ではありません。 、次のように:

コードをコピーします コードは次のとおりです: isNaN("foo") // true
; isNaN(未定義) // true
isNaN({}); // true
isNaN({ valueOf: "foo" }); // true

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;
}
ログイン後にコピー
わかりました。NaN 検出方法はとても簡単です。オブジェクトの暗黙的な変換について引き続き説明しましょう。

オブジェクトはプリミティブ値に変換できます。最も一般的な方法は、次のように文字列に変換することです。

"the Math object: " + Math; // "the Math object: [object Math]"
"the JSON object: " + JSON; // "the JSON object: [object JSON]"
ログイン後にコピー
オブジェクトは、toSting 関数を呼び出すことで文字列に変換されます。手動で呼び出して確認できます。

Math.toString(); // "[object Math]"
JSON.toString(); // "[object JSON]"
ログイン後にコピー
同様に、valueOf 関数を使用してオブジェクトを数値に変換することもできます。もちろん、この valueOf 関数を次のようにカスタマイズすることもできます。

オブジェクトに valueOf メソッドと toString メソッドの両方がある場合、次のように、常に valueOf メソッドが最初に呼び出されます。
"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"
ログイン後にコピー
最後のタイプの強制型変換は、if、||、&& などの「真理演算」と呼ばれることがあり、これらのオペランドは必ずしもブール値である必要はありません。 JavaScript は、単純な変換ルールを通じて一部の非ブール値をブール値に変換します。ほとんどの値は true に変換されますが、false になるのはほんのわずかです。false、0、-0、”"、NaN、null、未定義です。false 値を持つ数値、文字列、オブジェクトがあるため、関数のパラメーターが渡されるかどうかを判断するために真理値変換を直接使用することは、あまり安全ではありません。たとえば、次のようなデフォルト値を持つオプションのパラメータを持つことができる関数があります:

この関数は、0、-0 を含む、真の値が false のパラメータを無視します。
function point(x, y) {
if (!x) {
x = 320;
}
if (!y) {
y = 240;
}
return { x: x, y: y };
}
ログイン後にコピー

コードをコピーします

コードは次のとおりです: point(0, 0); // { x: 320, y: 240 }

未定義をより正確に検出する方法は、typeof 操作を使用することです。

この書き方では 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 の暗黙的な型変換については以上です。お役に立てば幸いです。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート