ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript を理解する

JavaScript を理解する

高洛峰
高洛峰オリジナル
2016-11-26 09:31:54927ブラウズ

はじめに

プログラミングの世界には基本要素が 2 つだけあり、1 つはデータ、もう 1 つはコードです。プログラミングの世界は、データとコードが分かちがたく絡み合い、無限の生命力を発揮します。

データは本質的に静かで、常にその本質を維持しようとしますが、コードは本質的に活発で、常に世界を変えようとします。

ご存知のとおり、データ コード間の関係は、物質とエネルギーの関係に驚くほど似ています。データにも慣性があり、外力を加えるコードがなければ常に元の状態を維持します。コードはエネルギーのようなもので、その存在の唯一の目的は、データの元の状態を変更するために一生懸命働くことです。コードがデータを変更すると、データの抵抗により、コードの元の傾向にも影響が生じたり、変化したりします。場合によっては、データをコードに変換したり、コードをデータに変換したりすることもできます。E=MC2 のようなデジタル変換式も存在します。しかし、このデータとコードの間の矛盾しながらも統一された操作には、コンピューターの世界の法則が常に反映され、これらの法則はまさに私たちが作成するプログラム ロジックです。

ただし、プログラマーによって世界観が異なるため、これらのデータとコードは異なって見えます。その結果、異なる世界観を持つプログラマーが独自の方法論を用いてプログラミングの世界の進化と発展を推進しています。

ご存知のとおり、今日最も人気のあるプログラミングのアイデアは、オブジェクト指向プログラミングのアイデアです。なぜオブジェクト指向の考え方がプログラミングの世界で急速に普及するのでしょうか?なぜなら、オブジェクト指向の考え方では、データとコードが初めて 1 つに結合され、それが単純なオブジェクト概念でプログラマーに提示されるからです。これにより、元の乱雑なアルゴリズムとサブルーチン、および絡み合った複雑なデータ構造が突然、明確で整然としたオブジェクト構造に分割され、それによって私たちの心の中のデータとコードの乱雑な結び目が明確になります。私たちはより明晰な心を持ち、別のレベルの思考からより広大なプログラミングの世界を探索することができます。

第5世祖ホンレンは『対象真経』の説教を終えた翌日、弟子たち全員にこう言いました。最年長の弟子である沈秀は、最も理解力のある兄弟として認められており、彼の詩には次のように書かれています。埃っぽい!」。この聖句が出てくるとすぐに、兄弟たちの間ですぐにセンセーションを巻き起こし、とてもよく書かれていると皆が言いました。火の頭の僧侶である恵能だけが、それを見た後、静かにため息をつき、壁にこう書きました。 」それから彼は首を振って立ち去りました。慧能のガタを読んだ人は皆、「めちゃくちゃに書かれていて理解できない」と言います。紅蓮先生は沈秀の詩を読んで賞賛にうなずき、その後恵能の詩を見て静かに首を横に振った。その夜、紅蓮は静かに慧能を瞑想室に呼び、長年大切にしていたソフトウェア経典を教え、月明かりの下で一晩逃がしました...

その後、慧能は師の高い期待に本当に応えました。 . 南に禅宗のもう一つの広大な空を創造しました。フイネンが持ち去ったソフトウェア教典の一つが「JavaScript教典」だった!

シンプルさに戻る

JavaScript を理解するには、まずオブジェクトとクラスの概念を手放し、データとコードの原点に戻る必要があります。前述したように、プログラミングの世界にはデータとコードという 2 つの基本要素しかなく、これら 2 つの要素は絡み合っています。 JavaScript は、データとコードを最も原始的なレベルまで単純化します。

JavaScript のデータは非常に簡潔です。単純なデータには、未定義、null、ブール、数値、文字列の 5 つのタイプしかありませんが、複雑なデータにはオブジェクトという 1 つのタイプしかありません。これは、世界の最も基本的な要素を金属、木、水、火、土に分類し、他の複雑な物質はこれら 5 つの基本要素から構成されるという古典的な中国の単純唯物論に似ています。

JavaScript のコードは、関数という 1 つのフォームにのみ反映されます。

注: 上記の単語はすべて小文字です。数値、文字列、オブジェクト、関数などの JavaScript 組み込み関数と混同しないでください。ご存知のとおり、JavaScript 言語では大文字と小文字が区別されます

