ホームページ  >  記事  >  ウェブフロントエンド  >  jsデータ型の詳しい説明

jsデータ型の詳しい説明

小云云
小云云オリジナル
2018-03-22 17:22:511191ブラウズ

ES5 の単純なデータ型 (基本データ型とも呼ばれます): 未定義、Null、ブール、数値、文字列。複雑なデータ型もあります。オブジェクトは、基本的に順序付けされていない名前と値のペアで構成されます。 ECMAScript はカスタム タイプを作成するメカニズムをサポートしておらず、すべての値は最終的に上記の 6 つのデータ タイプのいずれかになります。

1. typeof 演算子 - 指定された変数のデータ型を検出します。
値に typeof 演算子を使用すると、次のいずれかの文字列が返されます。
"unknown" - 値が未定義の場合
"boolean" - 値が未定義の場合ブール値です。
"string" - 値が文字列の場合;
"object" - 値がオブジェクトまたは null の場合。値は関数です。
typeof 演算子の使用例をいくつか示します。
var message = "some string";
alert(typeof message) // "string"
alert( typeof 95); // "number"
これらの例は、typeof 演算子のオペランドが変数または数値リテラルであることを示しています。 typeof は関数ではなく演算子であるため、例の中のかっこは使用できますが、必須ではないことに注意してください。


typeof 演算子は、混乱を招くものの、技術的には正しい値を返す場合があります。たとえば、typeof null を呼び出すと、特別な値 null は空のオブジェクト参照と見なされるため、「object」が返されます。 Safari 5 以前と Chrome 7 以前は、正規表現で typeof 演算子を呼び出すと「function」を返しますが、他のブラウザはこの場合「object」を返します。技術的に言えば、ECMAScript の関数はデータ型ではなくオブジェクトです。ただし、関数にはいくつかの特別なプロパティがあるため、typeof 演算子を通じて関数を他のオブジェクトから区別する必要があります。

2.1 未定義型

未定義型は値を 1 つだけ持ち、それが特別な未定義です。この値は、null オブジェクト ポインターと初期化されていない変数を正式に区別するために導入されました。まだ宣言されていない変数については、typeof 演算子を使用してそのデータ型を検出するという 1 つの操作のみを実行できます。次の例を見てください:

var message; // この変数は宣言された後、デフォルトでは未定義の値になります
alert(typeof message); // "unknown"

alert(typeof age); unknown"

結果は、初期化されていない宣言されていない変数に対して typeof 演算子を実行すると、未定義の値を返します。 2 つの変数は技術的な観点からは本質的に異なりますが、実際にはどちらの変数に対しても実際の操作を実行することは不可能だからです。

2.2 null 型

null 型は値を 1 つだけ持つデータ型であり、この特別な値は null です。論理的な観点から見ると、null 値は null オブジェクト ポインターを表します。そのため、typeof 演算子を使用して null 値を検出すると「object」が返されます。
定義された変数が将来オブジェクトを保持するために使用される場合は、変数を他の値ではなく null に初期化することをお勧めします。

実際、未定義値は null 値から派生するため、ECMA-262 では等価性テストで true を返すことが規定されています:

alert(null == unknown); //true
ここでは、null と unknown の間の等価演算子 ( ==) は常に true を返しますが、この演算子は比較のためにオペランドを変換することに注意してください。


nullとunknownにはこのような関係がありますが、用途は全く異なります。いかなる状況でも、変数の値を明示的に未定義に設定する必要はありませんが、同じ規則は null には適用されません。言い換えれば、オブジェクトを保持することを意図した変数が実際にはオブジェクトを保持しない限り、その変数には明示的に null 値を保持させる必要があります。そうすることで、null オブジェクト ポインターとしての null の規則が反映されるだけでなく、null と未定義をさらに区別するのにも役立ちます。

2.3 ブール型

ブール型には、true と false の 2 つのリテラル値のみがあり、大文字と小文字が区別されます。

false に変換される値: false 、 "" (空の文字列)、0 および NaN 、 null 、未定義

2.4 数値型

数値型: 整数および浮動小数点値。
浮動小数点値の保存には整数値の保存の 2 倍のメモリ領域が必要なため、ECMAScript は機会を失うことなく浮動小数点値を整数値に変換します。明らかに、小数点の後に数字が続かない場合は、値を整数値として保存できます。

var floatNum1 = 1.; // 小数点以下の桁なし - 1 に解決されます

var floatNum2 = 10.0; // 整数 - 10 に解決されます
浮動小数点値の最高精度は小数点以下 17 桁ですが、算術計算 その精度は整数よりもはるかに低くなります。


浮動小数点数値計算で丸め誤差が発生するという問題については、明確にしておく必要があります。これは、IEEE754 数値に基づく浮動小数点計算を使用する場合によくある問題であり、他の言語に固有のものではありません。同じ数値形式を使用する場合にもこの問題があります。

isFinite() 関数は、値が有限かどうか (最小値と最大値の間にあるかどうか) を判断できます。この関数は、引数が最小値と最大値の間にある場合に true を返します。

