JavaScriptの割当時の伝値と住所

3000 ワード

JavaScriptには、基本データタイプと参照データタイプの2つの異なるデータタイプの値があります.
  • 基本データタイプは、Number、String、Boolean、Null、Unidefined
  • の5種類を含んでいます.
  • 参照データタイプは、残りのAray、Date、Math、RegExp、Object、Functなどの
  • を含む.
    一つの値を変数に割り当てる場合は、この値がベースタイプか参照タイプかを判定しなければなりません.
  • 基本タイプは値で直接アクセスする
  • です.
  • 参照タイプは、参照によってアクセスされる
  • である.
    基本データタイプの割り当て:
    //             
    //      b      ,a      
    var a = 1;
    var b = a;
    b = 10;
    
    console.log(a);  //1
    
    原因分析:
    変数から別の変数にベースタイプの値をコピーすると、変数オブジェクトに新しい値を作成し、その値を新しい変数に割り当てられた位置にコピーします.
    つまり、伝授に値する過程は以下のステップを経験しました.
  • コピー変数の値
  • 新しいメモリアドレスのコピー値を保存するために申請しました.
  • コピーした値の新しいアドレスを新しい変数
  • に割り当てます.
    したがって、二つの変数の値は数値的に等しいだけです.実はメモリの中には二つのアドレスがあり、互いに独立した存在です.
    そのため、一つが変わった時は他の一つに影響しません.
    参照データの種類の割り当て
    //            
    // arr2      ,arr1      
    var arr1 = [1,2,3,4];
    var arr2 = arr1;
    arr2[0] = 10;
    
    console.log(arr1[0]);  //10
    
    原因分析
    変数から他の変数に参照値をコピーすると、変数オブジェクトに格納されている値をコピーして、新しい変数に割り当てられた空間に置きます.
    異なるのは、この値のコピーは実際にはポインタであり、このポインタはヒープに記憶されているオブジェクトを指す.コピー操作が終了すると、2つの変数が実際に同じオブジェクトを参照します.
    --「JavaScript高級プログラム設計」
    つまり、アドレスを転送するということは、メモリの中のアドレスを別の変数に転送するということです.
    変数を変更すると、他の変数に影響を与えます.
    どうやって住所の欠点を避けますか?
    二つの変数の同期変更の特性は私たちが望まないので、クローンの方法で避ける必要があります.
    クローンの実現原理:
  • 文字列の割り当て値を転送値とする特徴を利用して、まず対象を文字列形式
  • に変換する.
  • その後、文字列形式をオブジェクト
  • に再変換する.
    第一の方法(forサイクル)
    この方法は複雑な配列に遭遇すると、arr = [1,[2,3],{a:1,b:2}]のように無力である.
    //for     ,             arr2
    //   :              ,       ,    
    var arr1 = [1,2,3,4]
    var arr2 = []
    for (var i = 0; i
    第二の方法(forEach)
    forEachはES 5が新しく導入した配列方法で、循環配列とオブジェクトに使用できます.
    array.forEach(callback,[thisObject]);
    
    forEachには二つのパラメータがあります.一つ目のパラメータはコールバック関数で、二つ目のパラメータはコールバックを行うのがthisの値です.
    コールバック関数には3つのパラメータが含まれています.
  • 現在の循環値
  • 現在のループ下付き
  • 循環される配列自体
  • 注意:ieブラウザにはforEachの方法がありません.互換性があれば、自分で原生を使ってプロトタイプチェーンにこの方法を追加する必要があります.
     var arr1 = [1,2,3,4];
     var arr2 = [];
     var str = '';
     arr1.forEach(function(val){
        console.log(val)  //1 2 3 4    val    
        str += val;
     });
     arr2 = str.split('')
     console.log(arr2)  //["1","2","3","4"]   arr     
     arr2[0] = 10;  //  arr2    
     
     console.log(arr1[0])  //1  arr1    
    
    第三の方法(JSON.strigify()/JSON.parse()
    JSON.strigify():対象を文字列形式のJSON形式文字列値に変換する(DOM/BOMオブジェクトの変換ができない)
    JSON.parse():文字列形式の標準JSON文字列をオブジェクトに変換する(属性名には引用符が必要)
    使用例:
    var arr = [1,2,[3,4],{a:'abc',b:true}];
    console.log(JSON.stringify(arr))  //'[1,2,[3,4],{"a":'abc',"b":true}]'          
    
    var oDiv = document.getElementById('div1')
    console.log(JSON.stringify(oDiv))  //{}         
    
    クローンの実現方法:
    var arr1 = [1,2,[3,4],{a: 'abc',b: true}];
    var arr2 = JSON.stringify(arr1);
    arr2 = JSON.parse(arr2);
    arr2[2][0] = 10;
     
    console.log(arr1[2][0])  //3  arr1