web-dev-qa-db-ja.com

JavaScriptは型付けされていない言語ですか?

JavaScriptを「動的に型付けされていない」言語と呼ぶ人もいれば、「型付けされていない」と言う人もいます。本当にどちらですか?

91
Deniz Dogan

JavaScriptis型なし:


(ソース: no.Gd

ブレンダン・エイチでさえそう言います。 Twitterで、彼はこの質問にリンクしたスレッドに返信しました。

...アカデミックタイプは「型なし」を使用して「静的タイプなし」を意味します...

問題は、untypedのいくつかの異なる定義があることです。

上記の回答の1つで1つの定義について説明しました。ランタイムは値にタグを付けず、各値をビットとして扱います。 JavaScriptはタグ値を実行し、これらのタグに基づいて異なる動作をします。したがって、JavaScriptは明らかにこのカテゴリに適合しません。

他の定義はProgramming Language Theory(Brendanが言及している学問的なもの)からのものです。このドメインでは、untypedは単に すべてが単一のタイプに属する を意味します。

どうして?言語は、型が揃っていることを証明できる場合にのみプログラムを生成します(別名 カリーとハワードの対応 ;型は定理であり、プログラムは証明です)。これは、型付けされていない言語でのことを意味します。

  1. プログラムはalways生成されます
  2. したがって、タイプalwaysup up
  3. したがって、oneタイプのみが存在する必要があります

型付き言語とは対照的に:

  1. プログラムは生成されない可能性がある
  2. タイプは一致しない可能性があるため一致しない
  3. プログラムにはmultipleタイプを含めることができるため

PLTでは、untypedは単にdynamically typedandtypedは、静的に入力されたを意味します。 JavaScriptは、このカテゴリでは間違いなく型指定されていません。

こちらもご覧ください:

119
Brian McKenna

strong/weakcan該当する場合、コンパイラが入力を処理する方法に関連して考えてください。

  • Weakly typed は、該当する場合、コンパイラが正しい入力を強制しないことを意味します。暗黙的なコンパイラの挿入なしでは、実行時に命令がエラーになります。

    "12345" * 1 === 12345  // string * number => number
    

    Strongly typedはコンパイラがあり、stringからの明示的なキャストが必要であることを意味します整数

    (int) "12345" * 1 === 12345
    

    どちらの場合でも、コンパイラの機能の中には、それが正しいことであると判断できる場合、コンパイル時に暗黙的に命令を変更して変換を行うことができます。

    これまでのところ、JavaScriptは非厳密に型指定されたものとして分類できます。それは、弱い型付けか型付けされていないことを意味します。

dynamic/staticcan言語命令が型を操作する方法に関連して考えてください。

  • 動的に型指定された は、value 'sを意味します型は強制されますが、変数は単純に任意の型の値を表します。

    x = 12345;    // number
    x = "string"; // string
    x = { key: "value" }; // object
    y = 123 + x; // error or implicit conversion must take place.
    

    Statically typedは、variableタイプが強く強制され、値の型はそれほど強制されません。

    int x = 12345; // binds x to the type int
    x = "string";  // too late, x is an integer - error
    string y = 123; // error or implicit conversion must take place.
    

    これまでのところ、JavaScriptは非統計型として分類できます。また、まったく入力すると、動的に入力されたように見えます。したがって、タイピングの意味を確認する必要があります。

Typed は、言語がstringnumber]などの異なるタイプを区別することを意味しますbooleanobjectarraynullndefinedなどに。また、各操作は特定のタイプにバインドされます。したがって、integerstringで割ることはできません。

    2 / "blah"  // produces NaN

ntypedintegerstringで除算することを意味しますstringの最初の4バイトをintegerとして扱う場合。これは、型指定されていない操作がビットで直接行われ、観察する型がないためです。結果はまったく予想外のものになります。

    2 / "blah"  // will be treated as  2 / 1500275048

JavaScriptは型指定の定義に従って動作するため、そうする必要があります。したがって、動的に型付けされ、弱く型付けされなければなりません。

