JSデータ構造と型式検査
3137 ワード
プログラミング言語は内のデータ構造を持っています.JavaScriptも例外ではありません.JavaScriptは弱いタイプまたは動的な言語です.これは事前に変数のタイプを宣言しなくても、プログラムの実行中にタイプが自動的に決定されます.これは非常に重要なことです.JSは柔軟で、これほどの制限はないと言えます.そのため、JS変数のデータタイプの検出が非常に重要である.最新のECMAScript標準では7種類のデータタイプが定義されています. 6種類の基本データタイプ:Boolean、Null、Unidefined、Number、String、Symbol(ECMAScript 6新規定義) 複雑なデータタイプ:Object まず6つの基本データのタイプを見てください. Udefined Unidefinedタイプは一つの値しかないです.つまり、特別なUnidefinedです.与えられていない変数にはデフォルト値undefinedがあります. Null Nullタイプは最初に一つだけの価値のあるデータタイプです.これは特殊な値です.nullです.null値は空のオブジェクトポインタを表します. Boolean Booleanは論理エンティティを表し、2つの値があり得る:trueとfalse. Numberは、ECMAScript規格によると、JavaScriptの中には、IEEE 754規格に基づくダブル精度64ビットのバイナリフォーマットの値(-(263−1)から263−1)だけがあります.整数には特定のタイプが与えられていません.浮動小数点数を表す以外に、記号付きの値があります.+Infinity、-Infinity、NaN(非数値、Not-a-Number). String Stringタイプは、ゼロまたは16ビット以上のユニフォーム文字からなる文字列、すなわち文字列を表すために使用される. Symbol符号(Symbors)はECMAScript第6版の新しい定義です.記号タイプは一意であり、修正不可能であり、Objectのkeyの値としても使用できる.
var message;
typeof message; // "undefined"
var message = null;
typeof message; // "object"
var found = true;
var lost = false;
typeof found; // "boolean"
typeof lost; // "boolean"
var num1 = 5;
var num2 = NaN;
var num3 = +Infinity;
typeof num1; // "number"
typeof num2; // "number"
typeof num3; // "number"
var name = "jack"
typeof name; // "string"
var sym = Symbol("foo");
typeof sym; // "symbol"
複雑なデータの種類:ECMAScriptのオブジェクトはデータと機能のセットです.var arr = [1, 2, 3];
var o = new Object();
var reg = /\d/g;
var a = {};
typeof arr; // "object"
typeof o; // "object"
typeof reg; // "object"
typeof a; // "object"
したがって、基本的なデータタイプを判断する際には、typeofで検出することができますが、複雑なデータタイプのtypeofには限界があり、複雑なデータタイプについては常に「object」に戻ります.複雑なデータタイプの検出において、私たちは他の方法で判断すべきです.これがinstance of/constructorです.instance of/constructorを使って配列と正規表現を検出できます.var arr = [1, 2, 3];
var reg = /\d/g;
arr instanceof Array; // true;
reg instanceof RegExp; // true;
arr.constructor == Array; // true;
reg.constructor == RegExp; // true;
厳密な判断方法:function isArray(object){
return object && typeof object==='object' &&
Array == object.constructor;
}
しかし、instance of/constructorにもその限界があります.判断されたArayは現在のページで声明しなければなりません.親ページのフレームにサブページを参照し、サブページにアラyを宣言し、親ページの変数に値を割り当てます.このとき、戻り値を検出するのがfalseです.したがって、より良い方法で検査し、書籍とインターネット資料を調べ、また二つの方法を使う必要があります.function isArray(object){
return object && typeof object==='object' &&
typeof object.length==='number' &&
typeof object.splice==='function' &&
// length false
!(object.propertyIsEnumerable('length'));
}
function isArray(o) {
return Object.prototype.toString.call(o) === '[object Array]';
}
参考資料『JavaScript高級手順設計』(第三版)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures