先端面接問題(八)

5523 ワード

  • ブラウザ内の複数のラベルページ間の通信方法
    この問題はあまり研究していないので,他人の答えを借りてみよう.
    Webメッセージ通信
  • WebSocket(ドメイン間可)WebSocket HTML5 TCP 。
  • postMessage(ドメイン間可)window.postMessage() Window メッセージを受信するウィンドウの参照について、次のような参照を取得します.
  • iframeタグ
  • Window.Open(新しいウィンドウを生成して参照)
  • Window.Opener(これを生成するウィンドウを参照)
  • WorkerのSharedWorker , js ( ), , DOM 。SharedWorkerは複数のwindowで共通に使用できるので、ページ間でデータを転送するために使用できますが、これらのラベルページが同じソース(同じプロトコル、ホスト、ポート番号)であることを保証する必要があります.
  • Server-Sent Events HTML5 (server-sent event) 。Server-Sent 。 , 。 ,
  • localStorage localstorage , (ps:session , )。 window 。
  • BroadcastChannel , , 、iframe 。 。
  • Cookies Cookies ,

  • あなたが理解している優雅な降格と次第に強化された優雅な降格を簡単に説明します:
          ,           ,             
    次第に強化されます:
        ,   ( )       ,                 ,     。            。
    
  • データ型を判断する方法を書くには一般的にいくつかの方法があるが、それぞれの欠陥がある.typeof typeofを使用してデータ型を判断した場合:
    console.log(
        typeof 123, //"number"
        typeof 'dsfsf', //"string"
        typeof false, //"boolean"
        typeof [1,2,3], //"object"
        typeof {a:1,b:2,c:3}, //"object"
        typeof function(){console.log('aaa');}, //"function"
        typeof undefined, //"undefined"
        typeof null, //"object"
        typeof new Date(), //"object"
        typeof /^[a-zA-Z]{5,20}$/, //"object"
        typeof new Error() //"object"
    );
    上記のテストで発見されました.
    Array,Object,null,Date,RegExp,Errorのいくつかのタイプはtypeofでobjectと判断されるので,これらのタイプを判断するにはtypeofは使用できない.
    Number,String,Boolean,Function,undefined,これらのタイプを判断するにはtypeofを使用します
    2.instanceofinstanceof演算子は、コンストラクション関数を指定する必要があります.または、このコンストラクション関数のプロトタイプが所定のオブジェクトのプロトタイプチェーン上にあるかどうかを判断するために特定のタイプを指定します.
    console.log(
        123 instanceof Number, //false
        'dsfsf' instanceof String, //false
        false instanceof Boolean, //false
        [1,2,3] instanceof Array, //true
        {a:1,b:2,c:3} instanceof Object, //true
        function(){console.log('aaa');} instanceof Function, //true
        undefined instanceof Object, //false
        null instanceof Object, //false
        new Date() instanceof Date, //true
        /^[a-zA-Z]{5,20}$/ instanceof RegExp, //true
        new Error() instanceof Error //true
    )
    で次のことがわかります.
    Number,String,Booleanは彼らのタイプを検出しなかったが,次の書き込み法則を用いて検出できた.
    var num = new Number(123);
    var str = new String('dsfsf');
    var boolean = new Boolean(false);

    nullとundefinedはfalseを返します.これは、それらのタイプが自分自身であり、Objectが作成したわけではないのでfalseを返します.
    3.constructorconstructorはprototypeオブジェクトのプロパティであり、コンストラクション関数を指します.インスタンスオブジェクトが属性を探す順序によって、インスタンスオブジェクトにインスタンス属性やメソッドがない場合、プロトタイプチェーン上で探すため、インスタンスオブジェクトもconstructor属性を使用することができる.タイプのインスタンスのconstructorを出力すると、
    console.log(new Number(123).constructor)
    //ƒ Number() { [native code] }
    
    がNumberのコンストラクション関数を指していることがわかります.したがって、num.constructor=Numberを使用して、変数がNumberタイプであるかどうかを判断できます.
    var num  = 123;
    var str  = 'abcdef';
    var bool = true;
    var arr  = [1, 2, 3, 4];
    var json = {name:'wenzi', age:25};
    var func = function(){ console.log('this is function'); }
    var und  = undefined;
    var nul  = null;
    var date = new Date();
    var reg  = /^[a-zA-Z]{5,20}$/;
    var error= new Error();
    
    function Person(){
    
    }
    var tom = new Person();
    
    // undefined null  constructor  
    console.log(
        tom.constructor==Person,
        num.constructor==Number,
        str.constructor==String,
        bool.constructor==Boolean,
        arr.constructor==Array,
        json.constructor==Object,
        func.constructor==Function,
        date.constructor==Date,
        reg.constructor==RegExp,
        error.constructor==Error
    );
    //      true

    undefinedとnullを除いて、他のタイプはconstructorプロパティでタイプを判断できます.
    4.toString()を使用してオブジェクトタイプを検出するには、toString()を使用して各オブジェクトのタイプを取得します.オブジェクトごとにObjectを通過できるようにする.prototype.toString()で検出するにはFunctionが必要である.prototype.call()またはFunction.prototype.apply()の形式で呼び出され、チェックするオブジェクトをthisArgと呼ばれる最初のパラメータとして渡します.
    var toString = Object.prototype.toString;
    
    toString.call(123); //"[object Number]"
    toString.call('abcdef'); //"[object String]"
    toString.call(true); //"[object Boolean]"
    toString.call([1, 2, 3, 4]); //"[object Array]"
    toString.call({name:'wenzi', age:25}); //"[object Object]"
    toString.call(function(){ console.log('this is function'); }); //"[object Function]"
    toString.call(undefined); //"[object Undefined]"
    toString.call(null); //"[object Null]"
    toString.call(new Date()); //"[object Date]"
    toString.call(/^[a-zA-Z]{5,20}$/); //"[object RegExp]"
    toString.call(new Error()); //"[object Error]"

    これによりObjectが使用することがわかる.prototype.toString.call()の方式で1つの変数のタイプを判断するのが最も正確な方法である.
    以上のことから、1変数のデータ型を判断するのに便利である.

  • 面接問題はGithubから抜粋