🗂

【JavaScript】型強制についてまとめてみた

に公開

はじめに

以下のコードで、文字列 pointsList を文字列から数値に変換して計算した結果を配列に格納しています。

function calcDistanceList(pointsList){
    return pointsList.map(function(str) {
        let arr = str.split("-");
        let res = Math.abs(arr[0] - arr[1]);
        return res;
    });
}

例えば、pointsList = ["100-200"] を入力として渡すと結果は以下のようになります。

出力結果
[ 100 ]

ここで、split() によって arr には配列で ["100", "200"]となることは想像できます。
しかし、実際の出力結果はいつの間にか数値型になっています。

このカラクリはJavaScriptの型強制という仕組みが関係しています。

この記事では型強制について簡単に解説していきます。

型強制 (Type coercion) とは

型強制 (Type coercion) は、あるデータ型から他のデータ型への値の自動的または暗黙の変換です (文字列から数値など)。
https://developer.mozilla.org/ja/docs/Glossary/Type_coercion より引用

JavaScriptには、演算子(この場合は-)が使われる際に、オペランドの型を自動的に変換する型強制という仕組みがあります。

arr[0] - arr[1] という引き算の演算子(-)が使われると、JavaScriptは自動的にこれらの文字列を数値として解釈しようとします。

この変換が成功すると、"100" - "50" は 100 - 50 と同じように計算され、結果は 50 となります。

注意点

明示的にNumber()関数を使わなくても、直感的に計算ができますが、予期せぬ結果を引き起こすこともあります。

例えば、"100" + "50" は文字列の結合として "10050" になる一方、"100" - "50" は数値の引き算として 50 になります。

また、コードを読んだ人が、暗黙的な型変換のルールをすべて把握していないと、処理の意図が理解しにくくなってしまう恐れもあります。

まとめ

JavaScriptには型強制という自動的に型を変換してくれる機能があります。
- が付いている場合には、文字列であっても自動的に数値に変換して計算できます。
しかし、これがときに予期せぬ結果を生んでしまうこともあるため、注意が必要ということがわかったと思います。

最後までお読みいただき、ありがとうございました。

参考URL

https://recursionist.io/dashboard/problems/554

https://developer.mozilla.org/ja/docs/Glossary/Type_coercion

Discussion