現実世界のオブジェクト
現実世界では、オブジェクトとは家、車、人、動物などの物体のことです。
以下は車のオブジェクトの例です:
オブジェクト | プロパティ | メソッド |
---|---|---|
車 | car.name = Fiat car.model = 500 car.weight = 850kg car.color = white |
car.start() car.drive() car.brake() car.stop() |
現実世界の車には重量や色などのプロパティがあります:
car.name = Fiat, car.model = 500, car.weight = 850kg, car.color = white.
カー・オブジェクトも同じプロパティを持っていますが、その値は車ごとに異なります。
現実世界の車にはstartやstopといったメソッドがあります:
car.start(), car.drive(), car.brake(), car.stop().
カー・オブジェクトも同じメソッドを持っていますが、それらのメソッドは異なるタイミングで実行されます。
JavaScript変数はデータ値のコンテナです。
次のコードは、変数carに単純な値(Fiat)を割り当てます:
let car = "Fiat";
オブジェクトも変数です。ただし、オブジェクトには多くの値を含めることができます。
次のコードは、オブジェクトcarに多くの値(Fiat、500、white)を割り当てます:
const car = {type:"Fiat", model:"500", color:"white"};
Note:
オブジェクトをconstキーワードで宣言するのは一般的な慣習です。constを使用したオブジェクトの詳細については、JS Constの章を参照してください。
オブジェクトリテラルは波括弧{}の内部に名前と値のペアのリストです。
{firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"}
Note:
名前と値のペアはキーと値のペアとも呼ばれます。
オブジェクトリテラルはオブジェクト初期化子とも呼ばれます。
これらの例は、4つのプロパティを持つJavaScriptオブジェクトを作成します:
// オブジェクトを作成
const person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};
スペースと改行は重要ではありません。オブジェクト初期化子は複数行にまたがることができます:
// オブジェクトを作成
const person = {
firstName: "John",
lastName: "Doe",
age: 50,
eyeColor: "blue"
};
この例では空のJavaScriptオブジェクトを作成し、その後に4つのプロパティを追加します:
// オブジェクトを作成
const person = {};
// プロパティを追加
person.firstName = "John";
person.lastName = "Doe";
person.age = 50;
person.eyeColor = "blue";
この例では、new Object()を使用して新しいJavaScriptオブジェクトを作成し、その後に4つのプロパティを追加します:
// オブジェクトを作成
const person = new Object();
// プロパティを追加
person.firstName = "John";
person.lastName = "Doe";
person.age = 50;
person.eyeColor = "blue";
Note:
上記の例はまったく同じ動作をしますが、new Object()を使用する必要はありません。
可読性、シンプリシティ、実行速度のために、オブジェクトリテラルメソッドを使用します。
JavaScriptオブジェクト内の名前付き値はプロパティと呼ばれます。
プロパティ | 値 |
---|---|
firstName | John |
lastName | Doe |
age | 50 |
eyeColor | blue |
名前と値のペアはPHPの連想配列、Pythonの辞書、Cのハッシュテーブル、Javaのハッシュマップ、RubyとPerlのハッシュに似ています。
オブジェクトプロパティには2つの方法でアクセスできます:
person.lastName;
person["lastName"];
メソッドとはオブジェクト上で実行できるアクションです。
メソッドは、プロパティ値として保存された関数定義です。
プロパティ | 値 |
---|---|
firstName | John |
lastName | Doe |
age | 50 |
eyeColor | blue |
fullName | function() {return this.firstName + ” ” + this.lastName;} |
const person = {
firstName: "John",
lastName : "Doe",
id : 5566,
fullName : function() {
return this.firstName + " " + this.lastName;
}
};
上記の例では、thisはpersonオブジェクトを参照します:
JavaScriptでは、オブジェクトがキングです。
オブジェクトを理解すれば、JavaScriptを理解することができます。
オブジェクトはプロパティとメソッドのコンテナです。
プロパティはプリミティブ値、関数、または他のオブジェクトであることができます。
JavaScriptでは、ほとんど「すべて」がオブジェクトです。
プリミティブ値を除くすべてのJavaScriptの値はオブジェクトです。
プリミティブ値は、プロパティやメソッドを持たない値です。
3.14はプリミティブ値です。
プリミティブデータ型はプリミティブ値を持つデータです。
JavaScriptでは7種類のプリミティブデータ型が定義されています:
プリミティブ値は不変です(ハードコードされており、変更することができません)。
x = 3.14の場合、xの値を変更することはできますが、3.14の値を変更することはできません。
値 | 型 | 詳細 |
---|---|---|
“Hello” | string | “Hello”は常に”Hello”です。 |
3.14 | number | 3.14は常に3.14です。 |
true | boolean | trueは常にtrueです。 |
false | boolean | falseは常にfalseです。 |
null | null (object) | nullは常にnullです。 |
undefined | undefined | undefinedは常にundefinedです。 |
オブジェクトは可変です。参照によってアドレス指定され、値ではなく参照されます。
personがオブジェクトである場合、次のステートメントはpersonのコピーを作成しません:
const x = person;
xオブジェクトはpersonのコピーではありません。xオブジェクトはpersonそのものです。
xに対する変更は、personにも影響します:
// オブジェクトを作成
const person = {
firstName:"John",
lastName:"Doe",
age:50, eyeColor:"blue"
}
// コピーを作成
const x = person;
// 両方で年齢を変更
x.age = 10;
Note:
後の章でオブジェクトについてさらに詳しく学びます。
JavaScriptの関数は特定のタスクを実行するために設計されたコードブロックです。
JavaScriptの関数は、「何か」がそれを呼び出したときに実行されます。
// p1とp2の積を計算する関数
function myFunction(p1, p2) {
return p1 * p2;
}
JavaScriptの関数はfunctionキーワードで定義され、その後に名前が続き、その後に括弧 () が続きます。
関数名には、文字、数字、アンダースコア、ドル記号(変数と同じルール)を含めることができます。
括弧内には、カンマで区切られたパラメータ名を含めることができます:
function name(parameter1, parameter2, parameter3) {
// 実行されるコード
}
関数のパラメータは、関数定義の括弧 () 内にリストアップされます。
関数引数は、関数が呼び出されたときに関数によって受け取る値です。
関数の内部では、引数(パラメータ)はローカル変数として振る舞います。
関数の内部のコードは、「何か」が関数を呼び出すときに実行されます:
関数の呼び出しについては、後のチュートリアルでさらに詳しく学びます。
JavaScriptがreturn文に到達すると、関数の実行は停止します。
関数がステートメントから呼び出された場合、JavaScriptは呼び出しステートメントの後にコードを「返して」実行します。
関数はしばしば戻り値を計算します。戻り値は「呼び出し元」に「返されます」:
// 二つの数値の積を計算し、結果を返す関数
function myFunction(a, b) {
return a * b;
}
関数を使うことで、コードを再利用することができます。
同じコードを何度も使うことができます。
異なる引数を使って同じコードを使うことで、異なる結果を生成することができます。
()演算子は関数を呼び出します:
// 華氏から摂氏に変換する関数
function toCelsius(fahrenheit) {
return (5/9) * (fahrenheit-32);
}
let value = toCelsius(77);
不正確なパラメータで関数にアクセスすると、不正確な答えが返されることがあります:
// 華氏から摂氏に変換する関数
function toCelsius(fahrenheit) {
return (5/9) * (fahrenheit-32);
}
let value = toCelsius();
()なしで関数にアクセスすると、関数の結果ではなく関数そのものが返されます:
// 華氏から摂氏に変換する関数
function toCelsius(fahrenheit) {
return (5/9) * (fahrenheit-32);
}
let value = toCelsius;
上記の例からわかるように、toCelsiusは関数オブジェクトを参照し、toCelsius()は関数の結果を参照します。
関数は変数と同じように使うことができます。すべての種類の数式、代入、計算で使用することができます。
// 関数の戻り値を変数に格納する代わりに
let x = toCelsius(77);
let text = "気温は " + x + " 摂氏度です";
関数を直接、変数の値として使用することができます:
// 関数の戻り値を変数に格納する代わりに
let text = "気温は " + toCelsius(77) + " 摂氏度です";
関数については後のチュートリアルでさらに詳しく学びます。
JavaScriptの関数内で宣言された変数は、その関数にローカルになります。
ローカル変数はその関数内からしかアクセスできません。
// ここではcarNameを使用できません
function myFunction() {
let carName = "Volvo";
// ここではcarNameを使用できます
}
// ここではcarNameを使用できません
ローカル変数はその関数が開始されるときに作成され、関数が完了すると削除されます。
JavaScriptには8つのデータ型があります。
オブジェクトデータ型には組み込みオブジェクトとユーザー定義オブジェクトの両方が含まれます。
組み込みオブジェクトタイプには以下があります:
objects, arrays, dates, maps, sets, intarrays, floatarrays, promises など。
// 数値:
let length = 16;
let weight = 7.5;
// 文字列:
let color = "Yellow";
let lastName = "Johnson";
// 真偽値:
let x = true;
let y = false;
// オブジェクト:
const person = {firstName:"John", lastName:"Doe"};
// 配列オブジェクト:
const cars = ["Saab", "Volvo", "BMW"];
// 日付オブジェクト:
const date = new Date("2022-03-25");
JavaScriptの変数はどんな種類のデータも保持できます。
プログラミングにおいて、データ型は重要な概念です。
変数で操作するためには、その型についての知識が重要です。
データ型がなければ、コンピュータはこのような問題を安全に解決できません:
let x = 16 + "Volvo";
「16」と「Volvo」を足すことに何か意味があるでしょうか?エラーが発生するか、結果が出力されるでしょうか?
JavaScriptは上記の例を次のように扱います:
let x = "16" + "Volvo";
数値と文字列を足す場合、JavaScriptは数値を文字列として扱います。
let x = 16 + "Volvo";
let x = "Volvo" + 16;
JavaScriptは式を左から右に評価します。異なる順序で異なる結果が生じることがあります:
JavaScript:
let x = 16 + 4 + "Volvo";
結果:
20Volvo
JavaScript:
let x = "Volvo" + 16 + 4;
結果:
Volvo164
最初の例では、JavaScriptは「16」と「4」を数値として扱い、最後に「Volvo」に到達します。
2番目の例では、最初のオペランドが文字列であるため、すべてのオペランドが文字列として扱われます。
JavaScriptにはダイナミックなタイプがあります。これは同じ変数がさまざまなデータ型で使用できることを意味します:
let x; // 現在 x は未定義です
x = 5; // 現在 x は数値です
x = "John"; // 現在 x は文字列です
文字列(テキスト文字列)は「John Doe」のような文字の並びです。
文字列は引用符で書かれます。シングルクォートまたはダブルクォートのどちらかを使用できます:
// ダブルクォートを使用:
let carName1 = "Volvo XC60";
// シングルクォートを使用:
let carName2 = 'Volvo XC60';
文字列の中に引用符を使用することができますが、文字列を囲む引用符と一致していない必要があります:
// ダブルクォートの中にシングルクォートを使用:
let answer1 = "It's alright";
// ダブルクォートの中にシングルクォートを使用:
let answer2 = "He is called 'Johnny'";
// シングルクォートの中にダブルクォートを使用:
let answer3 = 'He is called "Johnny"';
後のチュートリアルで文字列についてさらに学びます。
すべてのJavaScriptの数値は10進数(浮動小数点数)として格納されます。
数値は小数点を伴うか、伴わないかで書かれます:
// 小数点あり:
let x1 = 34.00;
// 小数点なし:
let x2 = 34;
非常に大きな数や非常に小さな数は科学的な(指数)表記で書くことができます:
let y = 123e5; // 12300000
let z = 123e-5; // 0.00123
ほとんどのプログラミング言語には多くの数値型があります:
整数(整数):
byte (8ビット), short (16ビット), int (32ビット), long (64ビット)
実数(浮動小数点数):
float (32ビット), double (64ビット)
JavaScriptの数値は常に一つの型です:
double (64ビット浮動小数点数)
すべてのJavaScriptの数値は64ビット浮動小数点形式で格納されます。
JavaScriptのBigIntは通常のJavaScriptのNumberでは表現できない大きな整数値を格納するために使用される新しいデータ型(ES2020)です。
let x = BigInt("123456789012345678901234567890");
後のチュートリアルでBigIntについてさらに学びます。
真偽値はtrueまたはfalseの二つの値しか持つことができません。
let x = 5;
let y = 5;
let z = 6;
(x == y) // trueを返します
(x == z) // falseを返します
真偽値は条件テストでよく使用されます。
後のチュートリアルで真偽値についてさらに学びます。
JavaScriptの配列は角括弧で書かれます。
配列の要素はカンマで区切られます。
以下のコードは、三つのアイテム(車の名前)を含む配列「cars」を宣言(作成)します:
const cars = ["Saab", "Volvo", "BMW"];
配列のインデックスはゼロベースで、最初のアイテムが [0]、次が [1]、というようになります。
後のチュートリアルで配列についてさらに学びます。
JavaScriptのオブジェクトは波括弧 {} で書かれます。
オブジェクトのプロパティは名前と値のペアで書かれ、カンマで区切られます。
const person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};
上記の例のオブジェクト(person)には4つのプロパティがあります: firstName、lastName、age、eyeColor。
後のチュートリアルでオブジェクトについてさらに学びます。
JavaScriptのtypeof演算子を使用して、JavaScript変数の型を調べることができます。
typeof演算子は変数または式の型を返します:
typeof "" // "string"を返します
typeof "John" // "string"を返します
typeof "John Doe" // "string"を返します
typeof 0 // "number"を返します
typeof 314 // "number"を返します
typeof 3.14 // "number"を返します
typeof (3) // "number"を返します
typeof (3 + 4) // "number"を返します
後のチュートリアルでtypeofについてさらに学びます。
JavaScriptでは、値がない変数は値として「未定義(undefined)」を持ちます。その型も未定義です。
let car; // 値は未定義、型は未定義です
どんな変数でも値を「未定義」に設定することで空にすることができます。その型も未定義になります。
car = undefined; // 値は未定義、型は未定義です
空の値は「未定義」とは異なります。
空の文字列は有効な値としても型があります。
let car = ""; // 値は ""、typeof は "string"です
JavaScriptの代入演算子は、JavaScriptの変数に値を代入します。
演算子 | 例 | 同等の式 |
---|---|---|
= | x = y | x = y |
+= | x += y | x = x + y |
-= | x -= y | x = x – y |
*= | x *= y | x = x * y |
/= | x /= y | x = x / y |
%= | x %= y | x = x % y |
**= | x **= y | x = x ** y |
演算子 | 例 | 同等の式 |
---|---|---|
<<= | x <<= y | x = x << y |
>>>= | x >>= y | x = x >> y |
>>>= | x >>>= y | x = x >>> y |
演算子 | 例 | 同等の式 |
---|---|---|
&= | x &= y | x = x & y |
^= | x ^= y | x = x ^ y |
|= | x |= y | x = x | y |
演算子 | 例 | 同等の式 |
---|---|---|
&&= | x &&= y | x = x && (x = y) |
||= | x ||= y | x = x || (x = y) |
??= | x ??= y | x = x ?? (x = y) |
論理代入演算子はES2020で導入されました。
単純代入演算子(=)は変数に値を代入します。
let x = 10;
let x = 10 + y;
加算代入演算子(+=)は変数に値を加算します。
let x = 10;
x += 5;
let text = "Hello"; text += " World";
減算代入演算子(-=)は変数から値を減算します。
let x = 10;
x -= 5;
乗算代入演算子(*=)は変数を乗算します。
let x = 10;
x *= 5;
累乗代入演算子(**=)は変数を指数にします。
let x = 10;
x **= 5;
除算代入演算子(/=)は変数を除算します。
let x = 10;
x /= 5;
剰余代入演算子(%=)は変数に剰余を代入します。
let x = 10;
x %= 5;
左シフト代入演算子(<<=)は変数を左シフトします。
let x = -100;
x <<= 5;
右シフト代入演算子(>>=)は変数を右シフトします(符号付き)。
let x = -100;
x >>= 5;
符号なし右シフト代入演算子(>>>=)は変数を右シフトします(符号なし)。
let x = -100;
x >>>= 5;
ビット AND 代入演算子(&=)は二つのオペランドに対してビット AND 演算を行い、その結果を変数に代入します。
let x = 10;
x &= 5;
ビット OR 代入演算子(|=)は二つのオペランドに対してビット OR 演算を行い、その結果を変数に代入します。
let x = 10;
x |= 5;
ビット XOR 代入演算子(^=)は二つのオペランドに対してビット XOR 演算を行い、その結果を変数に代入します。
let x = 10;
x ^= 5;
論理 AND 代入演算子(&&=)は二つの値の間で使用されます。最初の値が true の場合、二つ目の値が代入されます。
let x = 10;
x &&= 5;
&&= 演算子はES2020の機能です。
論理 OR 代入演算子(||=)は二つの値の間で使用されます。最初の値が false の場合、二つ目の値が代入されます。
let x = 10;
x ||= 5;
||= 演算子はES2020の機能です。
Nullish coalescing 代入演算子(??=)は二つの値の間で使用されます。最初の値が undefined または null の場合、二つ目の値が代入されます。
let x;
x ??= 5;
??= 演算子はES2020の機能です。
JavaScriptの算術演算子は、数値(リテラルまたは変数)に対して算術演算を行います。
演算子 | 説明 |
---|---|
+ | 加算 |
– | 減算 |
* | 乗算 |
** | 指数化(ES2016) |
/ | 除算 |
% | 剰余(除算の余り) |
++ | インクリメント |
— | デクリメント |
典型的な算術演算は、通常2つの数値に対して行われます。
数値はリテラルである場合もあります:
let x = 100 + 50;
また、変数である場合もあります:
let x = a + b;
また、式で演算することもできます:
let x = (100 + 50) * a;
算術演算における数値は、オペランドと呼ばれます。オペランド間で行われる操作は演算子によって定義されます。
例えば、次のようになります:
100 + 50
この場合、100と50がオペランドであり、+が演算子です。
加算演算子(+)は数値を加算します:
let x = 5;
let y = 2;
let z = x + y;
減算演算子(-)は数値を減算します:
let x = 5;
let y = 2;
let z = x - y;
乗算演算子(*)は数値を乗算します:
let x = 5;
let y = 2;
let z = x * y;
除算演算子(/)は数値を除算します:
let x = 5;
let y = 2;
let z = x / y;
剰余演算子(%)は、除算の余りを返します:
let x = 5;
let y = 2;
let z = x % y;
算術演算において、整数の除算は商と余りを返します。
数学的には、モジュロ演算の結果は算術的な除算の余りです。
インクリメント演算子(++)は数値を増加させます:
let x = 5;
x++;
let z = x;
デクリメント演算子(–)は数値を減少させます:
let x = 5;
x--;
let z = x;
指数化演算子(**)は、第1オペランドを第2オペランドの累乗にします:
let x = 5;
let z = x ** 2;
x ** y は、Math.pow(x,y) と同じ結果を返します:
let x = 5;
let z = Math.pow(x,2);
演算子の優先順位は、算術式で操作が行われる順序を示します。
例えば、次のような演算がある場合:
let x = 100 + 50 * 3;
上記の例の結果は、150 * 3 と同じでしょうか、それとも 100 + 150 と同じでしょうか?
加算か乗算が最初に行われるのでしょうか?
伝統的な学校の数学と同様に、乗算が最初に行われます。
乗算 (*) および除算 (/) は、加算 (+) および減算 (-) よりも優先度が高くなります。
そして(学校の数学と同様に)、括弧を使用することで優先順位を変更することができます。
括弧を使用すると、括弧内の演算が最初に計算されます:
let x = (100 + 50) * 3;
優先順位が同じ演算子が多数存在する場合(加算と減算、または乗算と除算など)、左から右へと計算されます:
例:
let x = 100 + 50 - 3;
let x = 100 / 50 * 3;
JavaScriptの演算子は、さまざまな数学的および論理的な計算を実行するために使用されます。
代入演算子(=)は変数に値を代入します:
let x = 10;
// xに値5を代入
let x = 5;
// yに値2を代入
let y = 2;
// zにx + yの値を代入
let z = x + y;
加算演算子(+)は数値を加算します:
let x = 5;
let y = 2;
let z = x + y;
乗算演算子(*)は数値を乗算します:
let x = 5;
let y = 2;
let z = x * y;
JavaScriptにはさまざまな種類の演算子があります:
算術演算子は数値に対して算術演算を行います:
let a = 3;
let x = (100 + 50) * a;
演算子 | 説明 |
---|---|
+ | 加算 |
– | 減算 |
* | 乗算 |
** | 指数化(ES2016) |
/ | 除算 |
% | 剰余(除算の余り) |
++ | インクリメント |
— | デクリメント |
注意: 算術演算子についての詳細は、JS Arithmetic 章で説明されています。
代入演算子はJavaScript変数に値を代入します。
加算代入演算子(+=)は変数に値を追加します。
let x = 10;
x += 5;
演算子 | 例 | 同じ意味 |
---|---|---|
= | x = y | x = y |
+= | x += y | x = x + y |
-= | x -= y | x = x – y |
* | x *= y | x = x * y |
/ | x /= y | x = x / y |
% | x %= y | x = x % y |
**= | x **= y | x = x ** y |
注意: 代入演算子についての詳細は、JS Assignment 章で説明されています。
演算子 | 説明 |
---|---|
== | 等しい |
=== | 値と型が等しい |
!= | 等しくない |
!== | 値または型が等しくない |
> | より大きい |
< | より小さい |
>= | 以上 |
<= | 以下 |
? | 三項演算子 |
注意: 比較演算子についての詳細は、JS Comparisons 章で説明されています。
上記のすべての比較演算子は、文字列に対しても使用できます:
let text1 = "A";
let text2 = "B";
let result = text1 < text2;
文字列は辞書順に比較されます:
let text1 = "20";
let text2 = "5";
let result = text1 < text2;
+ は文字列を追加(連結)するためにも使用されます:
let text1 = "John";
let text2 = "Doe";
let text3 = text1 + " " + text2;
+= 代入演算子も文字列を追加(連結)するために使用できます:
let text1 = "とても素敵な ";
text1 += "良い日";
text1 の結果は次のとおりになります:
とても素敵な 良い日
注意: 文字列に使用される + 演算子は、連結演算子と呼ばれます。
2つの数値を加算すると、合計が返されますが、数値と文字列を加算すると文字列が返されます:
let x = 5 + 5;
let y = "5" + 5;
let z = "Hello" + 5;
x, y, z の結果は次のとおりです:
10
55
Hello5
注意: 数値と文字列を加算すると、結果は文字列になります!
演算子 | 説明 |
---|---|
&& | 論理積 |
|| | 論理和 |
! | 論理否定 |
注意: 論理演算子についての詳細は、JS Comparisons 章で説明されています。
演算子 | 説明 |
---|---|
typeof | 変数の型を返します |
instanceof | オブジェクトがオブジェクト型のインスタンスである場合、true を返します |
注意: 型演算子についての詳細は、JS Type Conversion 章で説明されています。
ビット演算子は32ビットの数値に対して動作します。
操作の中で数値のオペランドは32ビットの数値に変換されます。結果はJavaScript数値に変換されます。
演算子 | 説明 | 例 | 同じ意味 | 結果 | 10進数 |
---|---|---|---|---|---|
& | AND | 5 & 1 | 0101 & 0001 | 0001 | 1 |
| | OR | 5 | 1 | 0101 | 0001 | 0101 | 5 |
~ | NOT | ~ 5 | ~0101 | 1010 | 10 |
^ | XOR | 5 ^ 1 | 0101 ^ 0001 | 0100 | 4 |
<< | 左シフト | 5 << 1 | 0101 << 1 | 1010 | 10 |
>> | 右シフト | 5 >> 1 | 0101 >> 1 | 0010 | 2 |
>>> | 符号なし右シフト | 5 >>> 1 | 0101 >>> 1 | 0010 | 2 |
上記の例は4ビットの符号なしの例ですが、JavaScriptでは32ビットの符号付き数値を使用します。
このため、JavaScriptでは ~ 5 は10を返しません。-6 を返します。
~00000000000000000000000000000101 は 11111111111111111111111111111010 を返します。
const キーワードは ES6(2015年)で導入されました。
const で定義された変数は再宣言できません。
const で定義された変数は再代入できません。
const で定義された変数はブロックスコープを持ちます。
const キーワードで定義された変数は再代入できません:
const PI = 3.141592653589793;
PI = 3.14; // これはエラーになります
PI = PI + 10; // これもエラーになります
JavaScript の const 変数は宣言時に値を代入する必要があります:
正しい:
const PI = 3.14159265359;
間違い:
const PI;
PI = 3.14159265359;
値が変更されるべきでないことが明確な場合には常に const で変数を宣言します。
const を使用して宣言する場合:
const キーワードは少し誤解を招くことがあります。
それは定数値を定義するのではなく、値への定数参照を定義します。
そのため、次の操作はできません:
しかし、次の操作はできます:
定数配列の要素を変更することができます:
// 定数配列を作成できます:
const cars = ["Saab", "Volvo", "BMW"];
// 要素を変更できます:
cars[0] = "Toyota";
// 要素を追加できます:
cars.push("Audi");
しかし、配列を再代入することはできません:
const cars = ["Saab", "Volvo", "BMW"];
cars = ["Toyota", "Volvo", "Audi"]; // エラー
定数オブジェクトのプロパティを変更することができます:
// 定数オブジェクトを作成できます:
const car = {type:"Fiat", model:"500", color:"white"};
// プロパティを変更できます:
car.color = "red";
// プロパティを追加できます:
car.owner = "Johnson";
しかし、オブジェクトを再代入することはできません:
const car = {type:"Fiat", model:"500", color:"white"};
car = {type:"Volvo", model:"EX60", color:"red"}; // エラー
var、let、const の違い
スコープ | 再宣言 | 再代入 | 巻き上げ | thisにバインド |
---|---|---|---|---|
var | No | Yes | Yes | Yes |
let | Yes | No | Yes | No |
const | Yes | No | No | No |
let と const はブロックスコープを持ちます。
let と const は再宣言できません。
let と const は使用する前に宣言しなければなりません。
let と const は this にバインドしません。
let と const は巻き上げされません。
Internet Explorer 11以前では let と const キーワードはサポートされていません。
最初の完全なサポートが始まったブラウザのバージョンに関する情報は以下の表をご参照ください:
Chrome 49 | Edge 12 | Firefox 36 | Safari 11 | Opera 36 |
---|---|---|---|---|
2016年3月 | 2015年7月 | 2015年1月 | 2017年9月 | 2016年3月 |
const キーワードで変数を宣言する場合、ブロックスコープに関しては let と類似しています。
この例では、ブロック内で宣言された x と、ブロック外で宣言された x は異なります:
const x = 10;
// ここでは x は 10 です
{
const x = 2;
// ここでは x は 2 です
}
// ここでは x は 10 です
JavaScript の var 変数を再宣言することはプログラムのどこでも許可されています:
var x = 2; // 許可されています
var x = 3; // 許可されています
x = 4; // 許可されています
既存の var 変数または let 変数を同じスコープで const に再宣言することは許可されません:
var x = 2; // 許可されています
const x = 2; // 許可されていません
{
let x = 2; // 許可されています
const x = 2; // 許可されていません
}
{
const x = 2; // 許可されています
const x = 2; // 許可されていません
}
既存の const 変数を同じスコープで再代入することは許可されません:
const x = 2; // 許可されています
x = 2; // 許可されていません
var x = 2; // 許可されていません
let x = 2; // 許可されていません
const x = 2; // 許可されていません
{
const x = 2; // 許可されています
x = 2; // 許可されていません
var x = 2; // 許可されていません
let x = 2; // 許可されていません
const x = 2; // 許可されていません
}
var で定義された変数はプログラムの先頭に巻き上げられ、いつでも初期化できます。
つまり、宣言する前に変数を使用することができます:
// これはOKです:
carName = "Volvo";
var carName;
巻き上げされた const 変数もプログラムの先頭に巻き上げられますが、初期化はされません。
つまり、宣言する前に const 変数を使用すると ReferenceError が発生します:
alert (carName);
const carName = "Volvo";
let キーワードは ES6(2015年)で導入されました。
let で宣言された変数はブロックスコープを持ちます。
let で宣言された変数は使用する前に宣言されなければなりません。
let で宣言された変数は同じスコープ内で再宣言することはできません。
ES6(2015年)以前、JavaScriptにはブロックスコープがありませんでした。
JavaScriptにはグローバルスコープと関数スコープがありました。
ES6では、let と const という2つの新しいキーワードが導入され、JavaScriptにブロックスコープを提供しました:
{
let x = 2;
}
// ここでは x を使用できません
var で宣言された変数は常にグローバルスコープを持ちます。
var キーワードで宣言された変数はブロックスコープを持つことができません:
{
var x = 2;
}
// ここでは x を使用できます
let で定義された変数は再宣言できません。
let で宣言された変数を再宣言することはありません。
let を使用すると、次のようにできません:
let x = "John Doe";
let x = 0;
var で定義された変数は再宣言できます。
var を使用すると、次のようにできます:
var x = "John Doe";
var x = 0;
var キーワードを使用して変数を再宣言すると問題が発生することがあります。
ブロック内で変数を再宣言すると、ブロック外の変数も再宣言されます:
var x = 10;
// ここでは x は 10 です
{
var x = 2;
// ここでは x は 2 です
}
// ここでは x は 2 です
let キーワードを使用して変数を再宣言すると、この問題を解決できます。
ブロック内で変数を再宣言しても、ブロック外の変数は再宣言されません:
let x = 10;
// ここでは x は 10 です
{
let x = 2;
// ここでは x は 2 です
}
// ここでは x は 10 です
スコープ | 再宣言 | 再代入 | 巻き上げ | thisにバインド |
---|---|---|---|---|
var | No | Yes | Yes | Yes |
let | Yes | No | Yes | No |
const | Yes | No | No | No |
let と const はブロックスコープを持ちます。
let と const は再宣言できません。
let と const は使用する前に宣言しなければなりません。
let と const は this にバインドしません。
let と const は巻き上げされません。
let と const はブロックスコープを持ちます。
let と const は再宣言できません。
let と const は使用する前に宣言しなければなりません。
let と const は this にバインドしません。
let と const は巻き上げされません。
Internet Explorer 11以前では let と const キーワードはサポートされていません。
最初の完全なサポートが始まったブラウザのバージョンに関する情報は以下の表をご参照ください:
Chrome 49 | Edge 12 | Firefox 36 | Safari 11 | Opera 36 |
---|---|---|---|---|
2016年3月 | 2015年7月 | 2015年1月 | 2017年9月 | 2016年3月 |
var を使用して JavaScript 変数を再宣言することはプログラムのどこでも許可されています:
var x = 2;
// ここで x は 2 です
var x = 3;
// ここで x は 3 です
let を使用すると、同じブロック内での変数の再宣言は許可されません:
var x = 2; // 許可されています
let x = 3; // 許可されていません
{
let x = 2; // 許可されています
let x = 3; // 許可されていません
}
{
let x = 2; // 許可されています
var x = 3; // 許可されていません
}
var で定義された変数は先頭に巻き上げられ、いつでも初期化できます。
これはOKです:
carName = "Volvo";
var carName;
let で定義された変数もブロックの先頭に巻き上げられますが、初期化されません。
つまり、let 変数を宣言する前に使用すると ReferenceError が発生します:
carName = "Saab";
let carName = "Volvo";
変数はデータを格納するためのコンテナです。JavaScriptでは4つの方法で変数を宣言できます:
// 見出しを変更する:
document.getElementById("myH").innerHTML = "My First Page";
変数を使用する前に宣言することが良いプログラミングの慣習とされています。
例から推測できるように:
var x = 5;
var y = 6;
var z = x + y;
1995年から2015年までのすべてのJavaScriptコードで var キーワードが使用されていました。
2015年に let および const キーワードがJavaScriptに追加されました。
var キーワードは古いブラウザ向けに書かれたコードでのみ使用すべきです。
let x = 5;
let y = 6;
let z = x + y;
const x = 5;
const y = 6;
const z = x + y;
混在した例
const price1 = 5;
const price2 = 6;
let total = price1 + price2;
price1 と price2 の2つの変数は const キーワードで宣言されています。これらは定数の値であり、変更することはできません。
total 変数は let キーワードで宣言されています。その値は変更可能です。
代数と同様に、変数は値を保持します:
let x = 5;
let y = 6;
代数と同様に、変数は式で使用されます:
let z = x + y;
上記の例から、total が 11 であることが推測できます。
JavaScriptの識別子
すべてのJavaScript変数は固有の名前で識別される必要があります。
これらの固有の名前は識別子と呼ばれます。
識別子は短い名前(x や y のような)またはより詳細な名前(age、sum、totalVolume のような)であることができます。
変数(固有識別子)の名前を構成する一般的なルールは以下の通りです:
JavaScriptの代入演算子
JavaScriptでは、等号(=)は「代入」演算子であり、「等しい」演算子ではありません。
これは代数と異なります。代数では以下のようには意味がありません:
x = x + 5
しかし、JavaScriptではこれは完全に意味があります: x + 5 の値を計算し、その結果を x に代入します。 x の値は 5 増加します。
JavaScriptのデータ型
JavaScriptの変数は 100 のような数値や “John Doe” のようなテキスト値を保持できます。
プログラミングでは、テキスト値はテキスト文字列と呼ばれます。
JavaScriptは多くの種類のデータを扱えますが、今のところ数値と文字列だけを考えてください。
文字列は二重引用符または単一引用符で囲まれています。数値は引用符なしで書かれています。
数値を引用符で囲むと、テキスト文字列として扱われます。
const pi = 3.14;
let person = "John Doe";
let answer = 'Yes I am!';
JavaScript変数の宣言
JavaScriptで変数を作成することを「宣言」と呼びます。
var キーワードまたは let キーワードでJavaScript変数を宣言します:
var carName;
または:
let carName;
宣言後、変数には値がありません(技術的には未定義です)。
変数に値を割り当てるには等号を使用します:
carName = "Volvo";
変数を宣言と同時に値を割り当てることもできます:
let carName = "Volvo";
以下の例では、carName という変数を作成し、その値に “Volvo” を割り当てます。
その後、id=”demo”のHTML段落内にその値を「出力」します:
すべての変数をスクリプトの始めに宣言するのが良いプログラミング慣習です。
1文で多くの変数を宣言できます。
let を使って文を始め、コンマで変数を区切ります:
let person = "John Doe", carName = "Volvo", price = 200;
宣言は複数行にわたることができます:
let person = "John Doe",
carName = "Volvo",
price = 200;
コンピュータプログラムでは、変数はしばしば値なしで宣言されます。その値は計算する必要があるものや後で提供されるもの(ユーザー入力など)です。
値なしで宣言された変数は値 undefined を持ちます。
次の実行後、変数 carName は値 undefined を持ちます:
let carName;
var で宣言されたJavaScript変数を再宣言すると、その値は失われません。
これらの文の実行後、変数 carName は依然として値 “Volvo” を持ちます:
var carName = "Volvo";
var carName;
注意
let または const で宣言された変数を再宣言することはできません。
次のようには動作しません:
let carName = "Volvo";
let carName;
代数と同様に、JavaScript変数を使って算術演算を行うことができます。= や + のような演算子を使用します:
let x = 5 + 2 + 3;
文字列を追加することもできますが、その場合、文字列が連結されます:
let x = "John" + " " + "Doe";
次も試してみてください:
let x = "5" + 2 + 3;
JavaScriptではドル記号を文字として扱うため、$ を含む識別子は有効な変数名です:
let $ = "Hello World";
let $$$ = 2;
let $myMoney = 5;
$ を使用することはあまり一般的ではありませんが、プロのプログラマはしばしばJavaScriptライブラリのメイン関数の別名として使用します。
JavaScriptライブラリのjQueryでは、例えば、メイン関数 $ はHTML要素を選択するために使用されます。jQuery $(“p”); は「すべての p 要素を選択します」という意味です。
JavaScriptではアンダースコアを文字として扱うため、_ を含む識別子は有効な変数名です:
let _lastName = "Johnson";
let _x = 2;
let _100 = 5;
_ を使用することはあまり一般的ではありませんが、プロのプログラマの間では「プライベート(非表示)」変数の別名として使用する慣習があります。
JavaScriptのコメントは、JavaScriptコードを説明し、可読性を高めるために使用できます。
JavaScriptのコメントは、別のコードをテストする際に実行を防止するためにも使用されます。
単一行コメントは // で始まります。
// から行末までのテキストはJavaScriptによって無視されます(実行されません)。
// 見出しを変更する:
document.getElementById("myH").innerHTML = "My First Page";
// 段落を変更する:
document.getElementById("myP").innerHTML = "My first paragraph.";
この例では、各コード行の前に単一行コメントが使用されています。
複数行コメントは /* で始まり */ で終わります。
/* と */ の間のテキストはJavaScriptによって無視されます。
/*
以下のコードは
my web page内のid = "myH"の見出し
およびid = "myP"の段落を変更します:
*/
document.getElementById("myH").innerHTML = "My First Page";
document.getElementById("myP").innerHTML = "My first paragraph.";
通常、単一行コメントが使用されます。ブロックコメントは公式のドキュメント作成に使用されることが多いです。
コメントを使用してコードの実行を防ぐことは、コードテストに適しています。
コード行の前に // を追加すると、その行は実行可能なコードからコメントに変わります。
// document.getElementById("myH").innerHTML = "My First Page";
document.getElementById("myP").innerHTML = "My first paragraph.";
この例では、複数の行をコメントブロックで囲んで、それらの行の実行を防止しています。