JavaScript の識別子、定数、変数、パラメーターは、unfined、null、bool、number、string、object、および function 型の 1 つであり、typeof が返す型です。値。これ以外のタイプはありません。

まず単純なデータ型について話しましょう。

未定義: すべての未知のもの、何もないもの、想像できないものを表し、コードはそれを処理できません。 petrelrelure、吹き飛ばされた、涙、涙、彼女は彼女が彼女に彼女が彼女をすべてレースすることを望んでいる彼女が彼女が彼女に必要とする彼女が彼女に彼女をすべてレースすることを望んでいる彼女は彼女が彼女に必要とする彼女が彼女に必要とする彼女が彼女に必要とする彼女が彼女に必要とする彼女が必要とすることを望んでいますE 任意の変数または属性に「未定義」を割り当てることができますが、これは変数がクリアされることを意味するのではなく、追加の属性を持つことになります。

null: コンセプトはありますが、何もありません。何もないところに何かがあるように見え、何かの中に何もないように見える。想像するのは難しいですが、すでにコードで処理できます。注: Typeof (Null) は Object を返しますが、NULL は Object ではなく、NULL 値を持つ変数は Object ではありません。

ブール値: はい、いいえ、いいえ、疑いはありません。正しいことは正しい、間違っていることは間違っている、絶対に明らかです。コードによって処理でき、コードのフローを制御することもできます。

数: 直線的なもの、大きさと順序が明確、多数ではあるが無秩序ではない。コードのバッチ処理を容易にし、コードの反復とループも制御します。 O 注: Number には Typeof (nan) と Typeof (Infinity) が返されます。

NaN が数値計算に関与する構造は NaN であり、NaN != NaN です。


文字列: 機械の信号ではなく、人間にとって合理的なもの。人間とコンピューターの情報通信、人間の意図のコード理解などはすべてそれに依存しています。

単純型はオブジェクトではなく、JavaScript にはこれらの単純型をオブジェクト化する機能がありません。単純型の定数値が直接割り当てられている識別子、変数、パラメータはオブジェクトではありません。

いわゆる「オブジェクト化」とは、データとコードを複雑な構造に編成する機能です。 JavaScript では、オブジェクト型と関数型のみがオブジェクト化機能を提供します。

クラスはありません

Objectはオブジェクトの型です。 JavaScript では、データやコードがどれほど複雑であっても、それらをオブジェクトの形式でオブジェクトに整理できます。

しかし、JavaScript には「クラス」という概念がありません。

多くのオブジェクト指向プログラマにとって、これはおそらく JavaScript を理解するのが最も難しいことです。はい、ほとんどすべてのオブジェクト指向の本で最初に話されるのは、オブジェクト指向の柱である「クラス」の概念です。突然「カテゴリー」がなくなり、私たちは精神的な支えを失ったように感じ、自分に主人がいないように感じます。オブジェクトやクラスを手放して、「オブジェクトにルートがなく、型が見えない」状態に到達するのは簡単ではないようです。

