回答:
JavaScript は型なしです:
(ソース:no.gd)
ブレンダン・アイヒでさえそう言っています。Twitterで、彼はこの質問にリンクしているスレッドに返信しました:
したがって、問題はuntypedの定義がいくつか異なることです。
上記の回答の1つで1つの定義が説明されています。ランタイムは値にタグを付けず、各値をビットとして扱います。JavaScript はタグ値を実行し、それらのタグに基づいて異なる動作をします。したがって、JavaScriptは明らかにこのカテゴリに適合しません。
もう1つの定義は、プログラミング言語理論(ブレンダンが言及している学術的なもの)によるものです。このドメインでは、型なしとは、すべてが単一の型に属することを意味します。
どうして?言語は、型が揃っていることを証明できる場合にのみプログラムを生成します(別名、カリーハワード対応。型は定理であり、プログラムは証明です)。これは、型なし言語での意味です。
型付き言語とは対照的に:
つまり、PLTでは、型なしとは動的に型付けされることを意味し、型付きとは静的に型付けされることを意味します。JavaScriptはこのカテゴリーでは絶対に型付けされていません。
以下も参照してください。
1. 2. 3.
のために型指定されていない言語はJavaScriptを一致していません。タイプは1つだけではなく、約4〜5あります。それでは、JavaScriptが型なしであることをどのように示すのでしょうか。
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が型なしであると誰かが主張する場合、それは単に学術的な理論のためであり、実用的なアプリケーションのためではありません。
JavaScriptは弱く型付けされています。それは最も確かに「型なし」ではありませんが、その弱く型付けされた性質により、暗黙の変換に関して多くの柔軟性が可能になります。
JavaScriptも動的に型付けされることに注意してください。このタイピング方法では、「ダックタイピング」と呼ばれるものが可能になります。
比較のために、JavaScriptは強く型付けされておらず、静的に型付けされていません。 何かが正しくないことを理解することは、それが何であるかをよりよく理解するのに役立ちます。
多くのプログラマーを混乱させるここでの問題は、このような定義がどこかで標準化されていないことです。型なしプログラミング言語という用語はあいまいです。それは、データ型を持たない言語、またはラムダ計算の型なしバリアントである言語を指しますか?
JavaScript / ECMAScriptには型システムがあり、そのすべての関数のドメインは任意の参照仕様型を受け入れます。つまり、JavaScriptは実際には単一のデータ型を持っているということです。これは、非常に高度なJavaScriptプログラマにとってより重要な実装の問題です。平均的なJavaScriptプログラマーは、ECMAScriptで指定された抽象 言語データ型のみを考慮します。
ほとんどの人はラムダ計算を行っていないため、研究者や理論的なコンピュータ科学者ではなく、日常のプログラマの文脈では、型なしという用語は誤称です。したがって、この用語は大衆を混乱させ、JavaScriptにはデータ型がまったくないことを宣言しているようです。これまでに使用したtypeof
ことがある人なら誰でも、JavaScriptには独自の言語データ型があることを知っています。
var test = "this is text";
typeof(test);
収量
"ストリング"
ECMAScriptの言語のための次のタイプを定義していますundefined
、null
、string
、boolean
、number
、object
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です。
JavaScriptを使用するとtypeof(your_variable)
、とは何かを確認し、タイプを比較でき5==="5"
ますfalse
。したがって、型なしと呼ぶことはできないと思います。
動的に(そして推定されて)弱く型付けされます。Duckタイピング(andrewのリンクを参照)を使用し、クラスや継承の代わりにプロトタイピングを通じてOOPを提供することを知りたい場合があります。
String a = "blah";
か、var a:String = 'blah';
AT ALL(つまり、変数を入力しました)。それが型付けされていない理由です。
それは型付けされていますが( "typeof someVar"に尋ねてその特定の型を学ぶことができますが、それは非常に弱いです)。
与えられた:
var a = "5";
あなたはaが文字列であると言うかもしれません。ただし、次のように記述した場合:
var b = a + 10;
bは15に等しいintなので、intのように機能します。もちろん、次のように書くこともできます。
var c = a + "Hello World";
そしてcは「5Hello World」に等しくなるので、aは再び文字列のように機能します。