NaN、つまり Not a Number (数値ではありません) は特別な値です。この値は、値を返すはずのオペランドが値を返さないことを示すために使用されます (エラーがスローされないようにします)。 )。たとえば、ECMAScript では、数値を 0 で割ると NaN が返されるため、他のコードの実行には影響しません。 NaN 自体には 2 つの珍しい特徴があります。まず、NaN を伴う演算 (NaN/10 など) は NaN を返すため、複数ステップの計算で問題が発生する可能性があります。第 2 に、NaN は、NaN 自体を含め、どの値とも等しくありません。たとえば、次のコードは false を返します:alert(NaN == NaN); //false
isNaN() 値を受け取った後、その値を数値に変換しようとします。数値ではない一部の値は、文字列「10」やブール値など、数値に直接変換されます。数値に変換できない値があると、この関数は true を返します。次の例を参照してください:
alert(isNaN(NaN)); //true alter(isNaN("10")); //false (値 10 に変換可能)
alert(isNaN("blue")) ; //true (数値に変換できません)alert(isNaN(true)); //false (数値 1 に変換できます)

isNaN() はオブジェクトにも適用されます。オブジェクトに基づいて isNaN() 関数が呼び出される場合、最初にオブジェクトの valueOf() メソッドが呼び出され、次にメソッドによって返された値が数値に変換できるかどうかが判断されます。そうでない場合は、この戻り値に基づいて toString() メソッドを呼び出し、戻り値をテストします。このプロセスは、ECMAScript の組み込み関数と演算子の一般的な実行フローでもあります。

数値変換: 数値以外の値を数値に変換できる関数は 3 つあります: Number()、parseInt()、parseFloat()。
変換関数 Number() は任意のデータ型に使用できますが、他の 2 つの関数は文字列を数値に変換するために特に使用されます。これら 3 つの関数は、同じ入力に対して異なる結果を返します。
Number() 関数の変換規則は次のとおりです。
 ブール値の場合、true は 1、false は 0 にそれぞれ変換されます。
 数値の場合は、単に渡されて返されます。
 null値の場合は0を返します。
 未定義の場合はNaNを返します。
 文字列の場合は、次の規則に従います。
 文字列に数字のみが含まれている場合 (正または負の符号が前に付いているものを含む)、10 進数値に変換されます。つまり、「1」は次のようになります。 1、「123」は 123 になり、「011」は 11 になります (注: 先頭のゼロは無視されます)。
 文字列に「1.1」などの有効な浮動小数点形式が含まれている場合は、対応する浮動小数点値 (繰り返しますが、先頭のゼロは無視されます);
 文字列に「0xf」などの有効な 16 進形式が含まれている場合、それを同じサイズの 10 進整数値に変換します。
 If 文字列が空の場合 (文字が含まれていない場合は 0 に変換されます。
 文字列に上記形式以外の文字が含まれている場合は、NaN に変換されます。
 オブジェクトの場合は、オブジェクトの valueOf() メソッドを呼び出し、戻り値を前述の規則に従って変換します。変換の結果が NaN の場合は、オブジェクトの toString() メソッドを呼び出して、返された文字列値を前の規則に従って再度変換します。
以下に具体的な例をいくつか挙げてみましょう。
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); ); //1
parseInt() 関数は、整数を処理するときによく使用されます。 parseInt() 関数は文字列を変換するとき、最初の非スペース文字が見つかるまで文字列の前のスペースを無視します。最初の文字が数字または負符号でない場合、parseInt() は NaN を返します。つまり、parseInt() を使用して空の文字列を変換すると、NaN が返されます (null 文字の場合、Number() は 0 を返します)。最初の文字が数字の場合、parseInt() は後続の文字がすべて解析されるか、数字以外の文字が検出されるまで 2 番目の文字の解析を続けます。たとえば、「blue」は完全に無視されるため、「1234blue」は 1234 に変換されます。同様に、「22.5」は小数点が有効な数字ではないため、22 に変換されます。
文字列の最初の文字が数字の場合、parseInt() はさまざまな整数形式も認識できます。文字列が「0x」で始まり、その後に数字が続く場合は 16 進整数として解釈され、文字列が「0」で始まり、その後に数字が続く場合は 8 進数として解釈されます。
parseInt() 関数の変換規則をよりよく理解するために、いくつかの例を以下に示します。
var num1 = parseInt("1234blue"); // 1234 var num2 = parseInt(""); num3 = parseInt("0xA"); // 10 (16 進数) var num4 = parseInt(22.5); // 22
var num5 = parseInt("070"); // 56 (8 進数) var num6 = parseInt ( "70"); // 70 (10 進数)
var num7 = parseInt("0xf") // 15 (16 進数)
var num = parseInt("070"); // ES5 JavaScript の場合parseInt() には、8 進数値を解析する機能がなくなりました。parseInt() 関数は、変換に使用される基数 (基数) という 2 番目のパラメーターを提供します。
var num = parseInt("0xAF", 16); //175 var num1 = parseInt("AF", 16); //175
2 番目のパラメータとして 16 を指定した場合、文字列の前に「0x」を付けることはできません。 」。
parseInt() 関数と同様に、parseFloat() も最初の文字 (位置 0) から始めて各文字を解析します。そして、文字列の終わりまで、または無効な浮動小数点数値文字が見つかるまで解析されます。つまり、文字列の最初の小数点は有効ですが、2 番目の小数点は無効であるため、それ以降の文字列は無視されます。 「22.34.5」は22.34に変換されます。
有効な最初の小数点に加えて、parseFloat() と parseInt() の 2 番目の違いは、先行ゼロを常に無視することです。 parseFloat() は、10 進整数形式を含む、前述したすべての浮動小数点数値形式を認識します。ただし、16 進形式の文字列は常に 0 に変換されます。 parseFloat() は 10 進数値のみを解析するため、2 番目の引数で基数を指定する必要はありません。最後に注意すべき点: 文字列に整数 (小数点がない、または小数点以下がすべてゼロ) として解析できる数値が含まれている場合、parseFloat() は整数を返します。以下に、parseFloat() を使用して数値を変換する典型的な例をいくつか示します。
var num1 = parseFloat("1234blue"); //1234 (整数) var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5 var num4 = parseFloat(" 22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5 var num6 = parseFloat("3.125e7"); //31250000

