仮引数の操作が実引数に影響しないケース

仮引数を関数本体内で操作しても、実引数の変数に影響しない場合の例。

変数それ自体を代入で変更したら他方には影響しない

まず、x = yの後、y = zとしても、xがzになるわけではないので、もはやxとyは別物。

// y = x の後、一方の変更が他方に影響するか?
let x, y

let 基本型 = ['もじ', 3.14, NaN, Infinity, true, false, undefined, null, Symbol('foo')]
let 参照型 = [{}, [], function() {}, /^abc$/, new String('abc'), new Number(3.14)]

let 全てそう = 基本型.concat(参照型).every((e) => {
  x = e
  y = x
  // オブジェクトのプロパティではなく、変数自体に代入
  y = 'y自体の変更'
  return x !== y // xとyは別のものを指すことになる
})
console.log(全てそう) // true

// 一方を「それ自体」を代入で変えても他方に影響ないのは、基本型も参照型も同じ。

仮引数と実引数の関係でも同様

仮引数でも同様で、関数本体内で仮引数 = 他オブジェクトとすると、仮引数は実引数とは縁が切れるのであって、実引数に変更が加わるわけではない。

// 仮引数の変更が実引数に影響するか?
function 変更(仮引数) {
  仮引数 = 'それ自体の変更'
  return 仮引数
}

let 基本型 = ['もじ', 3.14, NaN, Infinity, true, false, undefined, null, Symbol('foo')]
let 参照型 = [{}, [], function() {}, /^abc$/, new String('abc'), new Number(3.14)]

let 実引数
let 全てそう = 基本型.concat(参照型).every((e) => {
  実引数 = e
  return 実引数 !== 変更(実引数) // 実引数と仮引数は別物になっている
})
console.log(全てそう) // true

// 仮引数を「それ自体」を代入で変えても実引数に影響ないのは、基本型も参照型も同じ。