最近 Rhino の本を読んでいませんでしたが、その本の翻訳はひどく、特にプロトタイプのセクションが汚かったです。その後、同僚に紹介されて、js の高度なプログラミングに関する本を購入しました。それから私はそれを一生懸命読み続けました。もう文句は言わないで、js の新しいパッケージングの種類について話しましょう。
1: 文字列
文字列型について言えば、非常に興味深いものです。通常、以下に示すように文字列型を定義します。
しかし、js には非常に特殊な点が 1 つあります。それは、文字列型は参照型ではなく基本型であるということです。つまり、文字列の値は「スタック」に格納されますが、これはそうではありません。 C# などの多くの言語では、js が参照型として使用されないことは理解できると思います。結局のところ、js はマルチスレッドで動作できず、C# のスレッド スタック スペースは string の場合に 1M しか割り当てられません。 C# では value 型を使用するため、スタック爆発が発生する可能性がありますが、js にはスタック容量の制限がないため、スタック爆発は発生しません。
次に、部分文字列などの文字列に対して一連の操作を実行することがよくあります。以下に示すように:
先ほど述べたように、文字列の値はスタックに直接保存されますが、どのようにして部分文字列を持つことができるのでしょうか?公式サイトの説明によれば、以下の通りです。 このとき、sを参照型にラップするためにString型を使用します。次に、String 型の内部実装を使用します。サブストリング メソッドは String で内部的に定義されているため、実際には、上記のコードは js 内で次のように実装される必要があります。
1 2 3 |
|
ご覧のとおり、パッケージ化タイプは、コードの実行時に実際に s を String 参照タイプにラップし、その String 参照タイプで部分文字列メソッドを呼び出してから、「hello」値を s に再割り当てします。そして最後に、その効果は s="hello"、r="lo" です。注意深く観察すると、color などの属性を s に動的に付加した場合、color を再度読み取ると、その属性は付加されないことがわかります。以下の図のような色の値を読み取ります:
上で述べた原則を理解していれば、js エンジンで s.color="red" を使用すると console.log(s.color) が unknown に等しいことは驚くべきことではありません。属性を呼び出す方法があることがわかり、すぐにそれをバックグラウンドで動的に String 型にラップし、String の下に新しい属性 color=red を追加して、内部で s の値を "hello" にリセットします ( s "hello") の場合、s.color を出力するために console.log を実行すると、JS エンジンは属性を呼び出す別のメソッドがあると判断し、再度 new String("hello") を実行します。当然、この新しい String 型は次のようになります。 color 属性がないため、undefine が返されます。
先ほども言いましたが、この種のパッケージ化操作はバックグラウンドで js によって動的に追加および削除され、基本型を参照型に変換します。
<1>: 言うまでもなく、これはスタックとヒープです。C# をよく知っている場合は、ボックス操作とボックス解除操作と考えることができます。
<2>: すべての参照型はオブジェクトから継承することがわかります。たとえば、C# ではすべての型がオブジェクトのサブクラスであることに注意してください。 🎜>
内部ではそうではありません。instanceof を使用して確認できます。
2: ブール値
String ラッパー クラスを理解していれば、実際には Boolean ラッパー クラスもそれと同じ原理を持っていますが、null または未定義でない限り、Boolean 型を使用するときの注意点があります。それ以外の場合は常に true となり、このブール型は以下に示すように、まさにこのボックス操作を実行します:
この時点では、b はもはや単純な基本型ではなく、参照型であることがわかります。この時点で、「and or」は望む結果を生成できなくなります。 Number ラッパー クラスもあります。これについては注意事項がないため、説明しません。