JSデータ構造と型式検査

3137 ワード

プログラミング言語は内のデータ構造を持っています.JavaScriptも例外ではありません.JavaScriptは弱いタイプまたは動的な言語です.これは事前に変数のタイプを宣言しなくても、プログラムの実行中にタイプが自動的に決定されます.これは非常に重要なことです.JSは柔軟で、これほどの制限はないと言えます.そのため、JS変数のデータタイプの検出が非常に重要である.最新のECMAScript標準では7種類のデータタイプが定義されています.
  • 6種類の基本データタイプ:Boolean、Null、Unidefined、Number、String、Symbol(ECMAScript 6新規定義)
  • 複雑なデータタイプ:Object
  • まず6つの基本データのタイプを見てください.
  • Udefined Unidefinedタイプは一つの値しかないです.つまり、特別なUnidefinedです.与えられていない変数にはデフォルト値undefinedがあります.
  • var message;
    typeof message; // "undefined"
    
  • Null Nullタイプは最初に一つだけの価値のあるデータタイプです.これは特殊な値です.nullです.null値は空のオブジェクトポインタを表します.
  • var message = null;
    typeof message; // "object"
    
  • Boolean Booleanは論理エンティティを表し、2つの値があり得る:trueとfalse.
  • var found = true;
    var lost = false;
    typeof found; // "boolean"
    typeof lost; // "boolean"
    
  • Numberは、ECMAScript規格によると、JavaScriptの中には、IEEE 754規格に基づくダブル精度64ビットのバイナリフォーマットの値(-(263−1)から263−1)だけがあります.整数には特定のタイプが与えられていません.浮動小数点数を表す以外に、記号付きの値があります.+Infinity、-Infinity、NaN(非数値、Not-a-Number).
  • var num1 = 5;
    var num2 = NaN;
    var num3 = +Infinity;
    typeof num1; // "number"
    typeof num2; // "number"
    typeof num3; // "number"
    
  • String Stringタイプは、ゼロまたは16ビット以上のユニフォーム文字からなる文字列、すなわち文字列を表すために使用される.
  • var name = "jack"
    typeof name; // "string"
    
  • Symbol符号(Symbors)はECMAScript第6版の新しい定義です.記号タイプは一意であり、修正不可能であり、Objectのkeyの値としても使用できる.
  • 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