JavaScript は型指定が弱い言語です。変数を宣言するとき、Var x はどの型の値でも宣言する必要はありません。
例:
var str = "string....";
var arr = ["this","is","array"];
var obj = { name :"caizhongqi",age:26,sex:"male"};
これらは非常にシンプルで便利に思えますが、この便利さはいくつかのとらえどころのない驚きももたらします。以下の例を見てください。 ):
アラートが「これは文字列です」として出てくることはすぐにわかるかもしれませんが、Java 言語を使用するプログラマーの場合は、var y=x を割り当てる必要があります。メモリ内の x のアドレス (ポインタ) を y 変数に代入するため、「ニーハオ」という警告は Java 言語の習慣により一致するはずだと考えられていますが、JavaScript 言語ではそうではありません。文字列の割り当ては直接行われます。操作では、データを y の記憶領域に直接コピーします。
次の例 (例 2) を見てください。
アラートが「こんにちは」と出てきたと思ったら、それは間違いです。 var y = x のとき、x はすでにその配列を y に渡しているのではないでしょうか?しかし、実際にはそうではありません。var y = x の場合、x はメモリ内のアドレス (ポインタ) を渡します。 x[0]="world" は元の保存場所のデータを変更するため、alert(y[0]) は x の新しい値を使用して警告します。混乱した?一度に直接測定し、直接見積もられるのはなぜですか?
心配しないでください。次の例はさらに混乱します (例 3):
あなたの目からは、アラートが「こんにちは」と出ていることがわかります。これはとても予測不可能で奇妙な JavaScript です。
スティーブン・チョウの「国内ゼロペイント」にも同様のシーンがあります。
シン氏が任務で深センから香港に到着したばかりのとき、アニタ・ユエンは荷物の中にヘアドライヤーを見つけました、と私は言いました。本当はヒゲ剃りだったのですが、革靴を脱ぐとドライヤーで、携帯電話に見えるのはヒゲ剃りでした。シェーバーとヘアドライヤーはアニタ・ユエンと観客を混乱させました、はははは、これは私のお気に入りの映画の一つです、初めて見たときはお腹が痛かったです。
今の変数の割り当てを振り返ると、直接量と参照量の使用は、シェーバーとヘアドライヤーを交換するようなもので、全員がめまいを感じました。
実際、問題は x = ["ni", "hao"] の 2 番目の代入にあります。メモリ内の変更と、JavaScript による文字列型とオブジェクト型の処理の違いを見てみましょう。 🎜 >
次の 2 つの状況が観察されます:
var x = "this is string...";
var y = ["this","is","string"];
x と y の違いは型にあります。JavaScript パーサーは文字列値 (実際にはコピー) を x (直接量) に割り当てますが、配列ポインタは y (参照量) に割り当てられます。全自動!次の図と組み合わせると、よりよく理解できるかもしれません:
図では、p1、p2... は変数へのポインターであり、上記の var y の y はオブジェクト型を格納します。ポインタ p1 (仮定)、および x には文字列自体が格納されます。例 3 を再度分析してください。var ni","hao"] を実行すると、パーサーはこの新しい配列を保持するための新しい記憶領域を開きます。x はこの新しい記憶領域のポインタです。これは、再定義 (または再割り当て) を意味します。 JavaScript の変数は、元のスペースを破壊せずに新しいストレージ スペースを作成します。例 2 を見てください。x[0] = "world"、この文は x の新しい値を定義せず、新しいストレージ スペースを作成しません。ただし、変更されるのはそのストレージのデータだけです。したがって、例 2 の最後のアラートは「world」です。例 1 は文字列の代入であり、プロセス全体が直接操作です。
上記の分析からわかるように、JavaScript 変数は直接の量やポインタを格納できます。したがって、日常のコーディングでは、次のような問題に注意する必要があります。ループ内の大きな文字列の連結と代入は、プログラムの実行効率に直接影響を与える可能性があるためです。
2 つの例を見てください:
var _tmpStr="";
var str = "これは大きな文字列です..."; 100; i ){ _tmpStr = a;
}
a = _tmpStr;
これは直接量を使用する文字列演算であるため、各ループは非常に大きな文字列を演算する必要があります。そして非効率的です。代わりに参照操作を使用する場合、つまり配列を使用する場合:
var str = "これは大きな文字列です...";
var _tmpArray = []
for (i=0; i _tmpArray[i]=str;
}
100k の文字列がある場合はテストを実行します, 私のマシンでは直接接続の操作に約 2600 ミリ秒かかりますが、アレイ接続を使用すると 150 ミリ秒かかります。効率は 10 倍以上異なります。
こんなに長い記事を書くのは久しぶりでした。一日のほとんどを費やしてしまいました。