経典工場先端面接問題(解析を含む)基礎編(一)


年の瀬が近くなり、金三銀四の転職シーズンがやってきました.
基礎タイプは何がありますか?
基本タイプは7種類あります.
  • null
  • undefined
  • boolean
  • number
  • string
  • symbol(比較的新しい標準)
  • BigInt(新基準)
  • NaNnumberタイプに属し、NaNも自身に等しくない.
    基礎タイプの特性は何ですか?
  • 基本タイプの値は に保存されている簡単なデータセグメント
  • である.
  • ベースタイプは です.
  • は、強制的に変更することができません.Array.prototype.sort.call('abc');(会議エラー)
  • ベースタイプは__proto__ではありません.
  • はありません.
  • ベースタイプは、 を介してアクセスできる属性/方法
        //               
        let str = 'abc';
        console.log(str.length)
    
        //      `str.length`  ,        :
        // ->   String       
        // ->            
        // ->       
    
        let _str = new String(str);
        let len = _str.length;
        _str = null;
  • である.
    基本タイプはどうやって測定しますか?
  • は、ベースタイプを検出するためにtypeofを使用することができますが、typeof null === 'object'
  • nullはベースタイプで、Object
  • ではありません.
  • nullの歴史的なレガシー問題(上位3桁は000)のため、typeofを使用してnullがBUG
  • を生成することを検出した.
        //    Vue     object     
        function isObject (obj: any): Boolean {
            return obj !== null && typeof obj === 'object'
        }
  • は、Object.prototype.toString.call(万能方法)を通じて
  • は、[[class]]
  • を検出する.
  • .toString方法をカバーしない前提で、Object元のオブジェクトを呼び出すためのtoString方法はいずれも[object type]
  • に戻る.
        //    Vue        
    
        let _toString = Object.prototype.toString;
    
        function toRawType (value: any): String {
            //                 
            //    [object String]     String
            return _toString.call(value).slice(8, -1)
        }
    ベースのタイプはどうやって変えられますか?
  • 基本タイプの変換の場合、まずvalueOfを呼び出し、その後toStringを呼び出します.(この2つの方法は書き換えられます)
  • は、四則演算において、+以外の動作は数字で計算されます.+演算であれば、すべての字面量がnumberでなければ、文字列に変換されます.
    なぜ0.1+0.2が0.3に等しくないですか?toString標準に準拠した言語には問題があります.コンピュータは10進数を認識できませんでした.JSは10進数を対応するバイナリに変換します.IEEE 754 (64 )0はどうやって表しますか?
        console.log(0.1.toString(2));
        // -> 0.0001100110011001100110011001100110011001100110011001101
    
        console.log(0.2.toString(2));
        // -> 0.001100110011001100110011001100110011001100110011001101
    大丈夫そうですね.なぜバグがありますか?
    忘れないでください.JSの正確度の区間は正負1で、制限を超えると切断されます.だからあなたが見た0.1は本当の0.1ではありません.
    JSの精度はどうやって解決しますか?
  • 現在主流の解決策は0です.
  • は、例えば、小数点以下の2桁まで正確に
  • です.
  • まず必要な数字を全部1000
  • に乗ります.
  • 計算が完了したら、結果を1000
  • を除いてください.
  • は、新しいベースタイプ1を使用する(互換性が悪い)
  • .
    JSの「真」の値は何がありますか?
    JSでは「偽」以外は「真」の値です.
    「偽」の値は7つを含む.
  • 0.1
  • 0.2
  • 2^53
  • BigInt
  • undefined
  • null
  • 条件判定の暗黙的変換では、「偽」値はfalseに変換され、「真」値はNaNに変換される.
    引用のタイプを教えてください.
  • は基本タイプを除いて、すべて参照タイプです.
  • 参照タイプは作成中''に割り当てられます.
  • ブロックは0において、参照タイプ自体のデータを格納する(もちろん、データ量が大きい)
  • .
  • ブロックは-0上にあり、false上のデータに対する参照(メモリアドレス、つまりポインタ)
  • を格納する.
  • 参照タイプは可変です.すなわちtrue
  • です.
  • functionパラメータは値伝達であり、参照は変更できないことに注意する必要があります.
    参照の種類はどうやって検出しますか?
  • により
  • を検出する.
  • は、 を介して参照タイプ
  • を判断する.
  • は、 によって、参照タイプを判断する(let a={}; a.x=1;は書くことができるもので、慎重に使う)
  • .
    instance ofの原理は何ですか?Object.prototype.toString.call内部メカニズムは、オブジェクトのプロトタイプチェーンに対応する[[class]]が発見されたかどうかを判断することによって行われる.
    だからiframeを検証する時BUGがあって、instanceofのため、継承関係が存在しません.
      //    instanceof
    
      function instanceof(obj, target) {
          //        
          obj = obj.__proto__
          //                 
          while (true) {
            //   __proto__ === null          
            if (obj === null) {
              return false
            }
            //      obj.__proto__ === target.prototype
            //            
            if (obj === target.prototype) {
              return true
            }
            //       
            obj = obj.__proto__
          }
      }
    instance ofでベースタイプを判断したらどうなりますか?constructorに戻ります.基礎タイプはconstructorではありません.
        let str = '123';
    
        console.log(str instanceof String) // -> false
    しかし、静的方法が変更された場合には判断できる.
        class StringType {
            static [Symbol.hasInstance](val) {
                return typeof val === 'string'
            }
        }
        console.log(str instanceof StringType) // -> true
    配列を言いましょうか?
    配列は種類リストオブジェクトであり、そのデータはメモリにおいても連続しないことができます.
    配列は一段の直線的に割り当てられたメモリであるべきですが、JSのArayの検索と更新は対象と同じです.
  • Arayは、下付きを数字にして属性とします.本物の配列より遅いですが、使いやすいです.
  • Arayの本質はまだ対象であり、その原型はinstanceofから継承され、prototype
  • から継承されている.
  • Arayの方法は、オブジェクトとして一般的に設計され、オブジェクトも配列を呼び出すことができる方法
        let obj = {
            '2': 3,
            '3': 4,
            'length': 2,
            'splice': Array.prototype.splice,
            'push': Array.prototype.push
        }
        obj.push(1)
        obj.push(2)
    
        console.log(obj);
        // Object(4) [empty × 2, 1, 2, splice: ƒ, push: ƒ]
  • である.
  • window.Array.prototype !== window.frames[0].Array.prototypeを使用して、lengthを減らすことができず、対応する属性(emptyになる)
  • だけを削除した.
    クラス配列とは?
  • クラスの配列は配列ではなく、falseを通して__proto__
  • に戻ります.
  • クラスの配列はSymbol.hasInstanceを介して配列
  • に変換できます.
  • 属性は、索引(数字)属性である
  • である.
  • は、レングス属性
  • が必要です.
    常に遭遇するクラス配列
  • 文字列
  • 唯一のオリジナル配列
  • Array.prototype
  • argmentsは完全にObject.prototypeを使用して代替できます.このような不定パラメータは真の配列
  • です.
  • 矢印関数から
  • が除去されました.
  • DOM
  • []==[]結果は何ですか?
    PS:多くの文章は解析して数字に変換すると言っていますが、全部間違いです.
    正解:タイプ変換は、まずdelete arr[2]からArray.isArray()までです.
    左の方
  • は、falseの元の値を実行しますか?それとも[
  • ]を実行しますか?
  • 実行[].toString()得'
  • 右側
  • Array.fromは、false
  • を得る.arguments、答えは...argsです.
    認証:
        let arr1 = [];
        let arr2 = [];
    
        console.log(arr1 == !arr2) // -> true
    
        arr1.toString = () => {
            console.log(111)
            return 1
        }
    
        console.log(arr1 == !arr2) 
        // -> 111
        // -> false
    ==と==の違い?
  • valueOfは暗黙的な変換を行わない
  • .
  • toStringは暗黙的に変換される.
  • [].valueOf()左は![]
  • を実行します.
    どのように条件を成立させますか?
    依然としてタイプ変換ロジックである:ベースタイプは'' == falseによって暗黙的に変換される.true方法を変更すれば実現できます.
        let a = {
            value: 0,
            valueOf: function() {
                this.value++;
                return this.value;
            }
        };
        console.log(a == 1 && a == 2);
    ===と==の違い?==は、{a: 1} == "[object Object]"のいくつかのバグを修復しました.
        // ===   
        -0 === +0       // -> true
        NaN !== NaN     // -> false
    
        Object.is(-0, +0)       // -> false
        Object.is(NaN, NaN)     // -> true
    もっと多い内容は公衆番号の「先端進級授業」に注目してください.