興味深いJavaScript暗黙的なタイプの変換操作の実例分析


本論文の実例は、JavaScript暗黙的なタイプ変換動作を説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
JavaScriptのデータタイプは非常に弱いです。演算子を使用する場合、演算子の両方のデータタイプは任意であってもよく、たとえば、1つの文字列は数値と加算されても良い。違うデータタイプの間で演算ができるのは、JavaScriptエンジンが演算前にこっそりと彼らを暗黙のタイプに変換したからです。次のように数値タイプとブールタイプの加算です。

3 + true; // 4

結果は数値型!CまたはJava環境であれば、上の演算は演算子の両方のデータタイプが一致しないためにエラーが発生します。ただし、JavaScriptにおいては、エラーの種類が非関数を呼び出したり、nullまたはundefinedの属性を読み込んだりした場合には、以下のようになります。

"hello"(1); // error: not a function
null.x; // error: cannot read property 'x' of null

多くの場合、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に変換され、undefinedはNaNに変換されます。なお、NaNとNaNは等しくない(浮動小数点数の精度により決定される)。

var x = NaN;
x === NaN; // false

JavaScriptは、ある値がNaNであるかどうかを検出するためにisNaNを提供していますが、これはあまり正確ではないので、isNaN関数を呼び出す前に、自身は暗黙的な変換のプロセスが存在しています。NaNではないこれらの値をNaNに変換します。

isNaN("foo"); // true
isNaN(undefined); // true
isNaN({}); // true
isNaN({ valueOf: "foo" }); // true

上のコードは、isNaNを使ってテストしましたが、文字列、undefined、さらには対象まで、結果は本物に戻ります!しかし、彼らも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;
}

OKです。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関数をカスタマイズできます。以下の通りです。

"J" + { toString: function() { return "S"; } }; // "JS"
2 * { valueOf: function() { return 3; } }; // 6
もし、オブジェクトが同時にvalueOf方法とtostring方法が存在すると、valueOf方法は常に優先的に呼び出される。

var obj = {
  toString: function() {
    return "[object MyObject]";
  },
  valueOf: function() {
    return 17;
  }
};
"object: " + obj; // "object: 17"

しかし、多くの場合、これは私たちが望むものではなく、一般的には、できるだけvalueOfとtoSteringが示す値を同じにしています。
最後の強制的なタイプの転換は、私達はよく「真の値演算」と呼びます。例えば、if、𞓜|、&& 、彼らの操作数は必ずしもブール型の額ではありません。JavaScriptは簡単な変換規則によって、いくつかの非ブール型の値をブール型に変換します。ほとんどの値はtrueに変換されますが、falseだけが少数です。彼らはfalse、0、-0、「」、NaN、null、undefinedです。数字と文字列とオブジェクトの値がfalseであるため、直接に真価変換で関数のパラメータが伝わったかどうかを判断します。これはあまり安全ではありません。例えば、デフォルトのオプションパラメータを持つことができる関数があります。

function point(x, y) {
if (!x) {
  x = 320;
}
if (!y) {
  y = 240;
}
  return { x: x, y: y };
}

この関数は、0,-0を含む任意の真の値を無視します。

point(0, 0); // { x: 320, y: 240 }

undefinedを検出するより正確な方法は、typeofで操作することです。

function point(x, y) {
if (typeof x === "undefined") {
  x = 320;
}
if (typeof y === "undefined") {
  y = 240;
}
  return { x: x, y: y };
}

このような書き方は、0とundefinedの区別ができます。

point(); // { x: 320, y: 240 }
point(0, 0); // { x: 0, y: 0 }

もう一つの方法はパラメータを利用してundefinedと比較することです。

if (x === undefined) { ... }

まとめ:
1.タイプエラーは、タイプ変換によって非表示になる場合があります。
2.「+」は文字列の接続を表してもいいし、算術加算を表してもいいです。これはその操作数によって決まります。文字列としての一つがあれば、文字列の接続です。
3.対象はvalueOf法で自分を数字に変換し、toString法で自分を文字列に変換する。
4.valueOf方法を有するオブジェクトは、同じ数字の文字列形式を返すために、対応するtoString方法を定義すべきである。
5.定義されていない変数を検出する場合は、typeOfまたはundefinedと比較し、直接に真の値で演算すべきではない。
興味のある友達はオンラインHTML/CSS/JavaScriptコードを使ってツールを実行できます。http://tools.jb51.net/code/HtmlJsRun上記コードの運行効果をテストします。
もっと多くのJavaScriptに関する内容に興味がある読者は、当駅のテーマを見ることができます。「JavaScript数学演算の使い方のまとめ」、「JavaScriptデータ構造とアルゴリズム技術のまとめ」、「JavaScript配列操作技術のまとめ」、「JavaScriptソートアルゴリズムのまとめ」、「JavaScriptはアルゴリズムと技術の総括を遍歴します。」、「JavaScript検索アルゴリズムのテクニックのまとめ」および「JavaScriptエラーとデバッグテクニックのまとめ
本論文で述べたように、JavaScriptプログラムの設計に役に立ちます。