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