JavaScript における「数値(Numbers)」と「文字列(Strings)」の扱いを、できるだけ初心者向けに順を追って説明する。
概観:なぜ「数値」と「文字列」が大事か
プログラミングでは、「数」を扱いたい時と「文字や文章(テキスト)」を扱いたい時が出てくる。
JavaScript では、それらにはそれぞれ専用のデータ型(型)があって、扱い方・注意点があるんだ。
この章では、
- 数値の表現・制限、数値用の便利な機能
- 文字列の表現・操作、テンプレート文字列(埋め込み可能な文字列)
を見ていこう。
数値(Number)
基本的な特徴
- JavaScript の標準数値型(
Number)は、 64ビット倍精度浮動小数点(IEEE 754 形式)で表現される。
→ すべての数はこの形式で扱われる。 - つまり、整数も小数も同じ型で扱われる、という点が他の言語と少し異なるところ。
この方式ゆえに、非常に大きな整数や非常に小さな小数を扱うと精度の限界が出やすいことも覚えておこう。
特殊な値:Infinity, -Infinity, NaN
Number 型には、通常の「ある数」以外にも、次のような特別な値がある。
| 値 | 意味 |
|---|---|
Infinity | 正の無限大。超大きな数を計算した時などに出る。 |
-Infinity | 負の無限大。 |
NaN | 「Not a Number」の略。数として意味を持たない値(計算できないもの)を表す。 |
数値リテラルの書き方(記述方法)
数を書く方法にもいくつかスタイルがある(リテラルと呼ばれる書き方)。以下の形式が使える。
- 10 進数(通常の書き方)
例:123,42,3.14など - 2 進数 (binary)
接頭辞に0bまたは0Bを付ける。
例:0b1010は 10 進で 10 に相当。 - 8 進数 (octal)
接頭辞に0oまたは0Oを使う。
例:0o755 - 16 進数 (hexadecimal)
接頭辞に0xまたは0X。
例:0xFF,0x1A3 - 指数表記(科学的記数法)
たとえば1e3は 1000(1 × 10³)、5e-2は 0.05(5 × 10⁻²)など。
これらの形式を使って、プログラム内でさまざまな数値を表現できる。
Number オブジェクトとそのプロパティ・メソッド
Number は型だけじゃなくて、いろんな便利な定数や関数が付属してるオブジェクトとしても使える。たとえば:
Number.MAX_VALUE:扱える最大の正の数Number.MIN_VALUE:扱える最小の正の数(0 に最も近い正の数)Number.MAX_SAFE_INTEGER:安全に整数として扱える最大値Number.MIN_SAFE_INTEGER:安全に整数として扱える最小値
「安全に扱える (safe)」というのは、整数として計算するときに誤差なく正しく扱える範囲という意味。
また、いくつかのメソッドも備えている:
Number.parseInt(...),Number.parseFloat(...):文字列を数値に変換Number.isFinite(...),Number.isInteger(...),Number.isNaN(...)など:数値かどうか、整数かどうか、NaN かどうかをチェック
さらに、個々の数値(プリミティブな number)にも、メソッドとして働く関数がある(toFixed(), toExponential(), toPrecision() など)。
BigInt(長整数型)
Number では ±2⁵³−1 を超える整数を正確に扱えない制限がある
そのため、整数として非常に大きな値を扱いたいとき用に、 BigInt という型が別にある。
例:
const big1 = 123n;
const big2 = BigInt("9007199254740993");
JavaScriptただし、BigInt は小数を扱えない、Math オブジェクトの関数が使えない(たとえば Math.sqrt(big) は使えない)といった制限もあるから、用途をよく考えて使おう。
文字列(String)
文字列は、テキスト情報を扱うための型。たとえば「Hello, world」や「こんにちは」がこれにあたる。
文字列の表現(リテラル)
文字列の書き方にはいくつか選べる:
- シングルクォート(
'…') - ダブルクォート(
"…") - バッククォート(
`…`:テンプレートリテラル) ← これは特別な機能あり(後で説明)
たとえば:
let s1 = 'hello';
let s2 = "こんにちは";
JavaScript文字列の中で、引用符と区別するためにバックスラッシュ \ を使って「エスケープシーケンス」を扱う。例:\n(改行)、\uXXXX(Unicode 表現)など。
文字列の長さとインデックス
- 文字列は「文字の並び」で、中の文字にはインデックス(0,1,2…)でアクセスできる。
- 長さ(文字数)は
.lengthプロパティで得られる。
例:
let s = "JavaScript";
console.log(s.length); // 10
console.log(s[0]); // "J"
console.log(s[4]); // "S"
JavaScript文字列を調べる・検索するメソッド
文字列を操作したり情報を得たりするメソッドがたくさん用意されてる。たとえば:
indexOf(...)/lastIndexOf(...):文字や部分文字列が最初/最後に現れる位置includes(...):ある文字列が含まれるかどうかstartsWith(...)/endsWith(...):先頭/末尾かどうかslice(...),substring(...),substr(...):部分文字列を取り出すsplit(...):文字列を区切って配列にするtrim(),trimStart(),trimEnd():前後の空白を除く
など。
文字列を変換・操作するメソッド
toUpperCase()/toLowerCase():大文字・小文字変換repeat(n):文字列を n 回繰り返した文字列を返すpadStart(...)/padEnd(...):指定の長さになるまで前または後ろに文字を付け足すconcat(...):複数の文字列をつなげる- 正規表現(
RegExp)や他の国際化機能(Intl)と組み合わせて使うことも多い
テンプレートリテラル(Template Literals)
テンプレートリテラルは、バッククォート `...` で囲む文字列で、通常の文字列より強力な機能を持つ。
主な特徴:
- 式の埋め込み
${...}の中に JavaScript の式を置くことができ、それが評価されて文字列に差し込まれる。
例:
let a = 5, b = 10;
console.log(`合計は ${a + b} です。`); // "合計は 15 です。"
JavaScript- 複数行の文字列をそのまま書ける
通常の文字列では改行を\nなどで書く必要があるけど、テンプレートリテラルなら改行そのまま使える。
例:
let text = `これは複数行の
文字列です。`;
JavaScript具体例で見てみよう
少しコード例を使って、「どういう場面でどの機能を使うか」を確認しよう。
// 数値の例
let x = 42;
let y = 3.14;
let z = 1e6; // 1000000
let b = 0b1010; // 10 を 2 進数で表記(0b 接頭辞)
// 特殊値
console.log(1 / 0); // Infinity
console.log(-1 / 0); // -Infinity
console.log("abc" * 2); // NaN
// BigInt の例
let big = 1234567890123456789012345n; // “n” をつけて BigInt
// big + 1 // OK
// big * 3 // OK
// big / 2 // 切り捨てになる(小数は扱えない)
// 文字列の例
let s = "Hello";
console.log(s.length); // 5
console.log(s[1]); // "e"
console.log(s.indexOf("l")); // 2
console.log(s.includes("lo")); // true
// 部分文字列
let sub = s.slice(1, 4); // "ell"
let arr = "a,b,c".split(","); // ["a", "b", "c"]
// 変換
console.log("Hello".toUpperCase()); // "HELLO"
// テンプレートリテラル
let name = "太郎";
let age = 20;
let msg = `名前は ${name}、年齢は ${age} 歳です。`;
console.log(msg);
// 複数行の例
let poem = `一行目
二行目
三行目`;
console.log(poem);
JavaScript