5

何故、ここ数年前に自分自身に質問したことがなかったのかわかりませんが、突然、自分自身やグーグルで答えを見つけることができませんでした。

Javascriptには変数の型がないことが知られています。本当にいいことです。しかし、どういうわけかそれはタイプを決定し、それで動作する必要があります。

var a = 1;
var b = 2.0;
var c = 'c';
var d = "Hello World!";

つまり、整数、倍精度/浮動小数点、文字、文字列(char *として破棄される可能性があります)があります。

JSはランタイムインタープリターで動作することは知っていますが、ロジックと「タイプ」は何らかの方法で実装する必要があると考えています。

では、Javascriptインタープリターはどのように変数を認識して内部的に処理するのでしょうか。私の想像では、C ++を作成すると仮定すると、一種のテンプレートとコンテナー、および演算子をオーバーロードして実際に何であるかを確認しようとするロジックのビットを考えます。しかし、それは最後まで考えられていません。

あなたの知識を私と共有してください:-)

4

4 に答える 4

2

JavaScriptは、値の割り当てに基づいて変数タイプを設定します。たとえば、JavaScriptが次のコードを検出myVariableすると、タイプ番号である必要があることがわかります。

var myVariable = 10;

同様に、JavaScriptは次の例で、変数の型が文字列であることを検出します。

var myVariable = "Hello World!";

JavaScriptは、他の多くのプログラミング言語よりもはるかに柔軟性があります。Javaなどの言語では、変数は作成時に特定の型であると宣言する必要があり、一度作成すると型を変更できません。これは強い型付けと呼ばれます。一方、JavaScriptでは、別のタイプの値を割り当てるだけで、いつでも変数のタイプを変更できます(ルーズタイピングとして知られています)。

次の例は、JavaScriptでの変数の完全に有効な使用法です。作成時には、変数は明らかにタイプ番号です。後でこの変数に文字列を割り当てると、タイプが数値から文字列に変更されます。

var myVariable = 10;
myVariable = "This is now a string type variable";

変数のデータ型は、変数が現在保持しているデータ型のJavaScriptスクリプトエンジンによる解釈です。文字列変数は文字列を保持します。数値変数は数値を保持し、以下同様に続きます。ただし、他の多くの言語とは異なり、JavaScriptでは、同じ変数が異なるタイプのデータをすべて同じアプリケーション内に保持できます。これは、ルーズタイピングとダイナミックタイピングという用語で知られている概念です。どちらも、JavaScript変数がコンテキストに応じて異なる時間に異なるデータ型を保持できることを意味します。

ここに完全な記事:http ://www.techotopia.com/index.php/JavaScript_Variable_Types

あなたを助けるかもしれない別の記事:http://oreilly.com/javascript/excerpts/learning-javascript/javascript-datatypes-variables.html

便利なリンク:

ECMAScript言語仕様

ECMAScriptBNF文法

JAVAScriptBNF文法

于 2012-09-11T07:26:11.620 に答える
1

ES5仕様で私が見つけることができる唯一の有用な行はこれです:

この仕様では、「Type(x)」という表記は「xのタイプ」の省略形として使用されます。「type」は、この節で定義されているECMAScript言語および仕様タイプを指します。

ランタイムが何らかの値のタイプを知る必要がある操作を実行する必要がある場合、一致するものが見つかるまで、各タイプの仕様で定義されている文法に対してその値をチェックすると思います。

たとえば、ブールリテラルの文法は次のとおりです。

BooleanLiteral ::

  true 
  false

値が正確trueまたは正確である場合false(たとえば、引用符なし)、その値はブール型です。

于 2012-09-11T07:25:45.803 に答える
0

JavaScript自体には型があり、内部的には、各割り当ては適切な型を受け取ります。あなたの例var foo = 2.0;では、タイプはになりますfloatJSは大まかに型付けされている(!==型なし)ので、プログラマーは(最初は)それほど心配する必要はありません。
つまり、数値文字列を浮動小数点数と比較する場合、エンジンは文字列を数値に強制して、比較を実行できるようにします。

ただし、緩い型の言語と強い型の言語の主な違いは、型の強制ではありません。C(++)では、必要な型にキャストするのが非常に一般的であり、場合によっては、値が自動的に正しい型に変換されます(2/2.0 == 2.0/2.0 == 1.0==> intは暗黙的にfloatに変換されます)。緩く型付けされた言語と強い型付けされた言語の主な違いは、異なる型で変数を宣言することです。

int i = 0;//ok
//Later:
i = 'a';//<-- cannot assign char to int

一方、JSでは次のことができます。

var i = 1;//int
i = 1.123;//float
i = 'c';//char, or even strings
i = new Date();//objects

しかし、、、、、、 ...のような関数/キーワードが示唆するようtypeofに:タイプがありますが、それらはほんの少し柔軟性があります。また、変数は単一の型に制限されていません。instanceofparseFloatparseInttoString

于 2012-09-11T07:32:54.943 に答える
0

実装を想像する簡単な方法の1つは、すべての値がオブジェクトに保持され、すべての変数がポインターであるということです... C ++では:

struct Value
{
    int type;
    Value(int type) : type(type) { }
    virtual ~Value() { }

    virtual std::string toString() = 0;
};

struct String : Value
{
    std::string x;
    String(const std::string& x) : Value(STRING_TYPE), x(x) { }
    virtual std::string toString()
    {
        return x;
    }
};

struct Number : Value
{
    double x;
    Number(double x) : Value(NUMBER_TYPE), x(x) { }
    ...
};

struct Object : Value
{
    // NOTE: A javascript object is stored as a map from property
    //       names to Value*, not Value. The key is a string but
    //       the value can be anything
    std::map<std::string, Value *> x;
    Object() : Value(OBJECT_TYPE), x(x) { }
    ...
};

たとえば、操作を実行a+bする必要があるときはいつでも(たとえば)、変数が指すオブジェクトのタイプをチェックして、何をするかを決定する必要があります。

これは非常に単純な説明であることに注意してください...今日のjavascriptはこれよりもはるかに洗練され、最適化されていますが、大まかな全体像を把握できるはずです。

于 2012-09-11T07:40:34.910 に答える