— 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の以下の項を参照してください。
JavaScriptの数値型は整数と浮動小数点数を区別しません。具体的にはIEEE754で定義された倍精度浮動小数点数を表します。
整数リテラル
0 123 // 先頭が0以外は10進数 0377 // 先頭が0の場合は8進数 0xCAFE91 // 先頭が0xの場合は16進数
浮動小数点リテラル
3.14 // 小数点を含む数値 6.02e+23 // 指数部分を含む数値
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 型は 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
文字列は英数字記号などの文字の並びのことです。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 | 水平タブ |
\' | シングルクォート |
\“ | ダブルクォート |
\777 | 3桁の8進数 |
\x41 | 2桁の16進数 |
\u9ad8 | 最大4桁の16進数で、UTF-16のコードポイント(U+0000 ~ U+ffff)を表す |
UTF-16のコードポイントを使った例を以下に示します。
console.log("\u4f50\u85e4"); // 佐藤
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オブジェクト」を参照して下さい。
論理型は論理値を表す型です。論理値は真または偽のいずれかの値となります。これは以下のリテラルで表現します。
true // 真 false // 偽
例えば次の例を見て下さい
a == 1;
この式は変数 a が 1 に等しいかどうかを調べ、そうである場合は true を、そうでない場合は false を真偽値として返します。
論理値は if文や while文などの制御構造で使うのが一般的です。
if (a == 1) { b = 1; } else { b = 2; }
JavaScriptでは C/C++ や PHP などと同様に if文などの条件部分の中で真偽値以外にもそれに準じた値を指定することができます。このような真偽値そちて扱われるものを Truthy(真として扱われる)または Falsy (偽として扱われる)と呼びます。
以下のものは Falsy として扱われます。
Falsy | |
論理値の偽 | false |
数の0 | 0 |
非数(NaN) | Nan |
空の文字列 | '' |
ヌル値 | null |
未定義値 | undefined |
これ以外のものは全て Truthy として扱われます。
Truthy | |
論理値の真 | true |
数の1 | 1 |
文字列の1 | '1' |
文字列の0 | '0' |
空の配列 | [] |
空のオブジェクト | {} |
文字列の'0'や空の配列も Truthy な値なので注意して下さい。
null値は値が無いことを表す特殊な値です。考え方としては、null値はNull型の唯一の値という解釈もできます。またオブジェクト型としてオブジェクトが存在しないという意味づけをすることも出来ます。
JavaScriptでは、null値以外に未定義(undefined値)という特殊な値もあります。undefined値は Undefined型の唯一の値です。
値が代入されていない変数の値は undefined値になります。例えば以下のような場合です。
let undefined_value; let a = undefined_value; // undefined値を受け取る
本編の「JavaScript オブジェクトの基本」を参照してください。
本編の「JavaScript 関数の定義」を参照してください。