JavaScriptのデータ型
データ型
- 基本データ型:Undefined、Null、Boolean、Number、String、Symbol、BigInt。toString直接格納され、占有スペースが小さく、サイズが固定されており、頻繁に使用されるデータに属するため、スタックに配置されます。
- 参照データ型であるObjectはtoStringHippo no.両方に格納されるため、多くのスペースを占め、サイズも固定されません。参照データ型は、ヒープ内のエンティティの開始アドレスを指すポインタをスタックに格納します。
null未定義、NaN
<span>は "empty "を意味する。</span>
``null undefined<span>値が未定義であることを示す</span>
nullは「ヌル」値であり、数値である空文字列''や長さ0の文字列である''とは異なります。
NaNは主に、文字列を数値に解析する際にエラーが発生した場合に見られます。 この特定の数値は、それ自身を含む他のすべての値と等しくありません:
NaN === NaN;
[NaN].indexOf(NaN);
Infinity & gt;
0x3e8 - Infinity & lt;
-0x3e8;
Infinity & gt;
NaN - Infinity & gt;
NaN;
Infinity & lt;
NaN - Infinity & lt;
NaN;
この問題を解決するために、ES6では「同値等価」アルゴリズムが導入されました。
Object.isはこのアルゴリズムを導入した新しいメソッドで、2つの値が厳密に等しいかどうかを比較するために使用されます。
Object.js()は2つの点で異なります。1つは、+0は-0と等しくないが、NaNはそれ自身と等しいという点です:
let foo = {};
let bar = {};
let obj = bar;
console.log(foo === bar);
console.log(bar === obj);
console.log(Object.is(bar, obj));
また、オブジェクト型の変数はポインタであり、比較されるのはこのポインタであって、オブジェクトの内部プロパティやオブジェクトのプロトタイプなどではないことに注意してください。
特殊な値
正と負のゼロ
JavaScript には実際には +0 と -0 の 2 つのゼロがあります。これらは等価です。
-0x0 === +0x0;
0x0 === -0x0;
0x0 === +0x0;
ほとんどの場合、正負のゼロは通常のものとして扱われます。
+0x0 - 0x0(-0x0).toString()(+0x0).toString();
唯一違いがあるのは、分母に +0 または -0 が使われ、返される値が等しくない場合です。正のゼロで割ると+無限大、負のゼロで割ると-無限大となり、これらは等しくありません。
console.log(typeof NaN);
console.log(typeof '1');
console.log(typeof !!0x1);
console.log(typeof declaredButUndefinedVariabl);
console.log(typeof undeclaredVariable);
console.log(typeof new Date());
console.log(typeof /s/);
console.log(typeof Math.sin);
console.log(typeof new Boolean(!false));
console.log(typeof new Number(0x1));
console.log(typeof new String('abc'));
データ型判定
TIPOB
typeof は、計算されないオペランドの型を示す文字列を返します:
console.log(0x2 instanceof Number);
console.log(!false instanceof Boolean);
console.log('str' instanceof String);
console.log([] instanceof Array);
console.log(function () {
} instanceof Function);
console.log({} instanceof Object);
instanceof
instanceof 演算子は、オブジェクトのプロトタイプ・チェインにコンストラクタのプロトタイプ属性があるかどうかを調べるために使用します。このアイデアは、オブジェクトが特定のデータ型のインスタンスであるかどうかを判定することです。
参照されるデータ型は正確に判断できますが、基本データ型は判断できません。
console.log(0x2.constructor === Number);
console.log((!false).constructor === Boolean);
console.log('str'.constructor === String);
console.log([].constructor === Array);
console.log(function () {
}.constructor === Function);
console.log({}.constructor === Object);
Fn.prototype = new Array();
var a = new Fn();
console.log(a.constructor === Fn);
console.log(a.constructor === Array);
constructor
Object.prototype.toString.call('');
Object.prototype.toString.call(0x1);
Object.prototype.toString.call(!false);
Object.prototype.toString.call(Symbol());
Object.prototype.toString.call(undefined);
Object.prototype.toString.call(null);
Object.prototype.toString.call(new Function());
Object.prototype.toString.call(new Date());
Object.prototype.toString.call([]);
Object.prototype.toString.call(new RegExp());
Object.prototype.toString.call(new Error());
Object.prototype.toString.call(document);
Object.prototype.toString.call(window);
toString() は Object のプロトタイプ・メソッドで、このメソッドを呼び出すと、デフォルトで現在のオブジェクトの [[クラス]] が返されます。これは [object Xxx] という形式の内部プロパティで、Xxx はオブジェクトの型です。
Object オブジェクトを返すには、toString() を直接呼び出します。
その他のオブジェクトについては、正しい型情報を返すために、applyの呼び出しが必要です。
document.write(1+"1"); //出力11
データ型変換
JavaScriptはweakly-typedプログラミング言語であり、定義時にデータ型を指定する必要はありません。
データ型変換には暗黙的な型変換と明示的な型変換があります。
暗黙の型変換
windowオブジェクトのalertメソッドとdocumentオブジェクトのwriteメソッドです。これらのメソッドにはどのようなデータ型でも渡すことができ、自動的に文字列に変換されます。
Number(0x1);
var foo = new Date();
Number(foo);
明示的な型変換 JavaScriptの変数は、新しい変数や他のデータ型に変換することができます:
- Number:データ型を数値に変換します;
- String:データ型を文字列に変換します;
- Boolean:データ型をブール型に変換します;
数値の変換
Number()
parseInt("a") // NaN parseInt("10.11") // 10
parseInt()
テキスト・カラム数値型にパースし、丸めに従わない整数を返します。parseFloat('3.14');
parseFloat()
浮動小数点数を返しますvar bar = 9.3487; bar.toFixed(0x2); bar.toFixed(0x9);
**toFixed()
** 指定された小数点以下の桁数を四捨五入した文字列を返します。var a = 2.461; var b = ( parseInt( a * 100 ) / 100 ).toFixed(2);**
**小数点以下は四捨五入していません。
Boolean({}); Boolean([]); !!'abc'; !!''; !!{};
Boolean
- null undefined, "", +0, -0, false, NaNをブール値に変換するとfalseになります。
- 1、"0"、{}、[]を含む残りのケースは真に変換されます。
- 何かを2回反転させるとブール値になります。
var a = { x :1 }
a + "" // "[object Object]"
//ネイティブのJSONオブジェクトを使い、オブジェクトを文字列に変換する。
var obj = {test : 3}
var obj2 = JSON.stringify(obj)obj // "{"test":3}"
//JSON文字列からオブジェクトへ
JSON.parse(obj2) // {test: 3}
String
プラス演算子を使って、""4 + 3 + "2" // "72" "4" + 3 + 1 // "431" true + "" // "true" var f = function(){return 1;}; f + "" // "function(){return 1;}" オブジェクトと文字列
function obj() {
console.log(0x1);
}
obj.valueOf();
** 配列と文字列
var arr = [1,2,3] var arr2 = [4,5,6] var arr3 = [1,[2,3],[4,5]],[6,[7,[8,9],[0]]];] となります。
arr3.toString() // "1,2,3,4,5,6,7,8,9,0" arr + '' // "1,2,3" arr.toString() // "1,2,3" arr + arr2 = "1,2,34,5,6"
var str = arr.join(",")
str // "1,2,3"str.split(",") // [1,2,3]
valueOf toString
**valueOf() **。
指定されたオブジェクトの元の値を返します。さまざまな型のオブジェクトに対する valueOf() メソッドの返り値
Array は配列オブジェクトそのものを返します。
Boolean Boolean.
Dateは1970年1月1日午前0時(UTC)からの時間をミリ秒単位で格納します。
Number 数値。
Object オブジェクトそのもの:
文字列 文字列の値。
Math オブジェクトと Error オブジェクトには valueOf メソッドがありません。
**toString() **
1.すべてのObjectオブジェクトにこのメソッドがあります。
2.Objectオブジェクトが文字列として参照されると、自動的に呼び出されます。
3.デフォルトの呼び出しは、[オブジェクト・タイプ]を返します。例えば
var o = new Object();
o.toString();
コンソールは結果を返す:"[object Object]"
4.toString()を使用すると、オブジェクトのタイプを検出できます。
例えば
var a="dd";
toString.call(a);//applyまたはcallで呼び出す必要がある
"[object String]"
しかし、この呼び出しはあまり有用ではないようだ。"[object String]"。
どちらもプロトタイプを表示することで再定義できます:
myObject.prototype.valueOf() = function myValueOf(){};
myObject.prototype.toString() = function myToString(){};
どちらの書き換え関数も匿名にできる。