面経のjs

10645 ワード

1.evalは何をしていますか?なぜevalを使用しないようにしますか?
  • Javascriptグローバルオブジェクト、eval関数は、コンピュータのある文字列を計算し、JSコードを計算することができます.
  • evalは、直接に起動され、関数がeval自体である場合にのみ、現在のスコープで実行され、そうでない場合はグローバルスコープで実行される.
  • eval()は、その外部作用領域における変数にアクセスして修正することができる作用ドメインチェーンを妨害することができる.
  • evalにもセキュリティ問題があります.コード文字列が未知または信頼されていないソースからのコードを実行しますので、決してeval関数を使用しないでください.Ajax要求を処理して得られたJSONが対応するとき.これらの場合、JavaScript内蔵方法を用いてJSON対応を解析し、安全と効果を確保することが望ましい.ブラウザがJSON.parse()をサポートしていない場合、JSON.orgからのライブラリを使用することができます.
  • evalは調整が容易ではない.chromeDevなどのデバッグツールを使って、ポイントデバッグを中断できません.
  • 機能については、古いブラウザでエヴァを使うと、性能が10倍下がるという問題があります.近代的なブラウザには2つのコンパイルモードがあります.fast pathとslow path.fast pathは、それらの安定性と予測可能なコードをコンパイルするものです.明らかにevalは予測できないので、slow pathを使うので、遅くなります.(2回、一回はjsを解析して、一回は実行します.)
  • 2.nullとundefinedの違い?
  • undefinedタイプの値は一つだけundefinedであり、宣言された変数が初期化されていない場合、変数のデフォルト値はundefinedである.
  • Nullタイプの値は一つのnullだけで、nullはまだ存在していないオブジェクトを表しています.一般的には、関数が存在しないオブジェクトを返したいということを表しています.
  •     alert(typeof undefined); //output "undefined"  
        alert(typeof null); //output "object"
    
    第一行コードは分かりやすいです.undefinedのタイプはUdefinedです.二行目のコードは、なぜnullのタイプがObjectなのか?実はこれはJavaScriptが最初に実現した誤りで、その後ECMAScriptによって引き継がれました.今日ではnullは存在しないオブジェクトのプレースホルダであると解釈できますが、実際に符号化するときはこの特性に注意してください.
        alert(null == undefined); //output "true"     
    
    ECMAScriptはundefinedがnullから派生したと考えていますので、それらを等しく定義します.しかし、場合によっては、この二つの値を区別しなければなりません.どうすればいいですか?次の2つの方法が使えます.
          alert(null === undefined); //output "false"  
          alert(typeof null == typeof undefined); //output "false" 
    
    typeofメソッドを使って前に述べましたが、nullとundefinedはタイプが違っていますので、「false」を出力します.==は絶対イコールを表しています.ここでnull==undefined出力falseです.
    2一般的なイベントリスタ関数を書きます.
         // event(  )   ,  :github.com/markyun
           markyun.Event = {
               //        
               readyEvent : function(fn) {
                   if (fn==null) {
                       fn=document;
                   }
                   var oldonload = window.onload;
                   if (typeof window.onload != 'function') {
                       window.onload = fn;
                   } else {
                       window.onload = function() {
                           oldonload();
                           fn();
                       };
                   }
               },
               //        dom0||dom2||IE        
               //   :      ,     ,      
               addEvent : function(element, type, handler) {
                   if (element.addEventListener) {
                       //    、       、    
                       element.addEventListener(type, handler, false);
                   } else if (element.attachEvent) {
                       element.attachEvent('on' + type, function() {
                           handler.call(element);
                       });
                   } else {
                       element['on' + type] = handler;
                   }
               },
               //     
               removeEvent : function(element, type, handler) {
                   if (element.removeEventListener) {
                       element.removeEventListener(type, handler, false);
                   } else if (element.datachEvent) {
                       element.detachEvent('on' + type, handler);
                   } else {
                       element['on' + type] = null;
                   }
               },
               //      (       ,  IE       )
               stopPropagation : function(ev) {
                   if (ev.stopPropagation) {
                       ev.stopPropagation();
                   } else {
                       ev.cancelBubble = true;
                   }
               },
               //          
               preventDefault : function(event) {
                   if (event.preventDefault) {
                       event.preventDefault();
                   } else {
                       event.returnValue = false;
                   }
               },
               //       
               getTarget : function(event) {
                   return event.target || event.srcElement;
               },
               //   event     ,         ,       event;
               getEvent : function(e) {
                   var ev = e || window.event;
                   if (!ev) {
                       var c = this.getEvent.caller;
                       while (c) {
                           ev = c.arguments[0];
                           if (ev && Event == ev.constructor) {
                               break;
                           }
                           c = c.caller;
                       }
                   }
                   return ev;
               }
           };
    
    3.モジュール化はどうしますか?
    すぐに関数を実行し、プライベートメンバーを公開しません.
            var module1 = (function(){
                var _count = 0;
                var m1 = function(){
                  //...
                };
                var m2 = function(){
                  //...
                };
                return {
                  m1 : m1,
                  m2 : m2
                };
              })();
    
    4.「use strict」どういう意味ですかそれを使うメリットとデメリットはそれぞれ何ですか?
    ECMAscript 5は、第二の運転モード「厳格モード」を追加しました.その名の通り、このモードはJavascriptをより厳しい条件で実行させます.
    「厳格なモード」を設定する目的は、主に以下のいくつかあります.
    1.Javascript文法のいくつかの不合理、不謹慎なところを取り除き、奇異な行為を減らす.
    2.コードの運行の一部の安全性をなくし、コードの運行の安全を保証する.
    3.コンパイラの効率を高めて、運転速度を増加させます.
    4.未来の新しいバージョンのJavascriptのために下地を作ります.
    注:テストしたIE 6,7,8,9は、厳格なモードをサポートしていません.
    短所:
    現在ウェブサイトのJSはいずれも圧縮を行います.このときこれらは本来は厳格なパターンのファイルであるが、mergeされると、この列はファイルの中間になり、厳格なパターンを示すどころか、圧縮後にバイトを浪費してしまう.
    どう書きますか
    まず、厳密なモードはシナリオやモジュール全体に書いてもいいし、関数に書いてもいいです.グローバル環境で書くと、ファイルの最初の文に直接「use stricat」を入れることができます.これでいいです.しかし、このように書くと大変です.他のスクリプトを導入する場合、他のスクリプトが有効にされていないと、多くの問題に直面します.ですから、厳密なパターンを関数に書いて、関数内の最初の文に書いてください.
    作用
    withキーワードを削除して、厳格なモードを使うと、withキーワードはエラーとなります.サポートしていません.
    with(){
    }
    
    このような書き方です
    予期せぬグローバル変数を防ぐために、varを持たない宣言変数を使ってもいいです.
    a = 2; 
    
    関数に定義されていない、またはnullのthisが大域変数に向けられていません.依存関数のデフォルトthis挙動コードのエラーを防止します.
    //"use strict"
    this.color = "red";
    function sayColor() {
        console.log(this.color);
    }
    sayColor();\\undefined
    sayColor.call(null);\\undefined
    
    厳格モード
    "use strict"
    this.color = "red";
    function sayColor() {
        console.log(this.color);
    }
    sayColor();
    sayColor.call(null);
    
    console.log(this.color);//TypeError: Cannot read property 'color' of undefined
    
    もう一つの場合
    "use strict"
    function Person(name) {
        this.name = name;
    }
    
    var me = Person("Nicholas");
    
    this.name = name;
                  ^
    TypeError: Cannot set property 'name' of undefined
    
    原型引継ぎ
    "use strict"
    function Person(name) {
        this.name = name;
    }
    
    var me = new Person("Nicholas");
    
    エラーはありませんでした.このように.this=proto=prototypeという属性は全部newの新しい対象です.原型継承の時に値をつけます.
    変数の名前を変更するとエラーが発生します.これは多くなくても理解できます.
    安全なeval()
    ‘js/’use strict’;var y=eval(「var x=10」);consolone.log(x)//10
    ```js
     "use strict";
        var y = eval("var x=10;");
        console.log(x);
    
        console.log(x);
                    ^
    ReferenceError: x is not defined
    
    読み取り専用属性に値を付けることは禁止されています.
    // "use strict";
        var person = {};
        Object.defineProperty(person, "name",{
            writable: false,
                value: "Nicholas"
        });
        person.name = "John";
    
    以上が正しいです
    "use strict";
        var person = {};
        Object.defineProperty(person, "name",{
            writable: false,
                value: "Nicholas"
        });
    
        person.name = "John";
    
    エラー:
    c:\Users\Feng Huang\WebstormProjects\MemberManagement\test4.js:13
        person.name = "John";
                    ^
    TypeError: Cannot assign to read only property 'name' of #
    
    ヒント読み取り専用の属性は値を付けられません.
    newオペレータは具体的に何をしましたか?
    1、空のオブジェクトを作成し、オブジェクトを参照しながら、関数の原型を継承します.2、属性と方法は、this参照の対象に追加されます.3、新しく作成したオブジェクトはthisによって参照され、最後に暗黙的にthisに戻ります.
       var obj  = {};
       obj.__proto__ = Base.prototype;
       Base.call(obj);
    
    Javascriptには、実行時にオブジェクト検索を行う関数がありますが、プロトタイプは永遠に検索されません.この関数は?
    hasOwnProperty()
    
    [1],[2],[3].map(parseInt)の答えはどれですか?
    [1,NaN,NaN]パーrseIntは二つのパラメータ(val,radix)が必要であるため、ラジクスは解析に用いる基数を表している.mapは3つの(element、index、array)を伝えましたが、対応するradixが不正で解析に失敗しました.
    Thisの対象の理解を話します.
    thisはjsのキーワードです.関数の使用によって、thisの値が変わります.しかし、一つの原則があります.つまり、thisは関数を呼び出す対象を指します.thisは一般的にグローバルオブジェクトGlobalです.方法として呼び出すと、thisとはこのオブジェクトのことです.
    js遅延荷重の方法は何がありますか?
    deferとasync、ダイナミックにDOM方式を作成します.必要に応じてjsを非同期でロードします.
    defer
    定義と用法
    defer属性は、スクリプトの実行がページローディングまで遅延されるかどうかを規定しています.あるjavascriptシナリオのdocument.write方法は現在の文書内容を作成します.他のスクリプトは必ずしもそうではありません.スクリプトがドキュメントの内容を変更しない場合は、defer属性をラベルに追加して、ドキュメントの処理速度を速くします.ブラウザは、スクリプトを実行せずに文書の残りの部分を安全に読み取ることができるということを知っていますので、文書がユーザに表示されるまでは、スクリプトの解釈を遅らせます.ボルトp>
    <h 3>ブラウザサポート</h 3>
    <p>Internet Explorer(9以前)のみdefer属性をサポートします.ボルトp>
    <h 2>async</h 2>
    <h 3>定義と使い方</h 3>
    <p>asyncプロパティはスクリプトが利用可能になると非同期で実行されます.lt;bragt;lt;strong gt;コメント<ストリングス>async属性は外部スクリプトのみに適用されます.lt;bragt;lt;strong gt;コメント<ストリングス>外部スクリプトを実行するための様々な方法があります.p>
    <ulgt;
    <ligt;async=「async」:シナリオがページの残りの部分に対して非同期的に実行される場合(ページが解析され続けばスクリプトが実行されます)<ligt;
    <ligt;asyncを使わずにdefer=「defer」:スクリプトはページで解析が完了したときに実行されます.ligt;
    <ligt;asyncを使わずにdeferを使わない場合:ブラウザがページを解析し続ける前に、すぐにスクリプト</を読み込み、実行します.ligt;
    <ulgt;
    <h 3>文法<h 3>
    <p>lt;script async="async"&ボルトp>
    <h 3>HTML 4.01とHTML 5の違い</h 3>
    <p>async属性はHTML 5の新しい属性です.p>
    <h 2>asyncとdeferの違い</h 2>
    <p>lt;strong gt;defer<strong gt;属性表示のスクリプトは、ブラウザがスクリプトの実行を遅延させるため、すなわち、スクリプトは非同期でダウンロードされますが、ドキュメントの読み込みと解析が完了するまでは実行されません.lt;bragt;lt;strong gt;async</strong gt;属性表示のスクリプトは非同期スクリプトで、すなわち非同期にスクリプトをダウンロードすると、ドキュメントの解析がブロックされません.しかし、ダウンロードが完了するとすぐに実行され、ドキュメントの解析がブロックされます.lt;bragt;lt;strong gt;ディレイスクリプト</strong gt;彼らがドキュメントに現れる順番に<bragt;lt;strong gt;非同期スクリプト</strong gt;それらをロードして実行しますが、実行順序は保証されません.lt;bragt;asyncを使うという意味は、スクリプトをダウンロードする時に、ドキュメントの解析をブロックしないということです.asyncのシナリオの実行順序は保証されていませんので、台本間に依存関係がないことを確認します.lt;bragt;今は基本的に文書の最後に脚本を書くのですが、これとdeferの違いはどこですか?lt;bragt;第一のポイントはもちろん非同期のシナリオです.第二のポイントはasyncまたはdeferを使っていずれもシナリオにdocument.writeが現れないということです.ボルトp>
    <アート>
    <div>
    <div>
    <div>
    <!--PCとWAPアダプティブ>
    <div id=「SOHUCS」sid=「118495915108232」gt;ボルトdiv>
    <script type=「text/javascript」src=「/views/front/js/chayan.js」gt;