目次

JavaScript 型と変数

y2sunlight 2020-10-20

変数と定数

プログラミングに於ける式は、オペレータ(演算子)とオペランド(被演算子)によって構成されています。そして、オペランドは変数、定数とリテラルのいずれかに分類することができます。

変数と定数は使用する前に宣言しなくてはなりません(当然のことですが、リテラルに宣言は不要です)。但し、明示的にStrictモードを宣言しない場合は、非Strictモードとなり変数の宣言は免除されます。尚、非StrictモードはSloppy モードと呼ばれることもあります。

変数の宣言

構文

var 変数名 [= 初期値],; // ローカルスコープ、2重定義可能
let 変数名 [= 初期値],; // ブロックスコープ、2重定義禁止 [ES2015]

宣言で使用する var 命令または let 命令の違いについては、本編のJavaScript 変数のスコープを参照してください。

以下にいくつかの例を示します。

var foo = 1;
let bar = 1; 

変数が複数ある場合はカンマで区切って、次のように書くことができます。

var foo = 1, bar = 1;

定数の宣言

ES2015*2015以降では、定数を宣言するためのconst命令が利用できるようになりました。

const 定数名 =,;  // [ES2015]

const TAX_RATE = 0.1, PI = 3.14;


データ型

JavaScriptには以下の プリミティブ型 が存在します。

また、以下の 構造型 と呼ばれる型が存在します。

本章ではこれらのデータ型のうち プリミティブ型について説明し、構造型については他の章に譲ることにします。詳しくはMDNの以下の項を参照してください。


数値型 Number

JavaScriptの数値型は整数と浮動小数点数を区別しません。具体的にはIEEE754で定義された倍精度浮動小数点数を表します。

整数リテラル

0
123       // 先頭が0以外は10進数
0377      // 先頭が0の場合は8進数
0xCAFE91  // 先頭が0xの場合は16進数 

浮動小数点リテラル

3.14      // 小数点を含む数値
6.02e+23  // 指数部分を含む数値

Numberオブジェクト

JavaScript では Number 型以外にNumberオブジェクトが存在します。例えば以下の例を見てください。

let n1 = 123;
let n2 = new Number(123);

console.log(typeof(n1)); // number
console.log(typeof(n2)); // object

ここで変数 n1 は number 型ですが、n2 は Number オブジェクトになります。number型の変数にNumberオブジェクトのメソッドを適用すると暗黙的にnumber型からNumberオブジェクトへの変換が行われます。

let n = 1234.56;
console.log(n.toLocaleString());  // 1,234.56

この例では、変数 n は number 型ですが toLocaleString() が適用される前に Number オブジェクトへ暗黙的に変換されています。Numberオブジェクトについては本編の「JavaScript Numberオブジェクト」を参照してください。


長整数型 BigInt

bigint 型は number 型で表現できる最大の数(Number.MAX_SAFE_INTEGER)より大きな数について信頼性のある表現方法を提供します。

BigInt のリテラルは以下の様に末尾に n をつけて表します。

BigIntのリテラル

123n
3.14n

BigInt の使用例を以下に示します。

let n = Number.MAX_SAFE_INTEGER;

console.log(n);                // 9007199254740991
console.log(n * 10);           // 90071992547409900
console.log(BigInt(n) * 10n);  // 90071992547409910n

BigInt() 関数は bigint 型を生成します。この例で分かるように number 型は大きな整数の演算を行うと精度が損なわれますが、bigint 型では精度が保障されます。

bigint 型は number 型と異なり相補的なオブジェクトは存在しません。

let bn = 123n;
console.log(typeof(bn));  // bigint

bigint 型は他の型と演算することができません。bitint 型と number 型をまぜて演算したい場合はどちらかの型に明示的に型変換する必要があります。但し、この場合、bigint 型は number 型に型変換すると精度が落ちるのは言うまでもありません。

let bn = 123n;
let n = 123;
console.log(bn + BigInt(n)); // 246n


文字列型 String

文字列は英数字記号などの文字の並びのことです。JavaScriptでは文字列を扱うデータとして string 型があります。但し、他の言語で見られるようなひとつの文字データを表す型(例えば C/C++ の char型)は存在しません。

文字列型は内部的にユニコード(UTF-16)が使用されます。string 型のユニコードについては本編の「JavaScript Stringオブジェクト 文字コード」を参照して下さい。

文字列リテラル

'Hello'                    // シングルクォートで囲まれた 0 個以上の文字の並び
"3.14"                     // ダブルクォートで囲まれた 0 個以上の文字の並び
'name = "sato"'            // 文字列中にダブルクォートのある場合はシングルクォートで囲む
"I like O'Roilly's book."  // 文字列中にシングルクォートのある場合はダブルクォートで囲む

