【JavaScript】値型と参照型 (Value Types and Reference Types)

Posted by

概要

本記事ではJavaScriptにおける値型(Value Types)と参照型(Reference Types)の違いを簡単に整理します。

値型(Value Types)

Number,Boolean,String,null,undefined,Symbolはプリミティブ型であり関数へは全て値型で渡されます。ここでのポイントは、Stringが値型で渡させるということとなります。他の言語では、Stringは一般的に参照型である場合が多いですが、JavaScriptでは値型なので注意が必要となります。値型で関数(fucntion)に渡させると、関数の中での変更は影響しないような挙動となります。
下記が簡単な例です。

var changeVal = function(num, str){
    num = 2;
    str = 'test2'
}

var num = 1;
var str = 'test1'

changeVal(num, str);

console.log(num); // 1
console.log(str); // test1

参照型(Reference Types)

Object,Array,Functionの型は、参照型で渡さます。ちなみに、ArrayやFunctionも大きく捉えるとObjectに含まれると考えられます。参照型で関数(fucntion)に渡させると、関数の中での変更は呼び出し元の変数にも影響するような挙動となります。
下記が簡単な例です。

var changeRef = function(obj){
    obj.num = 2;
    obj.str = 'test2'
}

var obj = {num : 1, str : 'test1'};

changeRef(obj);

console.log(obj.num); // 2
console.log(obj.str); // test2

まとめ

JavaScriptでは明示的に型を宣言しないので、他の言語ほど型を意識しないことが多いですがいわゆる値型と参照型での動作の違いが出てくるので、考慮した上で実装する必要はあります。

参考

Understand Value and Reference Types in JavaScript
https://www.zsoltnagy.eu/understand-value-and-reference-types-in-javascript/

Value types, reference types and scope in JavaScript
https://medium.com/@benastontweet/lesson-1b-javascript-fundamentals-380f601ba851