基本タイプと参照タイプ、実行環境と役割ドメイン

4563 ワード

一、基本タイプと参照タイプの値を理解する
ECMAScript変数には、基本タイプ値と参照タイプ値の2つの異なるデータ型の値が含まれます.
基本タイプの値は単純なデータ・セグメントを指し、参照タイプの値は複数の値で構成される可能性のあるオブジェクトを指します.
参照タイプの値はメモリに保存されているオブジェクトであり、javascriptではメモリ内の場所、すなわちオブジェクトのメモリ領域に直接アクセスできません.オブジェクトを操作する場合、実際には実際のオブジェクトではなくオブジェクトの参照を操作します.参照タイプの値は参照によってアクセスされ、基本タイプは値によってアクセスされます.変数に保存された実際の値を操作できるためです.
  • 動的プロパティは、基本タイプ値と参照タイプ値を定義する方法と同様です.変数を作成し、その変数に値を割り当てます.ただし、変数に保存される異なるタイプの値の操作は異なります.参照タイプの値については、属性やメソッドを追加、変更、削除できますが、基本タイプの値に属性を追加するなどの操作はできません.
  • var person = new Object();  //     
    person.name = "  ";
    alert(person.name);         //  
    
            
    var name = "  ";           //     
    name.age = 25;
    alert(name.age);            //undefined
  • 変数値をコピー1つの変数から別の変数に基本タイプの値をコピーすると、変数オブジェクトに新しい値が作成され、新しい変数が割り当てられた場所にコピーされます.
  • var num1 = 2;
    var num2 = num1;

    num 2の値は2になります.この値はnum 1の値のコピーにすぎません.num 1の値2とは完全に独立しており、この2つの変数は相互に影響を与えることなく、任意の操作に関与することができます.
    1つの変数から1つの変数に参照タイプの値をコピーすると、変数オブジェクトに格納されている値も、新しい変数に割り当てられた空間にコピーされますが、この値のコピーは実際にはポインタであり、このポインタはスタック内に存在するオブジェクトを指します.つまり、2つの値は実際に同じオブジェクトを参照します.したがって、1つの変数を変更すると、もう1つの変数も影響を受けます.
    var obj1 = new Object();
    obj1.name= "one";
    var obj2 = obj1;
    alert(obj2.name); // one
    
    obj2.name = "two";
    alert(obj1.name); //two 
    
    //   obj2.name,obj1.name    
  • は、ある変数から別の変数に値をコピーするように、パラメータが関数の外部の値を関数の内部のパラメータにコピーすることを伝達する.アクセス変数には値別と参照別の2つの方法がありますが、パラメータは値別にのみ渡されます.基本タイプの値をパラメータに渡すと、渡された値がローカル変数(名前付きパラメータ)にコピーされます.パラメータに参照タイプの値を渡すと、メモリ内の値のアドレスがローカル変数にコピーされ、このローカル変数が変化すると関数の外部に反映されます.
  • function add(num){
        num += 10;
        return num;
    }
    var count = 20;
    var result = add(count);
    alert(count);   //20 
    alert(result);  //30

            
    エラー:ローカル役割で変更されたオブジェクトがグローバル役割ドメインに反映され、パラメータが参照によって伝達されていることを示します(X)
    function setName(obj){
        obj.name = "Tom";
        obj = new Object(); //      
        obj.name = "Jim";  //      name  
    }
    var person = new Object();
    setName(person);
    alert(person.name);  // Tom
    
    //             ,          

    Personが参照によって渡されると、personは自動的にname属性が「Jim」である新しいオブジェクトに変更されますが、person.nameに外部からアクセスすると、値は「Tom」のままです.
  • 検出タイプ
  • 基本データ型がtypeofオペレータであるかどうかを検出し、typeofオペレータは変数が文字列/数値/ブール値/undefinedであることを決定します.
    変数値がオブジェクトまたはnullの場合は「object」を返します.
    instanceofオペレータは、変数が指定された参照タイプのオブジェクトである場合、どのタイプのオブジェクトであるかを検出します.instanceofオペレータはtrueを返します.
    A instanceof Object;
    B instanceof Array;
    C instanceof RegExp;
    ……

    参照タイプ値とObjectコンストラクション関数を検出すると、instanceofオペレータは常にtrueを返します.もちろん、instanceofオペレータを使用して基本タイプの値を検出すると、基本タイプがオブジェクトではないため、オペレータは常にfalseを返します.
    二、実行環境及び役割ドメインの理解
    実行環境は、変数または関数がアクセスできる他のデータを定義し、それぞれの動作を決定します.
    各実行環境には、関連付けられた変数オブジェクトがあり、環境で定義されたすべての変数と関数がこのオブジェクトに保存されます.
    グローバル実行環境は、最も周辺の実行環境です.Webブラウザでは、グローバル実行環境はwindowオブジェクトとみなされるため、すべてのグローバル変数と関数はwindowオブジェクトの属性と方法として作成され、アプリケーションが終了するまでグローバル実行環境は破棄されません.
    コードが1つの環境で実行されると、変数オブジェクトの役割ドメインチェーンが作成されます.役割ドメインチェーンの用途は、実行環境にアクセスできるすべての変数と関数への秩序あるアクセスを保証することです.
        
        var color = "blue";
    
        function changeColor(){
            var anotherColor = "red";
    
            function swapColor(){
                var tempColor = anotherColor;
                anotherColor = color;
                color = tempColor;
                //      color、anotherColor、temperColor
            }
    
            //      color、anotherColor
            swapColor();
        }
        //      color
        changeColor();

    以上のコードは、グローバル環境、changeColor()のローカル環境、およびswapColor()のローカル環境の3つの実行環境に関連しています.内部環境は、役割ドメインチェーンを使用してすべての外部環境にアクセスできますが、外部環境は内部環境の変数や関数にアクセスできません.これらの環境の間には順序があり、各環境は変数と関数名をクエリーするために役割ドメインチェーンを上に検索できますが、どの環境も役割ドメインチェーンを下に検索することで別の実行環境に入ることはできません.
  • 役割ドメインチェーンを延長実行フローが次のいずれかの文に入ると、役割ドメインチェーンは長くなります:◇try-catch文のcatchブロック◇with文の2つの文は、役割ドメインチェーンの先端に変数オブジェクトを追加し、with文に対して指定されたオブジェクトを役割ドメインチェーンに追加します.catch文では、投げ出されたエラーオブジェクトの宣言を含む新しい変数オブジェクトが作成されます.詳細説明
  • javascriptブロックレベルの役割ドメインがない
  • ◇変数宣言
    function add(num1,num2){
            var sum = num1 +num2;  //    
            return sum;
        }
        var result = add(10,20);
        alert(result);   //30
        alert(sum);      //    

    結果値は関数から返されるが,変数sumは局所変数であり,関数外部にはアクセスできない.var宣言を使用しない場合、sumは自動的にグローバル環境に参加し、外部からアクセスできます.
    ◇照会識別子
    特定の名前の識別子をクエリーします.ローカル環境で識別子が見つかった場合、検索プロセスは停止し、ローカル環境で見つからない場合は、役割ドメインに沿って上へ検索します.見つかるまで.
    var color = "blue";
        function getColor(){
            var color = "red";
            return color;
        }
        alert(getColor());   //red