テンプレートリテラル

let name = 'sato';
let greeting = `Hello ${name}.
It's fine today.`;

上例の様にバッククォートで文字列を囲むと文字列リテラルを表すことができます。このようにES2015*2015からはPHP言語などのようなヒアドキュメント形式の文字列リテラルが使えるようになりました。この機能をテンプレートリテラルと呼びます。

テンプレートリテラルでは以下のことが出来ます。

詳しくはMDNをご覧ください。

エスケープシーケンス

JavaScriptでは他の言語と同様に文字列リテラル内でバックスラッシュを使用することにより、特別な文字を表現することが出来ます。これはエスケープシーケンスと呼ばれます。

コード出力
\n改行
\t水平タブ
\'シングルクォート
\“ダブルクォート
\7773桁の8進数
\x412桁の16進数
\u9ad8最大4桁の16進数で、UTF-16のコードポイント(U+0000 ~ U+ffff)を表す

UTF-16のコードポイントを使った例を以下に示します。

console.log("\u4f50\u85e4");  // 佐藤

Stringオブジェクト

JavaScriptでは string 型以外に Stringオブジェクトが存在します。例えば以下の例を見て下さい。

let s1 = "Hello";
let s2 = new String("Hello");

console.log(typeof(s1)); // string
console.log(typeof(s2)); // object

ここでは、変数 s1 は string ですが s2 は Stringオブジェクトになります。string 型の変数に Stringオブジェクトのメソッドを適用すると暗黙的に string 型から Stringオブジェクトへの変換が行われます。

let s = "HELLO";
console.log(s.toLowerCase());  // hello

この例では、変数 s は string 型ですが toLowerCase() が適用される前に Stringオブジェクトへ暗黙的に変換されています。Stringオブジェクトについては本編の「JavaScript Stringオブジェクト」を参照して下さい。

文字列の操作

JavaScriptでは文字列を結合する為の演算子として、数値と同様に、+ 演算子を適用することが出来ます。

let name = "sato";
console.log('Hello ' + name);  // Hello sato

文字列を操作するために、JavaScriptでは様々な関数が用意されています。

let str = "こんにちは。佐藤さん。";

console.log(str.length);          // 11
console.log(str.charAt(6));       // 佐
console.log(str.substring(6,8));  // 佐藤

上例であげたメソッド(またはプロパティ)は Stringオブジェクトのものです。先に述べたように string 型の変数に Stringオブジェクトのメソッド(プロパティ)を適用すると暗黙的な型変換が行われています。

Stringオブジェクトには文字列を操作するための基本的な多くのメソッドが含まれています。詳しくは本編の「JavaScript Stringオブジェクト」を参照して下さい。


論理型 Boolean

論理型は論理値を表す型です。論理値は真または偽のいずれかの値となります。これは以下のリテラルで表現します。

true  // 真
false // 偽

例えば次の例を見て下さい

a == 1;

この式は変数 a が 1 に等しいかどうかを調べ、そうである場合は true を、そうでない場合は false を真偽値として返します。

論理値は if文や while文などの制御構造で使うのが一般的です。

if (a == 1) {
    b = 1;
} else {
    b = 2;
}

Truthy と Falsy

JavaScriptでは C/C++ や PHP などと同様に if文などの条件部分の中で真偽値以外にもそれに準じた値を指定することができます。このような真偽値そちて扱われるものを Truthy(真として扱われる)または Falsy (偽として扱われる)と呼びます。

以下のものは Falsy として扱われます。

Falsy
論理値の偽false
数の00
非数(NaN)Nan
空の文字列''
ヌル値null
未定義値undefined

これ以外のものは全て Truthy として扱われます。

Truthy
論理値の真true
数の11
文字列の1'1'
文字列の0'0'
空の配列[]
空のオブジェクト{}

文字列の'0'や空の配列も Truthy な値なので注意して下さい。


シンボル型 Symbol


ヌル Null

null値は値が無いことを表す特殊な値です。考え方としては、null値はNull型の唯一の値という解釈もできます。またオブジェクト型としてオブジェクトが存在しないという意味づけをすることも出来ます。


未定義 Undefined

JavaScriptでは、null値以外に未定義(undefined値)という特殊な値もあります。undefined値は Undefined型の唯一の値です。

値が代入されていない変数の値は undefined値になります。例えば以下のような場合です。

let undefined_value;
let a = undefined_value;  // undefined値を受け取る


オブジェクト Object

本編の「JavaScript オブジェクトの基本」を参照してください。


関数 Function

本編の「JavaScript 関数の定義」を参照してください。