趣味的なIT・ネットの話題

Raspberry PiでIoTなIT:Javascriptではプリミティブ値の状態では参照渡しができない

手抜きですがコード内のコメントが記事です。Javascriptではプリミティブ値の状態で参照渡しを強制することができないのですね。Cなら簡単なのに。Javascriptで仕様的に無理なので、Typescriptでも無理なんでしょう。

そのためオブジェクトが入る変数が初期化されているかを、参照代入先で判定するには、工夫が要ります。

//参照渡しとifの実験

//Javascriptでifの判定で偽となるのは以下の場合のみ
//数値 0、NaN
//null
//undifined
//空文字列

//空のオブジェクト
var testobject1:{} = {};
//結果はtrue
console.log('testobject1');
if (testobject1){
  console.log('true');
} else {
  console.log('false');
}

//空でもtrueになってしまうので
//オブジェクトに初期化されているかの判定用の要素を持たせる
var testobject2 = {initialized:false};
console.log('testobject2');
//結果はfalse
if (testobject2.initialized){
  console.log('true');
} else {
  console.log('false');
}

//それではこのオブジェクトの参照渡しはできるのか
var testobject3 = {flag:false};
//できない
//testobject2 = testobject3;
//Typescriptだと一定のオブジェクトとして初期化されていると型が合わないオブジェクトは代入できない
//is not assignable toになる

//値渡しで代入した後、オブジェクトを代入したら参照渡し扱いに変更されるのか
//されない
var testobject4:any = null;
var testobject5:any;
testobject5 = testobject4;
console.log('nullはプリミティブ型なので値渡し');
console.log('testobject5');
if (testobject5){
  console.log('true');
} else {
  console.log('false');
}
testobject4 = {init:true};
//testobject5 = testobject4;
console.log('もともと値渡しされていたので参照されていないから代入元を変更しても反映しない');
console.log('testobject5');
//こう書こうとしても構文的にエラーになる
//if (testobject5.init){
if (testobject5){
  console.log('true');
} else {
  console.log('false');
}
//testobject4 = {init:true};
console.log('そこでもう一度最初からオブジェクトを代入');
testobject5 = testobject4;
console.log('testobject5');
if (testobject5.init){
  console.log('true');
} else {
  console.log('false');
}
console.log('すると参照元を変更すると代入先に反映される');
testobject4.init = false;
console.log('testobject5');
if (testobject5.init){
  console.log('true');
} else {
  console.log('false');
}
console.log('ただし代入元のプロパティを変えるのでは無く新たにオブジェクトとして定義すると、参照として代入した先には反映されない');
testobject4 = {init:true};
console.log('testobject5');
if (testobject5.init){
  console.log('true');
} else {
  console.log('false');
}





;

 


Facebooktwitterpinterestlinkedinmail
納得したらすぐにシェア!