Javascript変数の注意点

3809 ワード

ECMAScript変数は、2つの異なるデータタイプの値を含むことができます.基本タイプの値と参照タイプの値です.
基本タイプと参照タイプの値
基本タイプの値(String、Number、Boolean、Null、Unidefined)は簡単なデータセグメントを意味します.参照タイプ値(メモリに保存されているオブジェクト)とは、複数の値から構成される可能性のあるオブジェクトのことです.5つの基本的なタイプの値の議論は、JavaScriptデータタイプのいくつかの注意点を参照してください.多くの言語では、文字列は対象として表されています.しかし、ECMAScriptではこの点を放棄しました.
ダイナミックな属性
動的属性:参照タイプの値に属性を動的に追加します.参照の種類の値は、属性および方法を追加、変更、削除することができます.例えば:
var persons = new Object();
persons.name = "Oliver";
document.write(persons.name); //"Oliver"
上記の例では、変数のpersonsはオブジェクトを格納しています.personsは変数で、nameは属性で、「Oliver」はpersons.nameに与えられる普通の文字列です.最後にdocument.writeを通じてこのname属性を訪問しました.オブジェクトが破壊されない場合や、この属性が削除されない場合は、この属性は常に存在します.
しかし、基本タイプの値に属性を追加することはできません.これは間違いを招くことはありません.例えば:
var name = "Oliver";
name.age = 18;
document.write(name.age); //undefined
したがって、属性は参照タイプの値だけで動的に追加されます.
変数値をコピー
変数値をコピーします.一つの変数から他の変数に基本型の値と参照型の値をコピーします.
基本タイプの値をコピー
非常に簡単です.
var x = 1;
var y = x;
document.write(y); //1
supereasuyはここでコピーした後、xとyは完全に独立し、互いに影響しない.
参照の種類の値をコピー
参照の種類の値を変数から別の変数にコピーすると、基本的なタイプの値とは異なり、この値のコピーは実際にはポインタであり、このポインタはスタックに記憶されているオブジェクトを指す.例えば:
var persons = new Object();
persons.name = "Oliver";
var child = persons;
document.write(child.name); //"Oliver"
コピー操作が終了すると、2つの変数が実際に同じオブジェクトを参照します.変数の一つを変更すると、他の変数に影響を与えます.
転送パラメータ
伝達パラメータ:関数外部の値を関数内部のパラメータにコピーします.実際には、値を一つの変数から別の変数にコピーするのと同じです.どうやって操作すればいいですか?
基本タイプの値をパラメータに伝えます.
基本型の値をパラメータに渡すと、転送された値が一部変数にコピーされます.例えば:
function add(x){
    x = x + 10;
    return x;
}
var num = 1;
document.write(num); //1
var result = add(num);
document.write(result); //11
xは実際に関数の局所変数であることが明らかになった.この変数を呼び出すと、numはパラメータとして関数に渡されます.この変数の値は1です.関数内部ではxは10を加えたが、この病気は外部のnumには影響しない.
簡単に言えば、numはパラメータxにコピーし、xは関数内部で局所変数であり、xがどのように変化してもnumの変化には影響しません.*
参照タイプの値をパラメータに渡す(パラメータは値によって伝達され、転送アドレス)
参照タイプの値をパラメータに渡すと、この値はメモリ内のアドレスをローカル変数にコピーしますので、このローカル変数の変化は関数の外部に反映されます.例えば:
function set(obj){
    obj.name = "Oliver";
}
var persons = new Object();
set(persons);
document.write(persons.name); //"Oliver"
しかし
しかし
しかし
注意しなければならないのはパラメータです.はい押す!引きます!使え伝えますはいはい
この例を見てください.

function set(obj){
    obj.name = "Oliver";
    obj = new Object();
    obj.name = "Troy"
    document.write(obj.name); //"Troy"
}
var persons = new Object();
set(persons);
document.write(persons.name); //"Oliver"
上記の説明では、関数内部でObjを書き換えると、この変数が参照されるのは、ローカルオブジェクトです.この局部的なオブジェクトは、関数の実行が完了したらすぐに破棄されます.これはなぜ関数内部でobj.nameの値が「Troy」に戻ったのですか?関数の外部がobj.nameの値を返したのは「Oliver」の原因です.
したがって、ローカルスコープで修正されたオブジェクトはグローバルスコープに反映されるが、パラメータが参照によって伝達されるということはまだ説明できない.
やはりその言葉です.気をつけてください.
パラメータが違いますはい押す!引きます!使え伝えますはいはい
検出タイプ
もちろん、基本データタイプを検出する場合、最適なツールはtypeofオペレータである.例えば:
var a = "abc";
var b = true;
var c = 21;
var d = null;
var e;
var f = new Object();
document.write(typeof a + "
"); //string document.write(typeof b + "
"); //boolean document.write(typeof c + "
"); //number document.write(typeof d + "
"); //object document.write(typeof e + "
"); //undefined document.write(typeof f + "
"); //object
参照タイプの値を検出する場合、最適なツールはinstanceofオペレータである.例えば:
var array = new Array;
document.write(array instanceof Array); //true;
var obj = new Object();
document.write(obj instanceof Array); //false;
document.write(obj instanceof Object); //true;
文法は:

result = variable instanceof constructor
すべての参照タイプの値はObjectの例です.したがって、参照タイプ値とObject構造の関数を検出すると、instanceofオペレータは常にtrueに戻ります.