Java開発者の目を通してJavaScriptを初めて見る





JavaとJavaScriptは同じものではありません! 今、あなたは石工の主な秘密を知っています。 この記事では、Java開発者の目を通してJavaScript言語に関する考えや考えを共有したいと思います。 データ構造、型、関数、オブジェクト、クラス、およびJavaとJavaScriptの他の一般的な機能を比較します。



基礎



JavaScriptは、スクリプトを記述するための解釈されたスクリプト言語です。 つまり、記述するコードは、命令から命令へ、スクリプトからスクリプトへと、行ごとに実行されます。 Javaはコンパイルされた言語です。つまり、Javaプログラムを開始する前に、コンパイラは、作成したすべてのコードをJVMが理解できる特別なマシンコード- バイトコードに変換する必要があります。



これらの違いに関連してJSで記述を開始したJava開発者の欠点は次のとおりです。





//   Java public class JavaVsJS { public static void foo(String name) { bar(name); } private static void bar(String name) { System.out.println(name); } public static void main(String[] args) { JavaVsJS.foo("Igor Ivanovich"); } }
      
      





 //   JavaScript var name = "Igor Ivanovich"; //  bar()      foo() function bar(name) { document.write(name); } function foo(name) { bar(name); } foo(name);
      
      





変数とそのタイプ



JavaScriptは、Javaとは異なり、型が弱い言語です。 一方では、柔軟性が増し、他方では、脚を撃つ機会が増えます。 JSで変数を宣言するには、 varキーワードを使用するだけで十分です。その後に変数名と、必要に応じて値を指定します。 実際には、 varキーワードを使用する必要さえありません。



 var name_1 = "Igor Ivanovich"; name_2 = "Renat Raphaelevich";
      
      





次にタイプについて説明します。 JSでは、整数と浮動小数点数に異なる型はありません。 それらはタイプ番号で結合されます。 文字列ブール値はJavaと同じです。 JSにはオブジェクト型があります。 Javaですべてのクラスのスーパークラスである場合、JSでそれは型の1つにすぎません。



 var a_number = 10; // number var b_number = 10.01; // number var a_string = "10"; // string var b_string = "10.1"; // string var tr = true; //boolean var person = {name: "Igor", secondName: "Ivanovich"}; //object
      
      





Java開発者を混同しないでください。 次に、異なるタイプのオブジェクト間で操作を実行して、何が起こるかを見てみましょう。



 10 +1 > 11 10 +"1" > "101" true && false > false true && 1 > 1 true && 0 > 0 true && "1" > "1" false && "1" > false false && 0 > false 0.1 + 0.7 > 0.7999999999999999
      
      





一部の結果は、Java開発者を少し混乱させる可能性があります。 たとえば、 ブール型を次のように使用する機能: true && 1と同時に、ある種の結果を取得します。 Javaでは、このような操作を実行することはできません。 boolean以外のでは&&演算子を使用できないことを示すエラーがコンパイラーによってスローされます。 ここで、JSとJavaの別の違いである===!== 演算子に注目しましょう。 これらは、JSなどの型指定の弱い言語に必要な比較操作です。 === -比較されるオブジェクトの値が等しく、タイプが同じである場合、trueを返します。 !==は、比較されるオブジェクトの値が等しくない場合、またはタイプが一致しない場合、それぞれtrueを返します。 いくつかの例を見てみましょう。



 10 == 10 > true 10 == "10" > true 10 === "10" > false 10 != "10" > false 10 !== "10" > true 10 !== 10 > false
      
      





機能



JSでは、Javaと同様に、関数は引数の有無にかかわらず値を返すことができます。 上記の例に示すように、JSコードで関数を呼び出すことができます。また、htmlマークアップ要素の特定のイベントに応答することで関数を呼び出すことができます。



 <!--          --> <input type="button" value="CLICK" onclick="foo();"> //  foo() function foo() { document.write("Calling foo"); }
      
      





ページ上のボタンをクリックすると、関数の呼び出しの結果として「Calling foo」が出力されます。 次に、Java開発者が注意を払う可能性のある奇妙な点について説明します。 関数foo()がそれ自体で関数bar()を呼び出す、上記の例に戻りましょう-これは内部関数としてのみ使用されます。 アイデアによると、プライベートにできると期待しています。 ただし、JSにはアクセスセレクタがありません。 関数宣言の前にプライベートフィールドをこの単語に単純に追加する方法はありません。 さらに進みましょう。 オブジェクトを作成しましょう。フィールドと1つのメソッドを持つクラスのインスタンスです。



 function getLocation() { if (this.person === "Igor" && this.age > 25) { document.write("Your name " + this.person + ", location = Vishnevaia 1"); } else { document.write("Your name " + this.person + ", location = rp Sokoloviy"); } } function Person(person, age) { this.person = person; this.age = age; this.getLocation = getLocation; } var igor = new Person("Igor", 26); igor.getLocation(); document.write("<br />"); getLocation();
      
      





