仮引数の操作が実引数に影響するケース

仮引数を関数本体内で操作すると、実引数の変数に影響する場合の例。仮引数(参照型オブジェクト)のプロパティを変更するとそうなる。

参照型オブジェクトのプロパティ変更は他方にも反映(どちらも同じオブジェクト)

参照型オブジェクトの場合、まず、x = yの後、y.プロパティ = zとすると、xとyは同じオブジェクトを指したままなので、x.プロパティもzとなる。

基本型オブジェクトはプロパティ変更ができない。

'use strict'

// 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 全てそう = 基本型.every((e) => {
  x = e
  y = x
  // strictモードでTypeError、strictでなくてもundefinedとnullはTypeError
  // y.状態 = '変更できず'
  return Object.isFrozen(x) // 基本型はオブジェクトの状態を変更できない。
})
console.log(全てそう) // true

全てそう = 参照型.every((e) => {
  x = e
  y = x
  // 変数ではなく、オブジェクトのプロパティに代入
  y.状態 = '内部状態の変更'
  // 参照型はオブジェクトの状態を変えられる。
  return !Object.isFrozen(x) && 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 全てそう = 参照型.every((e) => {
  実引数 = e
  // 参照型はオブジェクトの状態を変えられる。
  return !Object.isFrozen(実引数) && 実引数 === 変更(実引数) // 実引数と仮引数は同じオブジェクト
})
console.log(全てそう) // true

// 参照型は、仮引数のプロパティ変更は実引数にも反映(というより同じオブジェクト)。
// 基本型は、そもそもプロパティ変更ができない。