仮引数を関数本体内で操作すると、実引数の変数に影響する場合の例。仮引数(参照型オブジェクト)のプロパティを変更するとそうなる。
参照型オブジェクトの場合、まず、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
// 参照型は、仮引数のプロパティ変更は実引数にも反映(というより同じオブジェクト)。
// 基本型は、そもそもプロパティ変更ができない。