JavaScriptが型付けされていないと主張する人がいたら、それは単に学術的な理論のためであり、実際の応用のためではありません。

74
Gumbo

著者の要点として、JavaScriptは 動的に型付けされた としても分類されます。ウィキは、動的に型付けされた言語はコンパイラではなく実行時に型チェックされると述べていますが、弱型はコード内でその場で型を変更する機能を指します。そのため、動的に型付けされたものと弱く型付けされたものの両方です。

7
Darren Newton

多くのプログラマを混乱させている問題は、このような定義がどこかで標準化されていないことです。用語型なしプログラミング言語はあいまいです。それはデータ型を持たない言語またはラムダ計算である言語型なしバリアント

JavaScript/ECMAScriptにはtype systemがあり、そのすべての関数のドメインはすべての参照仕様タイプを受け入れます。つまり、実際にはJavaScriptには単一のデータ型があります。これは実装の問題であり、非常に高度なJavaScriptプログラマーにとってより重要です。平均的なJavaScriptプログラマーは、ECMAScriptで指定されたabstract言語データ型 のみを考慮します。

研究者や理論的なコンピューター科学者ではなく、日常のプログラマーの文脈では、ほとんどの人がラムダ計算を行っていないため、untypedという用語は誤名です。したがって、この用語は大衆を混乱させ、JavaScriptにはデータ型がまったくないことを宣言しているように見えますが、これは単に真実ではありません。 typeofを使用したことがある人なら誰でも、JavaScriptには独自の言語データ型があることを知っています。

var test = "this is text";
typeof(test);

利回り

「ひも」

ECMAScriptは、言語に対して次のタイプを定義します:undefinednullstringbooleannumberobject

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

JavaScriptのより正確な指定は、暗黙的に型付けされる、動的に型付けされる、または弱く/緩く型付けされる(またはそれらの組み合わせ)ことです。JavaScriptは type coercion を使用するため、 '変数のタイプを明示的に指定する必要はありません。フロートと整数などを区別する一部の言語とは異なり、1つのnumber型を使用してすべての数値を包含し、前述の型強制を使用するため、弱く型付けされます。[ECMAScript仕様のセクション9]、非常に特定のデータ型を持つ厳密に型指定された言語とは非常に対照的です(つまり、intまたはfloatを指定する必要があります)。

静的および動的に型付けされた言語の定義は標準化されていませんが、コンピューターが進化し始めたときのバイトのサイズも標準化されていませんでした。静的タイピングと動的タイピングは、ほとんどの場合、特定の言語機能の存在を指します。その1つは 実行時の型チェック 、または 動的型チェック と呼ばれるものです。 JavaScriptを使用したことがある場合は、ランタイムまで型をチェックすることを確実に待機することが既にわかっているため、コードの実行中にTypeError例外が発生します。 ここの例

トップ投票の答えは、紛らわしいと思います JavaScript関数のポリモーフィズムAssociation Fallacy である(Lambda Calculusの型付けされていないバリアントのように)文字通り何でも受け入れる関数です。

6
Alex W

JavaScriptではtypeof(your_variable)とは何かを尋ねることができ、タイプを比較できることを忘れないでください:5==="5"falseを返します。したがって、私はあなたがそれを型なしと呼ぶことができるとは思わない。

動的に、(推定される)弱く型付けされます。 Duckタイピングを使用して(andrewのリンクを参照)、クラスと継承の代わりにOOPしかし Prototyping を提供します。

1
instanceof me

型付けされていますが(「typeof someVar」と尋ねてその特定の型を学習できますが、非常に弱いです)。

与えられた:

  var a = "5";

aは文字列であると言うかもしれません。ただし、次に書く場合:

  var b = a + 10;

bは15に等しいintなので、aはintのように動作します。もちろん、次のように書くことができます。

  var c = a + "Hello World";

cは「5Hello World」に等しいため、aは再び文字列のように動作します。

0
James Curran