『メンテナンスできるJavaScriptを書く』読書ノート第8章:「空き比較」を避ける


変数(またはパラメータ)が配列であるかどうかを判断したいのですが、単にこのように書くべきではないです.
if (items != null) { //      
    items.sort();
    ...
}
1.元の値を検出する
5つの元の値:文字列、数字、ブール値、null、undefined.最適な選択は、typeof演算子を使ってタイプを判断することです.
  • typeof文字列==string
  • typeof数字==number
  • typeofブール値==number
  • typeof undefined==「undefined」
  • 2.参照値の検出
    元の値以外の値はすべて参照です.内蔵引用タイプ:Object、Aray、Date、Err.
    instance of演算子を使って参照値を検出するタイプ:vaue instance of constructor.
    例:
    //     
    if (value instanceof Date) {
        console.log(value.getFullYear());
    }
    
    //        
    if (value instanceof RegExp) {
        if (value.test(anotherValue)){
            console.log("Matches");
        }
    }
    
    //    Error
    if (value instanceof Error) {
        throw value;
    }
    instance ofは、構造対象のコンストラクタだけでなく、プロトタイプチェーンも検出します.
    var now = new Date();
    
    console.log(now instanceof Object); // true
    console.log(now instanceof Date); // true
    instance ofはカスタムタイプを検出する唯一の方法であるが、フレームをまたぐことができないという深刻な制限がある.
    一つのブラウザフレーム(frame A)のオブジェクトが別のフレーム(frame B)に入ってくると仮定し、二つのフレームの中でコンストラクタPersonが定義されている.フレームAからのオブジェクトがフレームAのPersonの例である場合、
    // true
    frameAPersonInstance instanceof frameAPerson
    
    // false
    frameAPersonInstance instanceof frameBPerson
    この制限は内蔵タイプの関数と配列に対しても同様に有効です.この二つのタイプに対しては、基本的にはinstance ofは使われません.
    2.1検出関数
    JavaScriptの関数は参照の種類であり、Functionコンストラクタが同様に存在し、各関数はその例である.
    function myFunc() {}
    
    //      
    console.log(myFunc instanceof Function); // true
    typeofを使うと、「function」に戻ります.
    function myFunc() {}
    
    //     
    console.log(typeof myFunc === "function"); // true
    IE 8および以前のバージョンのIEブラウザでは、typeofを用いてDOMノードの関数を検出し、「function」ではなく「object」に返信する.
    n演算子を使用してDOMを検出する方法:
    //    DOM   
    if ("querySelectorAll" in document) {
        images = document.querySelectorAll("img");
    }
    2.2検出配列
    Duglas Crockfordを用いて推奨された「アヒル形弁別」(duck typing)の検出:
    //              
    function isArray(value) {
        return typeof value.sort === "function";
    }
    この検出方法は配列が唯一のsort()手法を持つオブジェクトであると仮定する.着信パラメータがsort()メソッドを含む対象であれば、trueに戻ります.
    ジュリーZaytsevは、優雅な解決策を提供する.
    function isArray(value) {
        return Object.prototype.toString.call(value) === "[object Array]";
    }
    この方法はほとんどのJavaScriptクラスに採用されている.
    JSONオブジェクトを内蔵するなど、カスタムオブジェクトには使わないでください.この方法は「Object JSON」に戻ります.
    ECMAScript 5はAray.isAray()を正式にJavaScriptに導入するので、多くのJavaScriptクラスのライブラリが同様にこの方法を実現しました.
    function isArray(value) {
        if (typeof Array.isArray === "function") {
            return Array.isArray(value);
        } else {
            return Object.prototype.toString.call(value) === "[object Array]";
        }
    }
    3.検出属性
    //      :    
    if (object[propertyName]) {
        //     
    }
    
    //      :  null   
    if (object[propertyName] != null) {
        //     
    }
    
    //      :  undefined   
    if (object[propertyName] != undefined) {
        //     
    }
    一番いい方法は、in演算子を使うことです.
    var object = {
        count: 0,
        related: null
    };
    
    //     
    if ("count" in object) {
        //         
    }
    
    //      :    
    if (object["count"]) {
        //          
    }
    
    //     
    if ("related" in object) {
        //         
    }
    
    //      :      null
    if (object["related"] != null) {
        //          
    }
    hasOwnProperty()法を用いて属性が存在するかどうかを検出するが、IE 8およびより早いバージョンでは、DOMオブジェクトはObjectから継承されていないので、この方法はない.
    //       DOM     ,      
    if (object.hasOwnProperty("related")) {
        //        
    }
    
    //          DOM   ,    
    if ("hasOwnProperty" in object && object.hasOwnProperty("related")) {
        //        
    }