Java開発者の目を通してこのコードを見ると、 Person関数はPersonクラスのオブジェクトのコンストラクターであり、クラスに含まれるフィールドとメソッドの定義であることがわかります。 getLocation()関数はPersonクラスの関数です。 内部では、インスタンスクラスthis.personおよびthis.ageのフィールドへのアクセスを使用します。 Personクラスの現在のインスタンスを使用するこの関数は、それだけで機能し、 getLocation()への最後の呼び出しは機能しないはずです。 ただし、JSでは、クラス、関数、クラスメソッドの概念がぼやけているため、これは正常です。 すべてが弱いタイピング。 このスクリプトを実行すると、ブラウザウィンドウに次の出力が表示されます。



 Your name Igor, location = Vishnevaia 1 Your name undefined, location = rp Sokoloviy
      
      





ただし、クラス内で関数を定義して次のようにコードを書き直すと、クラスインスタンスではその呼び出しを使用できません。



 function Person(person, age) { this.person = person; this.age = age; this.getLocation = function () { if (this.person === "Igor" && this.age > 25) { document.write("Your name " + this.person + ", location = Vishnevaia 1"); } else { document.write("Your name " + this.person + ", location = rp Sokoloviy"); } }; } var igor = new Person("Igor", 26); igor.getLocation(); document.write("<br />"); getLocation();
      
      





最後の呼び出しはエラーになります、なぜなら getLocation()関数は定義されていません。 JSにもアクセス修飾子はありませんが、中括弧で制御される関数と変数の範囲があります。 JavaScriptは素晴らしく、自分の足で撃つための膨大な数のオプションがあります。



配列



配列について話すとき、インデックスによってアクセスされる同じタイプの要素を格納するデータ構造を表します。 これはJavaにあります。 JSとその弱い型付けに関しては、実際の無秩序が作用します。 次の例では、4つの配列を作成します。 最初の要素には異なるタイプの要素があり、2番目の数値には、3番目のブール値には、4番目のブール値数値には、次のものがあります



 var mix = [3, "Igor Ivanovich", "Renat Raphaelevich", "Sergey Sergeevich", 1, 12.3, true]; var numbers = [1,2,3,4,5]; var booleans = [false, false, true]; var mix2 = [false, 1, 2]; document.write("Type elements in mix: "); for (element in mix) { document.write(typeof mix[element] + " "); } document.write("<br /> Type elements in numbers: "); for (element in numbers) { document.write(typeof numbers[element] + " "); } document.write("<br /> Type elements in booleans: "); for (element in booleans) { document.write(typeof booleans[element] + " "); } document.write("<br /> Type elements in mix2: "); for (element in mix2) { document.write(typeof mix2[element] + " "); } var sum = numbers[0] + numbers[1]; document.write("<br /> sum numbers = " + sum);
      
      





スクリプトを実行すると、各配列の各要素の型と、数値の配列の最初の2桁の合計が表示されます。



 Type elements in mix: number string string string number number boolean Type elements in numbers: number number number number number Type elements in booleans: boolean boolean boolean Type elements in mix2: boolean number number sum numbers = 12
      
      





おわりに



JavaScript言語に初めて触れると、Java開発者は上記のコメントと質問のすべてを経験するかもしれません。 私が初めてJSに会ったとき、私は最も楽しい感情を経験しませんでした。 むしろ、それは次のようなものでした:「なに…?」 多くの違いと誤解は、2つの言語の類型化の違いにあります。 JSに弱いタイピングが必要な理由はわかりません。



おそらくこれが行われた理由には利点があります。 答えがわかっている場合は、コメントを記入してください。



はい、TypeScriptがありますが、これは入力されたようですが、最終的には同じJSに変換されます。 個人的には、私は弱いタイピングのサポーターではありませんが、最近JavaScriptを試した同僚は、何らかの理由で喜んでいます。 おそらくこれは好みの問題です。 そして、弱いまたは強いタイピングよりも優れていると思いますか?



All Articles