JavaScriptは型なし言語ですか?


104

JavaScriptを「動的に、弱く型付けされた」言語と呼ぶ人もいますが、「型付けされていない」とさえ言う人もいます。本当にどっち?

回答:


133

JavaScript 型なしです:


(ソース:no.gd

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

...学術タイプは「型なし」を使用して「静的タイプなし」を意味します...

したがって、問題はuntypedの定義がいくつか異なることです

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

もう1つの定義は、プログラミング言語理論(ブレンダンが言及している学術的なもの)によるものです。このドメインでは、型なしとは、すべてが単一の型に属することを意味します

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

  1. プログラムは常に生成されます
  2. したがって、タイプは常に一致します
  3. したがって、タイプは1つだけでなければなりません。

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

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

つまり、PLTでは、型なしとは動的に型付けされることを意味し、型付きとは静的に型付けされることを意味します。JavaScriptはこのカテゴリーでは絶対に型付けされていません。

以下も参照してください。


6
そしてもちろん、「静的型なし」は「型宣言なし」と同じではありません。
Andreas Rossberg

+1。おそらく、これも回答にリンクする必要があります。この「弱く型付けされた」bsは広すぎます。
missingfaktor

2
プログラミング言語理論は正しいです。巨大なスクリーンショットは正しくありません。
Alex W

2
この回答がHarperのブログ投稿を参照しているのを見てうれしかったですが、PLTコミュニティが「untyped」を削除して「unityped」を優先した方がいいでしょう。「型なし」の定義は「単なるビット」を意味し、実際には理にかなっています。「型なし」を使用して、正式な仕様に「タイプ」という単語を使用し、7つのタイプ(未定義、Null、数値、文字列、ブール、シンボル、およびオブジェクト)があることを示す言語は、非常に混乱します。ほとんどの人は、このタイプの概念をPLTの定義と区別したくありません。
Ray Toal 2015年

4
あなた1. 2. 3.のために型指定されていない言語はJavaScriptを一致していません。タイプは1つだけではなく、約4〜5あります。それでは、JavaScriptが型なしであることをどのように示すのでしょうか。
Don Cheadle 2015

82

strong / weak 、コンパイラーが適用可能な場合にタイピングを処理する方法に関連して考えられます。

  • 弱い型付けとは、該当する場合、コンパイラーが正しい型付けを強制しないことを意味します。暗黙的なコンパイラ挿入がなければ、命令は実行時にエラーになります。

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

    強く型付けされているということは、コンパイラが存在し、文字列から整数への明示的なキャストが必要であることを意味します。

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

    どちらの場合でも、コンパイラーの機能の中には、コンパイル時に命令を暗黙的に変更して変換を実行できるものがあります。

    これまでのところ、JavaScriptはNot-Strongly-Typedとして分類できます。それはどちらかが弱く型付けされているか型付けされていないことを意味します。

動的/静的 、言語命令が型を操作する方法に関連して考えることできます。

  • 動的型付けとは、の型が強制されることを意味しますが、変数は単に任意の型の任意の値を表します。

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

    静的型付けとは、変数の型が強く強制され、値の型がそれほど強制されないことを意味します

    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は「統計型指定なし」に分類できます。また、入力した場合、動的に入力されたように見えます。したがって、タイピングの意味を確認する必要があります。

型付きとは、言語が string number boolean object array null undefinedなどの異なる型を区別することを意味します。また、各操作は特定のタイプにバインドされています。したがって、整数文字列で除算することはできません。

    2 / "blah"  // produces NaN

型なし手段は、分割の操作整数をすることによって文字列が最初の4バイトの治療をもたらすであろう文字列として整数。これは、型なし操作がビットで直接行われるため、監視する型がないためです。結果は予想外のものになります:

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

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

JavaScriptが型なしであると誰かが主張する場合、それは単に学術的な理論のためであり、実用的なアプリケーションのためではありません。


1
しかし、私は最後の声明に矛盾があると思います。JavaScriptでは、整数または文字列の任意の値について、整数文字列除算の結果は明確に定義されています。それはあまり役に立ちません!
Deniz Dogan

より適切な定義/説明がある場合は、自由に編集してください。それが私がコミュニティウィキを作った理由です。
ガンボ

@skurpur:動的タイピングと弱タイピングの意味を完全に入れ替えました-修正しました。
Rene Saarsoo、2009年

ああ、すみません、あなたも私が編集していたので編集しました。
Rene Saarsoo、2009年

3
-1。これを読む必要があります。
missingfaktor

48

JavaScriptは弱く型付けされています。それは最も確かに「型なし」ではありませんが、その弱く型付けされた性質により、暗黙の変換に関して多くの柔軟性が可能になります。

JavaScriptも動的に型付けされることに注意してください。このタイピング方法では、「ダックタイピング」と呼ばれるものが可能になります

比較のために、JavaScriptは強く型付けされておらず、静的に型付けされていません 何か正しくないことを理解すること、それが何であるかをよりよく理解するのに役立ちます。


2
-1。これを読む必要があります。
missingfaktor

3
この回答は、上位投票の回答よりもはるかに優れており、はるかに正確です。
Alex W

3
@JimboJonny:不正解です。アセンブリ開発者がいる場合を除いて、すべての言語が入力されていると述べるのは不正確ではありません。型なしとは、ビット操作のみが直接操作されることを意味します。ただし、JavascriptにはtoString()メソッドとparseInt()メソッドがあることに注意してください。それよりも多くのタイプを取得しないでください。
Suamere

2
@Suamere- O'Reillyの「Javascript:The Definitive Guide」からの引用は次のとおりです。「JavaScriptとJavaやCのような言語の重要な違いは、JavaScriptが型指定されていないことです。これは、部分的には、JavaScript変数が任意のデータ型の値を保持できることを意味します。JavaまたはC変数は、それが宣言されている特定の1つのデータ型のみを保持できます。」
神保ジョニー2015

3
したがって、学部の人々が「動的に型付けされた」を意味するために「型付けされていない」という単語を意図的に使用していると一部の男が主張することをBSに購入した場合。そう、そうです。JavaScriptはすべての証明によって型付けされていません。ただし、「型なし」が誤って「動的に型付けされた」言語を表すために誤って使用されていることがわかっている場合は、Dang言語を「動的に型付けされた」と呼ぶだけです。tinyurl.com/czhcv54
Suamere

8

著者の要点として、JavaScriptも動的型付けに分類さます。Wikiによると、動的に型付けされた言語はコンパイラではなく実行時に型チェックされますが、弱く型付けされたとは、コード内でオンザフライで型を変更する機能を指します。つまり、動的型付けと弱い型付けの両方です。


6

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

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

ほとんどの人はラムダ計算を行っていないため、研究者や理論的なコンピュータ科学者ではなく、日常のプログラマの文脈では、型なしという用語は誤称です。したがって、この用語は大衆を混乱させ、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が型強制を使用する場合があるため、明示的に指定する必要がないため、型が暗黙的になります。変数のタイプ。float型とinteger型などを区別する一部の言語とは異なり、1つのnumber型を使用してすべての数値を包含し、前述の型強制を使用するため(ECMAScript仕様のセクション9)、非常に特定のデータ型を持つ厳密に型指定された言語(つまり、intまたはを指定する必要がありますfloat)。

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

トップ投票の答えは、JavaScript関数のポリモーフィズムを、文字通り何でも受け入れる関数(Lambda Calculusの型なしバリアントなど)と混同していると思います。これはAssociation Fallacyです。


それは誤った名称ではないですが、コンテキスト事項は、参照stackoverflow.com/questions/9154388/...を
アンドレアスRossberg

@AndreasRossbergそれは絶対にある誤称。あなたが言及するのは、恥知らずな自己宣伝リンクで、型システムです。この用語が誤称である理由は、あいまいであるためです。ほとんどのプログラマーは、型なし言語について聞いたときに、データ型型システムではないと考えていますKonrad Rudophのコメントは、この点を明確に後押ししていると思います。
Alex W

ここで繰り返すのではなく、以前の答えを参照することが「恥知らず」だと思う理由がわかりません。また、私は文脈が重要であることを明確に述べました。K.ルドルフの不満とは対照的に、文学には「型システム」の完全に一貫して広く受け入れられている定義があり、私はそれを引用しました。もちろん、あなたの文脈でそれらを混乱させることは自由ですが、それはそれらを「誤称」にすることはありません。
Andreas Rossberg 2014年

@AndreasRossbergコンテキストは、ここでは非常に重要です。一番上の投票の答えは「型なし=型宣言なし」と言っていますが、これは明らかに正しくありません。私が言っているのは、この文脈では、それは誤称です。ここでラムダ計算について言及した人はいません。そうすることは、この単純なケースではやや大げさです。
Alex W

1

JavaScriptを使用するとtypeof(your_variable)、とは何かを確認し、タイプを比較でき5==="5"ますfalse。したがって、型なしと呼ぶことはできないと思います。

動的に(そして推定されて)弱く型付けされます。Duckタイピング(andrewのリンクを参照)を使用し、クラスや継承の代わりにプロトタイピングを通じてOOPを提供することを知りたい場合があります。


変数の入力は、値のキャストとは関係ありません。変数の型の宣言に関係しています。Javascriptにはこのための構成要素がまったくありません。そのため、ほとんどのJavaScriptは概念を理解していません。また、変数型を変数型の比較またはキャストで行うものと誤解している理由はほとんどありません。JSでは、宣言することができないString a = "blah";か、var a:String = 'blah';AT ALL(つまり、変数を入力しました)。それが型付けされていない理由です。
神保ジョニー

0

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

与えられた:

  var a = "5";

あなたはaが文字列であると言うかもしれません。ただし、次のように記述した場合:

  var b = a + 10;

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

  var c = a + "Hello World";

そしてcは「5Hello World」に等しくなるので、aは再び文字列のように機能します。


1)値をキャストする!=変数を入力する2)弱くはなく、存在しない JavaScriptで変数を入力することはできません。
神保ジョニー

なぜこの回答が2票の反対票を投じたのか興味があります。弱い型付けで私が見つけた定義はこれを正確に言います:値の型はそれがどのように使われるかに基づいて決定されます。
aioobe 2018年

これは正確ですか?私はb等しくなり510ます:ideone.com/BRcSW7
aioobe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.