プログラミング言語の学習には2つの側面しかありません。1つは構文であり、もう1つはデータ型です。 C様言語の構文は、機能、算術操作など、およびオブジェクト指向の言語がオブジェクトに追加された場合にほかなりません。
構文は、言語デザイナーが事前に作成したルールのセットにすぎません。異なる言語の文法は異なりますが、それらにはすべていくつかの共通点があります。 1つまたは2つのプログラミング言語に精通している人にとっては、文法は他のプログラミング言語を学習するときに問題ではないことがよくあります(もちろん、Cのような言語を学習している場合、LISPに初めて参加するのに間違いなく時間がかかります)。学習の焦点は、多くの場合、データ型と関連操作にあり、「データ構造 +アルゴリズム=プログラム」という古いことわざはありません!第二に、一部の言語自体の構文には設計上の問題があります(JavaScriptはさらにそうです)ので、これらのポイントを掘り下げる必要はありません。もちろん、あなたがオタクであると主張するなら、あなたはそれで遊ぶことができます。
この記事では、JavaScriptのデータ型の詳細な紹介について説明します。
弱いタイプと強いタイプ
JavaScriptのデザイン哲学を考えると、JavaScriptは弱い言語として設計されています。
これについて言えば、弱いタイプと強いタイプの違いについて話すことは避けられません。
一部の人々は、2つの違いは「変数を宣言するときにそのタイプを示す必要がありますが、弱く入力されたものはそれを使用しない」と誤って考えている人もいます。実際、この見解は間違っています。たとえば、次のJavaコードスニペット:
コードコピーは次のとおりです。
文字列s = "hello";
int l = s.getBytes()。length;
コンパイラは、.lengthが法的表現であることをどのように知っていますか?これは、コンパイラがSのデータ型が文字列であることを知っているためです。文字列のgetBytesメソッドが呼び出されると、返品値のデータ型はbyte []であるため、.lengthは法的表現です。
2つの本当の違いは次のとおりです。
強くタイプされた言語では、各式のタイプはコンパイル時間で決定でき、そのタイプに適用される操作のみが許可されます。
弱いタイプの言語により、任意の操作を任意のタイプに課すことができますが、この操作は実行時にエラーを報告する場合があります。
データ型
ECMAScript 5.1の仕様によると、JavaScriptには6つのデータ型があります。つまり、未定義、null、boolean、number、string、およびobjectがあります。最初の5つは基本タイプに属し、最後はオブジェクトタイプに属します。
基本的なデータ型
未定義のタイプには1つの値しかありません。これは未定義であり、これはすべてのデータ型に適用される「ヌル値」を意味します。
nullタイプには1つの値のみがあります。これはnullです。これは「オブジェクトなし」を意味し、オブジェクトタイプにのみ適用されます。
ブールタイプには、真とfalseの2つの値があります
タイプ数の値は、Javaのダブルと同様に、IEEE 754標準に従う64ビットの浮動小数点数のセットです。整数データ構造はありません。さらに、3つの特別な値があります:Nan、Infinity、-infinity
型文字列の値は、有限のユニコード文字のコレクションです。 「または」で囲まれている必要があります。
ヌルと未定義
NULLと未定義の両方が、厳密に区別されている場合、「非価値」の概念を表しています。
- nullとは空です
- 未定義とは、それが存在しないことを意味します。この値は、初期化のないすべての変数、関数にパラメーターが欠落しており、明示的な返品値はありません。
他の言語では、ヌル値を表すために使用されるヌルは1つだけです。 JavaScriptに未定義があるのはなぜですか?これは歴史的な理由によって引き起こされます:
JavaScriptはJava構文を採用し、タイプを基本タイプとオブジェクトタイプに分割します。 Javaでは、Nullは空のオブジェクトを表すために使用され、JavaScriptはそれらを当たり前のように継承します。 C言語では、nullは数に変換されると0です。JavaScriptも同じ方法を採用しています。
コードコピーは次のとおりです。
>番号(null)
0
> 5 + null
5
JavaScript 1.0では、まだ例外はありません。いくつかの例外(初期化された変数はなく、関数を呼び出すときにパラメーターが欠落しているなど)は、特別な値としてマークする必要があります。 Nullは良い選択ですが、Brendan Eichは次の2つのことを避けたいと考えています。
- この特別な値には、オブジェクト固有であるため、参照属性を持たないでください
- プログラムのエラーを検出するのは簡単ではないため、この特別な値を0に変換しないでください
これら2つの理由により、ブレンダンアイヒは未定義を選択しました。これはナンに強制される可能性があります。
コードコピーは次のとおりです。
>番号(未定義)
ナン
> 5 +未定義
ナン
JSONオブジェクトを扱う場合、結果は非常に異なります。
コードコピーは次のとおりです。
> json.parse(null)
ヌル
> json.parse(未定義)
// firfox syntaxerror:json.parse:JSONデータの1行目の列1の予期しない文字
// Chrome syntaxerror:予期しないトークンu
> json.stringify(null)
「ヌル」
> json.Stringify(未定義)
未定義
オブジェクトタイプ
スクリプト言語として、JavaScript自体には非常に合理化された機能があり、多くの機能(ファイルの読み取りと書き込み、ネットワーキングなど)がホスト環境によって提供されます。ホスト環境とJavaScript言語の間の橋はオブジェクトです。ホスト環境は、JavaScriptの構文に準拠する一連のオブジェクトを提供することにより、さまざまな機能を提供します。
JavaScriptオブジェクト指向プログラミングのこの記事では(プロトタイプが何であるかわからない場合は、この記事を読むことを強くお勧めします)、JavaのHashmapのように、JavaScriptの一連のキー値ペアであることを繰り返し強調しました。ただし、JavaScriptのオブジェクトのプロパティには、ハッシュマップでは使用できない記述子(プロパティ記述子)を持つことができます。
属性記述子
属性記述子は、次の2つのカテゴリに分割されます。
データ記述子(データ記述子)には、一連のブール値が含まれており、属性が変更と削除を可能にするかどうかを示します。
get and set関数を含むアクセサー記述子。
両方の記述子はオブジェクトであり、どちらも次の2つのブール特性を持っています。
構成可能は、記述子が変更と削除を可能にするかどうかを指定するために使用されます。デフォルトはfalseです。
列挙可能は、オブジェクトを通過しているときにプロパティにアクセスするかどうかを指定するために使用されます(for ... in loopまたはobject.keysメソッドを使用)。デフォルトはfalseです。
上記の2つの一般的な属性に加えて、データ記述子には次の2つの属性があります。
- 値はこのプロパティの値を指定するために使用され、デフォルトは未定義です
- 手数料は、プロパティの価値がプロパティの価値の変更を許可するかどうかを指定するために使用されます。デフォルトはfalseです
アクセス記述子には2つのプロパティがあります。
-GETは、プロパティにアクセスする際にアクセサー(ゲッター、本質的に関数)を指定するために使用され、アクセサーズの返品値はプロパティの値です。デフォルトは未定義です
- セットは、このプロパティにアクセスするときに評価者(セッター、本質的に関数)を指定するために使用されます。評価者はパラメーターを受け入れます。デフォルトは未定義です
object.definePropertyを使用して、オブジェクトのプロパティ記述子を設定できます。例えば:
コードコピーは次のとおりです。
// __proto__を使用する
object.defineProperty(obj、 'key'、{
__Proto__:null、//継承されたプロパティなし
値:「静的」//列挙できない
//構成できません
//書き込みはありません
//デフォルトとして
});
上記の例から、記述子には継承の特性があることがわかります。記述子オブジェクトの__Proto__をNULLに明示的に設定します。これにより、Object.prototypeから対応する属性が継承されません。もちろん、記述子のすべてのプロパティを明示的に設定することもできます。
コードコピーは次のとおりです。
//明示的であること
object.defineProperty(obj、 'key'、{
列挙可能:FALSE、
設定可能:false、
手紙:false、
値:「静的」
});
この効果は、最初のコードと同じです。
アクセス記述子の別の例を次に示します。
コードコピーは次のとおりです。
//アクセサのプロパティ記述子を使用してDefinePropertyを備えたオブジェクトプロパティの例
var bvalue = 38;
object.defineProperty(obj、 'key'、{
get:function(){return bvalue; }、
set:function(newValue){bvalue = newValue; }、
列挙可能:本当、
設定可能:true
});
アクセス記述子とデータ記述子を混乱させることはできないことに注意する必要があります。以下を書くのは間違っています。
コードコピーは次のとおりです。
//両方を混ぜようとすることはできません:
object.defineProperty(obj、 'comples'、{
値:0x9f91102、
get:function(){return 0xdeadbeef; }
});
// typeRRORをスロー:プロパティ記述子は値を指定してはなりません
//またはゲッターまたはセッターが指定されているときに書くことができる
typeof
実行時に変数のタイプを知りたい場合は、Typeofオペレーターを使用できます。 typeofの返品値は次のとおりです。
注意する必要があることの1つは、typeof null == "object"です。 ECMAScript 5.1標準によれば、ヌルタイプは基本タイプでなければなりません。なぜここでオブジェクトが返されるのですか?その理由はこれです:
JavaScript 1.0では、JavaScriptの値は、タイプタグや実際の値などの構造によって表されます。オブジェクトのタイプフラグは0で、nullはC言語でnullポインター(0x00)を表します。したがって、nullの型フラグは0です。
上記は、この記事のコンテンツ全体です。必要に応じて参照してください。