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

手抜きですがコード内のコメントが記事です。Javascriptではプリミティブ値の状態で参照渡しを強制することができないのですね。Cなら簡単なのに。Javascriptで仕様的に無理なので、Typescriptでも無理なんでしょう。そのためオブジェクトが入る変数が初期化されているかを、参照代入先で判定するには、工夫が要ります。

//参照渡しとifの実験//Javascriptでifの判定で偽となるのは以下の場合のみ//数値 0、NaN//null//undifined//空文字列//空のオブジェクトvar testobject1:{} = {};//結果はtrueconsole.log('testobject1');if (testobject1){  console.log('true');} else {  console.log('false');}//空でもtrueになってしまうので//オブジェクトに初期化されているかの判定用の要素を持たせるvar testobject2 = {initialized:false};console.log('testobject2');//結果はfalseif (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');};

 “””

コメントをどうぞ

メールアドレスが公開されることはありません。 が付いている欄は必須項目です