JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【JavaScript】Array.map(Number)で空白が0に変換される原因と対策を解説

まず、次のようなコードとその出力結果を見てください。なぜJavaScriptは文字列中の空白(" ")を0に変換してしまうのでしょうか?

const digify = (str) => {
    const parsedStr = [...str].map(Number)
    return parsedStr;
}
console.log(digify("778 858 7577"))

出力結果

[
  7, 7, 8, 0, 8,
  5, 8, 0, 7, 5,
  7, 7
]

文字列の中に本物の「0」も含まれている場合、この挙動は非常に紛らわしく、思わぬバグの原因になりかねません。

なぜ空白が0になるのか?

この現象が起こる理由は、Number関数による型変換の仕様にあります。Number()は引数を数値へ変換する際、ECMAScriptで定義されたToNumberアルゴリズムに従って処理を行います。そしてこのアルゴリズムでは、空文字列("")や空白のみで構成される文字列(" ")は数値の0として評価されることになっています。

つまり、map(Number)が文字列の各文字に対してNumber(" ")を実行した結果、空白ごとに0が返されるため、配列内のスペースがすべて0に置き換わってしまうのです。

実際、コンソールでNumber(" ")を実行してみると、0が返されることを確認できます。

対策:parseIntを使う

この直感に反する挙動を防ぎたい場合は、map()のコールバックを少し工夫しましょう。例えば、基数10を指定したparseIntを使う方法があります。

サンプルコード

const digify = (str) => {
    const parsedStr = [...str].map(i => parseInt(i, 10))
    return parsedStr;
}
console.log(digify("778 858 7577"))

parseIntは空白文字を数値として解釈できないため、その場合はNaNを返します。「数字ではないものはNaNになる」というのは、0に変換されるよりもはるかに論理的で直感的な動作と言えるでしょう。

出力結果

[
  7, 7, 8, NaN, 8,
  5, 8, NaN, 7, 5,
  7, 7
]

まとめ

  • map(Number)は空白文字を0に変換してしまう(ToNumberの仕様による)
  • parseInt(値, 10)を使えば、空白はNaNになり、意図しない0との混同を避けられる
  1. JavaScriptで配列をセット(Set)に変換する方法|new Set()の使い方を解説

    JavaScriptでは、new Set() コンストラクタを使うことで、配列を簡単にセット(Setオブジェクト)へ変換できます。セットは同じ値を自動的に1つだけ保持する性質を持つため、配列から重複した要素を取り除きたい場合にも非常に便利です。 配列をセットに変換するサンプルコード 以下は、ボタンをクリックすると配列がセットに変換されて表示される、完全なHTMLサンプルです。 <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport co

  2. JavaScriptで配列を空にする4つの方法【サンプルコード付きで解説】

    JavaScriptで配列を空にする方法は、主に4つあります。それぞれ動作の仕組みや特徴が異なるため、目的に応じて適切な方法を選ぶことが大切です。配列を空にする4つの方法新しい空の配列を代入する:配列変数に、新しく作成した空の配列を代入します。最もシンプルな方法ですが、元の配列を参照している他の変数が残る点には注意が必要です。lengthプロパティを使う:配列のlengthプロパティに0を設定するだけで、すべての要素を削除できます。高速で、元の配列への参照も維持されるため、実務で最もよく使われる方法のひとつです。popメソッドを使う:配列の要素数が0になるまで、popメソッドで末尾の要素を繰り