2.5 文字列型

文字列が作成されると、それらの値は変更できません。例:
var lang = "Java";
lang = lang + "Script";
上記の例の変数 lang には、最初は文字列「Java」が含まれています。コードの 2 行目は、lang の値を「JavaScript」に再定義します。この操作を実装するプロセスは次のとおりです。最初に 10 文字を保持できる新しい文字列を作成し、次にこの文字列に「Java」と「Script」を入力します。最後のステップでは、元の文字列「Java」と「String」を破棄します。 「 Script」。これら 2 つの文字列はもう役に立たないためです。
var age = 11; var ageAsString = age.toString(); // 文字列 "11"
var found = true; var foundAsString = found.toString(); // 文字列 "true"
数値、ブール値、オブジェクト文字列値 (はい、すべての文字列にも文字列のコピーを返す toString() メソッドがあります) には toString() メソッドがあります。ただし、null および未定義の値にはこのメソッドはありません。
変換する値がnullか未定義かわからない場合は、変換関数String()を使用することもできます。この関数は、任意の型の値を文字列に変換できます。 String() 関数は次の変換規則に従います。
 値に toString() メソッドがある場合は、そのメソッドを (パラメーターなしで) 呼び出して、対応する結果を返します。
 値が null の場合は、「null」を返します。  値が未定義の場合は、「未定義」を返します。
null と unknown には toString() メソッドがないため、String() 関数はこれら 2 つの値のリテラル値を返します。
ヒント: 値を文字列に変換するには、プラス演算子を使用して値を文字列 ("") に追加します。

2.6 オブジェクト型


ECMAScript のオブジェクトは、実際にはデータと関数のコレクションです。作成: var o = new Object();

Object のすべてのインスタンスには、次のプロパティとメソッドがあります。
 コンストラクター: 現在のオブジェクトの作成に使用された関数を保存します。前の例では、コンストラクターは Object() です。
 hasOwnProperty(propertyName): 指定されたプロパティが現在のオブジェクト インスタンスに存在するかどうかを確認するために使用されます。このうち、パラメータとしてのプロパティ名(propertyName)は文字列形式で指定する必要があります(例:o.hasOwnProperty("name"))。
 isPrototypeOf(object): 受信オブジェクトが受信オブジェクトのプロトタイプであるかどうかを確認するために使用されます。
 propertyIsEnumerable(propertyName): for-in ステートメントを使用して指定されたプロパティを列挙できるかどうかを確認するために使用されます。 hasOwnProperty() メソッドと同様に、パラメータとしてのプロパティ名は文字列形式で指定する必要があります。
 toLocaleString(): 実行環境の領域に対応するオブジェクトの文字列表現を返します。
 toString(): オブジェクトの文字列表現を返します。
 valueOf(): オブジェクトの文字列、数値、またはブール表現を返します。通常は toString() メソッドの戻り値と同じです。
Object は ECMAScript のすべてのオブジェクトの基礎であるため、すべてのオブジェクトにはこれらの基本的なプロパティとメソッドがあります。

技術的に言えば、ECMA-262 のオブジェクトの動作は、JavaScript の他のオブジェクトに必ずしも適用されるわけではありません。 BOM や DOM 内のオブジェクトなど、ブラウザ環境内のオブジェクトは、ホスト実装によって提供および定義されるため、ホスト オブジェクトです。 ECMA-262 はホスト オブジェクトの定義を担当しないため、ホスト オブジェクトは Object を継承する場合と継承しない場合があります。

3. 注


(1) オペランドを NaN と比較すると、結果は false になります。

(2) null == unknown は似た値であるため true を返しますが、null === unknown は値の型が異なるため false を返します。

以上がjsデータ型の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。