それでは、まず JavaScript プログラムを見てみましょう:
var life = {};
for(life.age = 1; life.age {
“switch(life.age)

ケース 1: life.body ";
life .gill = "エラ";
life.body = "オタマジャクシ";
life.say = function(){alert(this.age+this.body+"-"+this) .tail+","+this.gill)} ;
ブレーク; life.lung = "肺" Say = function(){alert(this.age+this.body+"-"+this.legs+","+this .lung)};
生命が誕生したとき、それはプロパティやメソッドを持たない単なるオブジェクトでした。最初のライフプロセスには、「卵細胞」のように見える body 属性と Say メソッドがあります。第二の人生で「尻尾」と「エラ」が生えた、それは明らかに「オタマジャクシ」だった。 3度目の人生で尾と鰓の属性は消失したが、「4本の足」と「肺」が生え、脚と肺の属性を獲得し、最終的には「カエル」となった。豊かな想像力があれば、ハンサムな「王子様」に変身させたり、美しい「お姫さま」などと結婚させたりすることもできるかもしれません。ただし、このプログラムを読んだ後、次の質問について考えてください:

クラスは必ず必要ですか?

子供の頃の「お母さんを探している小さなオタマジャクシ」のおとぎ話をまだ覚えていますか?おそらく昨夜、あなたのお子さんはたまたまこの美しいおとぎ話を聞きながら眠りに落ちたのでしょう。かわいい小さなオタマジャクシは、自分の種類が進化し続けるうちに、徐々に母親と同じ「種類」になり、母親を見つけました。このおとぎ話に含まれるプログラミング哲学は次のとおりです。オブジェクトの「クラス」はゼロから生まれ、進化し続け、最終的には消滅します...

「クラス」は確かに複雑な現実を理解するのに役立ちます 世界、この混沌とし​​た現実世界分類する必要があります。しかし、思考が「カテゴリー」に縛られてしまうと、「カテゴリー」が「飽き」てしまいます。想像してみてください。生物が最初から固定の「クラス」を割り当てられたとしても、進化することはできるでしょうか?オタマジャクシはカエルになれるでしょうか?おたまじゃくしが母親を探している話も子供たちに話してもらえますか?

したがって、JavaScript には「クラス」は存在せず、クラスは非表示になり、オブジェクトと統合されています。 「クラス」という概念を手放したからこそ、JavaScriptのオブジェクトは他のプログラミング言語にはない生命力を持っています。

この時点で、心の奥底で何かを感じ始めたら、あなたは JavaScript の禅を徐々に理解し始めています。

関数の魔法

次に、JavaScript 関数の魔法について説明します。

JavaScript コードには関数の形式が 1 つだけあり、関数は関数の型です。おそらく他のプログラミング言語にはプロシージャやメソッドなどのコード概念がありますが、JavaScript では関数の形式は 1 つだけです。関数を記述するときは、関数型のエンティティを作成するだけです。次のプログラムを見てください:
function myfunc()
{
alert("hello");
};

alert(typeof(myfunc));

このコードを実行すると、typeof(myfunc) が表示されます。関数を返します。上記の関数を作成する方法「定義式」と呼びます。次の「変数式」に書き換えます。したがって、typeof(myfunc) も関数を返します。 実際、これら 2 つの関数の記述方法は同等であり、いくつかの小さな違いを除いて、それらの内部実装はまったく同じです。つまり、作成する JavaScript 関数は単なる名前付き変数であり、変数の型は関数であり、変数の値は作成した関数のコード本体です。

あなたは賢明で、すぐにさらに質問するかもしれません: 関数は単なる変数であるため、変数には任意に値を割り当ててどこでも使用できます???/p>

次のコードを見てみましょう:
var myfunc = function ( )

「はい」);

}; func(); //myfunc への 2 回目の呼び出しでは、yes が出力されます

このプログラムを実行した結果、答えは「はい」です。関数が初めて呼び出された後、関数変数には新しい関数コード本体が割り当てられるため、関数が 2 回目に呼び出されるときは、異なる出力が表示されます。

さて、上記のコードを最初に定義された関数形式に変更しましょう:
function myfunc ()
{
alert("hello");
};
myfunc() // ここで myfunc を呼び出し、hello の代わりに Yea を出力します。

function myfunc ()
{
alert("yeah");
};
myfunc(); //myfunc はここで呼び出され、当然、yeah を出力します

論理的に言えば、2 つのシグネチャはまったく同じ関数です。他のプログラミング言語では違法であるはずです。しかし、JavaScript ではこれが当てはまります。しかし、プログラムを実行した後、奇妙な現象が発見されました。2 つの呼び出しは、最後の関数によって出力された値だけでした。明らかに、最初の関数は何も行いません。これが理由です?

JavaScriptの実行エンジンはプログラムを一行ずつ解析して実行するのではなく、部分的に解析して実行していることが分かりました。また、同じプログラムの解析と実行では、定義されている関数ステートメントが最初に抽出されて実行されます。関数定義の実行後、他のステートメントコードが順番に実行されます。つまり、myfunc が初めて呼び出される前に、最初の関数ステートメントによって定義されたコード ロジックが 2 番目の関数定義ステートメントによって上書きされます。したがって、両方の呼び出しで最後の関数ロジックが実行されます。


たとえば、この JavaScript コードを 2 つの部分に分割する場合は、HTML に記述し、