◆ 値への参照だけあれば十分で変数への参照はなくてもいい

ネイティブ系言語だったり なぜか PHP にある変数の参照機能
C などのポインタみたいなもの
無い言語使って全く困らないし要るのかな?

基本は変数に値への参照が入ってるので

a = {x: 1}
b = a

は a に入ってるオブジェクトへの参照が b にも入ってる状態

この後で

a = {y: 2}

にしても b は変わらない
a に入ってる参照が新しいオブジェクトになっただけ

これが変数自体を参照してる場合は b にも影響する
代入してない変数まで勝手に変わるのは混乱の元なので 一見便利だけど使いたくない機能

変数の値が変わることを利用したものでは 関数に変数を渡して 関数内で受け取った引数を書き換えたら呼び出し元も更新する というのは見かけるけどやっぱり分かりづらい
複数の値を返せばいいし 返せない言語でもオブジェクトや配列やリストなど複合型にすれば実質複数の値を返せてる

参照がまったくないのは不便もあるけど 変数への参照がなくても値への参照を持ってるなら参照的なことはできる

a = {x: 1}
b = a
b.x = 2
a.x
// 2

これは a.x も b.x も両方とも変わる
a や b の変数に入ってる参照が同じで同じオブジェクトを参照してる
その同じものの中身を書き換えるのだから 両方とも変わる

これを使って オブジェクトを関数に渡して 関数内ではそのプロパティを書き換えてもらえば 引数に渡したものを書き換えることができる

また 引数で受け取った値を参照するときにプロパティを取り出してしまって それを使うと外部からの変更の影響を受けない
取り出さず オブジェクトのままで毎回プロパティアクセスすれば そのオブジェクトへの参照を共有してる別の箇所からプロパティが変更される場合にその変更を反映できる

function f(obj) {
const x = obj.x

setInterval(() => {
console.log("x", x)
console.log("obj.x", obj.x)
}, 1000)
}

value = {x: 1}
f(value)

setInterval(() => {
value.x++
}, 2000)
x 1
obj.x 1
x 1
obj.x 1
x 1
obj.x 2
x 1
obj.x 2
x 1
obj.x 3

値への参照を持つだけで十分で 変数への参照を持つなんてわかりづらさとバグのもとになる気しかしない