文字出力
console.log();
例
console.log("りー"); 表示結果→りー
console.log(15); 表示結果→15
() 内に入力された文字をコンソールに出力します。
文末はセミコロン(;)で終わります。
Hello Worldのような文字のことを文字列と呼びます。
文字列は( ‘ )か( ” )で囲みます。
数値は囲む必要なし。
console.log("りー"); 表示結果→りー
console.log(15); 表示結果→15
リテラル
ちなみに、JavaScriptで数値を表現する方法は2つ方法ある
・150 1.1など直接数値で書く方法 ←これを「リテラルによる表現」と言う
・定数/変数などで書く方法
コメントアウト
//一行 または/*複数行*/
例
//一行コメントアウト
/*
こうすると複数行
コメントアウト
*/
プログラムとしては無視され、実行されません。
・1行コメントアウト:文頭に「//」を付ける。
・複数行コメントアウト:最初と最後に「/**/」を付ける。
//一行コメントアウト
/*
こうすると複数行
コメントアウト
*/
計算
+,-,*,/,%
+= 1 ⇒ ++
-= 1 ⇒ --
number + 10 ⇒number += 10
例
console.log(1+5); →6
console.log("1+5"); →1+5
例2
150円の物を12個、13個買ったとき(税込み)の計算式
const price = 150;
const rate = 1.1; ←税額
console.log(price * 12 * rate +"円"); ←1980円
console.log(price * 13 * rate +"円"); ←2145円
数値は文字列と違いクォーテーションで囲みません。
console.log(1 + 5);は足し算の結果である6が出力されます。
一方、クォーテーションをつけるとそのまま文字列として式が出力されます。
文字列と数値は明確に違うものであることを意識しましょう。
数値は足し算や引き算といった計算もすることができます。
足し算は「+」、引き算は「-」、掛け算は「*」、割り算は「/」、
割った余りを出すには「%」の記号を用います。
数値と記号はすべて半角で記述することに注意しましょう。
console.log(3); →3
console.log(1+5); →6
console.log(1-5); →-4
console.log(1*5); →5
console.log(8/2); →4
console.log(9%2); →1
console.log("1+5"); →1+5
+= 1は ++ 、-= 1は — のように省略して書くことができます。
++
--
変数 + 数字などの計算の時は下記の様に省略もできます。
number = number + 10 ⇒number += 10
number = number - 10 ⇒number -= 10
number = number * 10 ⇒number *= 10
number = number / 10 ⇒number /= 10
number = number % 10 ⇒number %= 10
後に出てくる変数や定数などを使った計算もできます。
例:150円の物を12個、13個買ったとき(税込み)の計算式
const price = 150;
const rate = 1.1; ←税額
console.log(price * 12 * rate +"円"); ←1980円
console.log(price * 13 * rate +"円"); ←2145円
文字列の連結
"○○" + "○○"
例
console.log("日本の" + "東京"); →日本の東京
「+」記号を用いると、文字列同士を連結することができます。
console.log("日本の" + "東京"); →日本の東京
変数
変数は、データ(値)の入れ物(箱)です。
箱の名前が「変数名」であり、値(文字列や数値など)が入ります。
値は後から変更可能です。
変数の定義
let 変数名 = "代入する値";
例
let name = "Ariel";
let number = 15;
例2
let price;
変数は「let 変数名 = 値;」として定義します。
「=」は「等しい」という意味ではなく、「右辺を左辺に代入する」という意味です。
変数を使う理由は、同じ値を繰り返し使用可。変更に対応しやすい。変数名で値の意味が分かりやすい。です。
変数名は自由に決めることができますが、分かりやすい名前をつけましょう。
良い例:変数名が英単語。2語以上の変数名を作る時は2語目の頭を大文字で区切る。
悪い例:頭が数字。無理やりローマ字。日本語
let 変数名 = "代入する値";
let name = "Ariel";
let number = 15;
定義する時に一旦値無しで定義し、後から値を入れて使うことも可能。
let 値;
例
let price;
~~
price = 150;
console.log(price * 12);
変数の呼び出し
console.log(変数名);
例
let name = "Ariel";
console.log(name); →Ariel
呼び出しはconsole.log(変数名);で出力されます。
変数名を出力する時はクォーテーションで囲みません。
“Ariel”という値が代入された変数nameを呼び出すと
下記の様に値が出力されます。
let name = "Ariel";
console.log(name); →Ariel
変数の連結、計算
変数名 + "○○";
例
let name = "Rii";
console.log(name + "さん"); →Riiさん
例2
let number = 2;
console.log(number + 5); → 7
変数は「文字列」や「数値」と同じように扱えます。
代入されている値が文字列の場合は、他の文字列と連結することが可能です。
数値の場合は計算することが可能です。
let name = "Rii";
console.log(name + "さん"); →Riiさん
let number = 2;
console.log(number + 5); → 7
変数の更新
変数名 = "新しい値";
例
let name = "Rii";
console.log(name); →Rii
name = "Ariel"; ←値を更新した
console.log(name); →Ariel
定義する時と違い「let」は必要なく、「変数名 = “新しい値”;」で値が更新されます。
一度代入した変数に再び値を代入すると、後に代入した値で変数の中身が上書きされます。
let name = "Rii";
console.log(name); →Rii
name = "Ariel"; ←値を更新した
console.log(name); →Ariel
let number = 2;
console.log(number); →2
number = number + 3; ←値を更新した
console.log(number); →5
定数
定数の定義
const 定数名 = 値;
例
const language="フランス語";
定数は「const 定数名 = 値」として定義します。
値を更新することはできません。
const language="フランス語";
console.log(language); →フランス
定数の呼び出し
console.log(定数名);
例
const language="フランス語";
console.log(language); →フランス
console.log(language+"を話せます"); →フランス語を話せます
テンプレートリテラル
`${name}`
例
const name = "たける";
const age = 14;
console.log(`${name}は${age}歳です`); →たけるは14歳です
例2
console.log(`~~を~~個買うと${price*quantity}円です`);
これまで文字列や定数の連結には、「+」記号を用いてきました。
それとは別に「テンプレートリテラル」という連結方法があります。
テンプレートリテラルを用いると、文字列の中に定数/変数を含めた文章を作ることができます。
この時、文字列全体をバッククォーテーション(`)で囲む必要があります。
const name = "たける";
const age = 14;
console.log(`${name}は${age}歳です`); →たけるは14歳です
計算式を差し込むことも出来ます。
console.log(`~~を~~個買うと${price*quantity}円です`);
条件分岐のif
if(条件式){
条件が成り立つ時に実行させる処理;
}
例
const number = 12;
if(number > 10){
console.log(`${number}は10より大きいです`); →12は10より大きいです
}
if文を用いると「もし○○ならば●●を行う」という処理が可能になります。
ifの後ろに条件式を書き、それが「成り立つ」場合の処理を{ }の中に書きます。
const number = 12;
if(number > 10){
console.log(`${number}は10より大きいです`); →12は10より大きいです
}
真偽値
true
false
真偽値にはtrueとfalseという2つがあります。
条件式が成り立つと「true」、成り立たなければ「false」となります。
比較演算子
a<b
a<=b
a>b
a>=b
「>」などは比較演算子と呼ばれる、大小比較の記号です。
「a < b」は、aの方がbより小さいときtrue, 大きいときfalseになります。
「a <= b」とすると、aがb以下のときtrueになります。これは「≦」と似ています。
等価演算子
a == b →true
a != b →false
例
const number = 12;の時に
console.log(number ==12);と
console.log(number =="12");は同じ認識になってしまう
「a == b」はaとbが等しければtrue、等しくなければfalseになります。
「a != b」はその逆です。
数値「12」と文字列「”12″」は異なるデータですが、
等価演算子では同じものとして認識されます。
例
const number = 12;の時に
console.log(number ==12);と
console.log(number =="12");は同じ認識になってしまう
厳密等価演算子
a === b →true
a !== b →false
例
const number = 12;の時に
console.log(number ==12);と
console.log(number =="12");は違う認識になる
文字列「”12″」と数値「12」の様な値の形も異なるデータとして扱うことができます。
特に理由がなければ、厳密に比較できる厳密等価演算子を利用するようにしましょう。
例
const number = 12;の時に
console.log(number ==12);と
console.log(number =="12");は違う認識になる
else
if(条件式){
条件が「true」の時の処理
}else{
条件が「false」の時の処理
}
例
const number =7;
if(nuber >10){
console.log("numberは10より大きいです");
}else{
console.log("numberは10以下です"); →numberは10以下です
}
「もし〇〇なら●●を行う、そうでなければ■■を行う」という処理ができるようになります。
if文の条件式が成り立たない場合に、別の処理を行いたい場合に使います。
if文の条件がfalseの場合、elseの処理が実行されます。
const number =7;
if(nuber >10){
console.log("numberは10より大きいです");
}else{
console.log("numberは10以下です"); →numberは10以下です
}
else if
if(条件式1){
条件式1が「true」の時の処理
}else if(条件式2){
条件式1が「false」、条件式2が「true」の時の処理
}else{
どの条件式も「false」の時の処理
}
例
const number = 7;
if(number >10){
console.log("numberは10より大きいです");
}else if(number >5){
console.log("numberは5より大きいです"); →numberは5より大きいです
}else{
console.log("numberは5以下です");
}
const number = 7;
if(number >10){
console.log("numberは10より大きいです");
}else if(number >5){
console.log("numberは5より大きいです"); →numberは5より大きいです
}else{
console.log("numberは5以下です");
}
複数の条件式「かつ(&&)」
x>10 && x<30 →true
x>10 && x<20 →false
複数の条件を組み合わせる方法を学びましょう。まずは「かつ」についてです。
「かつ」は「&&」で表します。「条件1 && 条件2」は「条件1かつ条件2」という意味で、
複数の条件がすべてtrueならtrueになります。
「10より大きいかつ30より小さい」は、「10 < x < 30」と書くことは出来ません。
このようなときは「&&」を使いましょう。
x=25の時
x>10 && x<30 →true
x>10 && x<20 →false
複数の条件式「または(||)」
x<10 || x<30 →true
x<10 || x>30 →false
例
const number = 31;
if(number >= 10 && number < 100){
console.log("numberは2桁です"); →numberは2桁です
}
「または」は「||」で表します。「条件1 || 条件2」は「条件1または条件2」という意味です。
この場合は、複数の条件のうち1つでもtrueならtrueになります。
x=25の時
x<10 || x<30 →true
x<10 || x>30 →false
例
const number = 31;
if(number >= 10 && number < 100){
console.log("numberは2桁です"); →numberは2桁です
}
値によって処理分岐するswitch
const color = "赤";
switch(color){
case"赤":
console.log("ストップ"); →ストッ プ
break;
case"青":
console.log("進む");
break;
}
case"黄":
console.log("要注意");
break;
}
if文以外の条件分岐の方法として、switch文というものを学んでみましょう。
信号機の色を表す定数colorの値によって処理を分岐したい。など、
ある値によって処理を分岐する場合にswitch文を用いることができます。
switch文では分岐の数だけcaseを追加することで処理を分けることができます。
caseの文末は「:」です。「;」ではないので注意。
また、switch文ではbreakが非常に重要です。breakとはswitch文を終了する命令です。
breakがないと、caseの処理を行った後、その次のcaseの処理も実行してしまいます。
そのため、switch文を使うときにはbreakを忘れないように気をつけましょう。
例
const number = 2;
switch (number) {
case 1:
console.log("大吉です");
break;
case 2:
console.log("吉です"); →吉です
break;
case 3:
console.log("小吉です");
break;
}
switch文 – default
const color = "黒";
switch (color) {
case "赤":
処理
break;
case "黄":
処理
break;
default:
console.log("在庫の準備がありません"); →在庫の準備がありません
break;
}
switchの条件の値がcaseの値と一致したとき、その部分の処理が実行されます。
caseのどれにも一致しなかった時、defaultの中身が実行されます。
defaultの文末もcaseの文末と同じく「:」です。「;」ではないので注意。
このようなswitch文の性質を利用すると、if, elseifによる分岐が多く複雑な場合、
switch文で書き換えるとシンプルで読みやすいコードにできます。
繰り返し処理①while
while(条件式){
処理
}
例
let number = 1;
while(number <= 100){
console.log(number);
number += 1;
}
whileは「条件がtrueの間、{ }内の処理を繰り返す」ことができます。
whileは {}の文末にセミコロンは不要です。
例えば「変数numberが100以下」の間に処理を繰り返したい。を作ります。
まず条件式の判定が行われ、trueの時のみ{}の中で処理が1度実行されます。
その後、再び条件式がtrueかどうかチェックされ、trueであればもう一度処理が実行されます。
変数の値を更新するコードを書き忘れてしまうといつまでも条件がtrueのままで、
永遠に繰り返し処理が続いてしまう(無限ループ)ので要注意。
let number = 1;
while(number <= 100){
console.log(number);
number += 1;
}
繰り返し処理②for
for(変数の定義;条件式;変数の更新){
処理
}
例
for(let number =1; number <= 100; number++){
console.log(number);
}
例2
1から100の数字を出力し、3の倍数の時は「3の倍数です」と出力してください。
for (let number=1; number<=100;number++) {
if(number % 3===0){
console.log("3の倍数です");
}else{
console.log(number);
}
}
繰り返し処理を行う方法として、while以外にforがあります。
できることはwhileと同じですが、whileに比べてシンプルに書くことができるのが特徴です。
forでは「変数の定義」「条件式」「変数の更新」の3つを括弧の中に書きます。
括弧の中ではそれぞれをセミコロン(;)で区切ります。
for(let number =1; number <= 100; number++){
console.log(number);
}
例:1から100の数字を出力し、3の倍数の時は「3の倍数です」と出力してください。
for (let number=1; number<=100;number++) {
if(number % 3===0){
console.log("3の倍数です");
}else{
console.log(number);
}
}
複数の値をまとめて管理する配列
[値1,値2,値3]
例
["apple","banana","orange"]
[32,43,65]
変数や定数に代入するような値を複数値まとめて管理する方法について学んで行きましょう。
例えば果物の名前についての値がいくつもあるとき、それぞれを定数(変数)として定義するより、
「果物の名前一覧」といったように関連する値をまとめて管理すると便利です。
要素
配列は、[値1, 値2, 値3] のように作ります。配列に入っているそれぞれの値を要素と呼びます。
配列を使うと、下記のように複数の文字列や数値をまとめて管理することができます。
["apple","banana","orange"]
[32,43,65]
配列の代入
const 定数名 = 配列
例
const fruits = ["apple","banana","orange"];
配列も1つの値として、定数に代入することができます。
配列を代入する定数名は、複数形にすることが多いので覚えておきましょう。
const fruits = ["apple","banana","orange"];
配列の出力
console.log(定数名)
例
const fruits = ["apple","banana","orange"];
console.log(fruits); → ["apple","banana","orange"]
「console.log(定数名)」とすると、配列がコンソールに出力されます。
const fruits = ["apple","banana","orange"];
console.log(fruits); → ["apple","banana","orange"]
配列 要素の取得
配列[インデックス番号]
例
const fruits = ["apple","banana","orange"];
console.log(fruits[0]); → apple
インデックス番号
配列の要素にはそれぞれインデックス番号という番号がついています。
インデックス番号は、0から始まることに注意しましょう。
インデックス番号を用いて配列の要素を取得します。
配列[インデックス番号]とすることで配列の要素を取得することができます。
const fruits = ["apple","banana","orange"];
console.log(fruits[0]); → apple
配列 要素を更新
定数名[インデックス番号] = "新しい値"
例
const fruits = ["apple","banana","orange"];
console.log(fruits[0]); → apple
fruits[0] = "grape"; ←値を更新した
console.log(fruits[0]); →grape
配列は、要素に値を代入することでその要素を上書きすることができます。
定数は、配列自体に配列を再代入はできないが、今ある配列の要素を更新することはできます。
「定数名[インデックス番号] = “新しい値”」でできます。
const fruits = ["apple","banana","orange"];
console.log(fruits[0]); → apple
fruits[0] = "grape"; ←値を更新した
console.log(fruits[0]); →grape
配列 要素の繰り返し
const fruits = ["apple","banana","orange"];
for(let i=0;i<3;i++){
console.log(fruits[i]);
} →apple
banana
orange
配列に対して繰り返し処理を行うことがしばしばあります。
ここでは、forを使って配列の要素を順に取り出すようにしてみましょう。
配列fruitsの要素数が3の場合、forで書くと下記のようになります。
このようにすれば配列の中に格納されているすべての値を簡単に出力することができます。
この際、変数の値は0から始めることに注意しましょう。
変数iを用いて要素を取得しているイメージでやってみます。
const fruits = ["apple","banana","orange"];
for(let i=0;i<3;i++){
console.log(fruits[i]);
} →apple
banana
orange
配列 length
const fruits = ["apple","banana","orange"];
for(let i=0; i<fruits.length ;i++){
console.log(fruits[i]); →apple banana orange
}
「配列が代入された定数名.length」とすることで、配列の要素数を取得できます。
const fruits = ["apple","banana","orange"];
console.log(fruits.length); →3
lengthを使うと、for文のように要素数が分からなくても良く、
配列の要素数が変わっても問題なく繰り返すことができるので便利です。
これは配列の繰り返し処理でよく使う書き方ですので、覚えておきましょう。
for内で変数iに配列の要素数が代入された形なっています。
const fruits = ["apple","banana","orange"];
for(let i=0; i<fruits.length ;i++){
console.log(fruits[i]);
} →apple
banana
orange
オブジェクト (連想配列)
{プロパティ名1:値1,プロパティ名2:値2,プロパティ名3:値3}
例
{name: "手裏剣", price: 300};
オブジェクトは、配列よりも詳細に情報を持った状態で管理できるものです。
配列と同じく複数のデータをまとめて管理するのに用いられます。
それぞれの値にプロパティと呼ばれる名前をつけて管理します。
配列を作るときは[]で囲みましたが、オブジェクトは{}で囲みます。
プロパティ名と値は( : )で繋ぎます。また、プロパティ間はコンマ(,)で区切ります。
{プロパティ名1:値1,プロパティ名2:値2,プロパティ名3:値3}
オブジェクトを定数に代入
const 定数名 = オブジェクト
例
const item = {name: "手裏剣", price: 300};
オブジェクトも定数に代入することができます。
オブジェクト自体を出力
console.log(オブジェクトを代入した定数名)
例
console.log(item); → {name: "手裏剣", price: 300}
「console.log(定数名)」とするとオブジェクトがコンソールに出力されます。
const item = {name: "手裏剣", price: 300};
console.log(item); → {name: "手裏剣", price: 300}
オブジェクト 値の取得
console.log(オブジェクトを代入した定数名.プロパティ名)
例
const item = {name: "手裏剣", price: 300};
console.log(item.name); → 手裏剣
オブジェクトの値を取り出すには、対応するプロパティ名を用いて
「オブジェクトを代入した定数名.プロパティ名」のようにします。
const item = {name: "手裏剣", price: 300};
console.log(item.name); → 手裏剣
オブジェクト 値の更新
オブジェクトを代入した定数名.プロパティ名 = 新しい値
例
const item = {name: "手裏剣", price: 300};
item.price=500;
console.log(item.price); → 500
「オブジェクトを代入した定数名.プロパティ名 = 新しい値」
とすることでオブジェクトの値を更新することができます。
const item = {name: "手裏剣", price: 300};
item.price=500;
console.log(item.price); → 500
配列とオブジェクト(要素にオブジェクトあり)
const items =[
{name: "手裏剣", price: 300},
{name: "まきびし", price: 600}
];
console.log(items[0]); → {name: "手裏剣", price: 300}
console.log(items[0].price); → 300
配列の要素には、文字列や数値だけでなく、オブジェクトも使うことができます。
それぞれの{}後には[,]で繋ぎます。
const items =[
{name: "手裏剣", price: 300},
{name: "まきびし", price: 600}
];
配列内のオブジェクト自体を出力
配列の値がオブジェクトなので、
「配列を代入した定数名[インデックス番号]」で
対応するオブジェクトを取得することができます。
const items =[
{name: "手裏剣", price: 300},
{name: "まきびし", price: 600}
];
console.log(items[0]); → {name: "手裏剣", price: 300}
配列内のオブジェクトのプロパティ値を出力
オブジェクトを代入した定数名[インデックス番号].プロパティ名
例
const items =[
{name: "手裏剣", price: 300},
{name: "まきびし", price: 600}
];
console.log(items[0].price); → 300
配列内のオブジェクトのプロパティ値を取り出すには、
「オブジェクトを代入した定数名[インデックス番号].プロパティ名」と書きます。
const items =[
{name: "手裏剣", price: 300},
{name: "まきびし", price: 600}
];
console.log(items[0].price); → 300
配列内のオブジェクトのプロパティ値をforでそれぞれ出力
const characters = [
{name: "村人A", age: 14},
{name: "村人B", age: 100},
{name: "村人C", age: 5},
];
for (let i = 0; i < characters.length; i++) {
console.log("--------------------");
const character = characters[i];
console.log(`${character.name}です`);
console.log(`年齢は${character.age}歳です`);
} →ーーーーーーーーーーーーーーーー
村人Aです
年齢は14歳です
ーーーーーーーーーーーーーーーー
村人Bです
年齢は100歳です
ーーーーーーーーーーーーーーーー
村人Cです
年齢は5歳です
undefined 存在しない要素を取得
if (定数名.プロパティ === undefined) {~
例
const characters = [
{name: "村人A", age: 14},
{name: "村人B", age: 100},
{name: "村人C", age: 5},
{name: "村人D"}
];
for (let i = 0; i < characters.length; i++) {
console.log("--------------------");
const character = characters[i];
console.log(`${character.name}です`);
if (character.age === undefined) {
console.log("年齢は秘密です");
} else {
console.log(`年齢は${character.age}歳です`);
}
}
→ーーーーーーーーーーーーーーーー
村人Aです
年齢は14歳です
ーーーーーーーーーーーーーーーー
村人Bです
年齢は100歳です
ーーーーーーーーーーーーーーーー
村人Cです
年齢は5歳です
ーーーーーーーーーーーーーーーー
村人Dです
年齢は秘密です
undefined は特別な値で、値が定義されていないことを意味します。
これまでに配列やオブジェクトの扱い方を学習してきました。
配列の存在しないインデックス番号の要素や、オブジェクトの存在しないプロパティ
の要素を取得しようとすると、undefined と出力されます。
「undefined歳です」と出力されてしまうので、
代わりに「年齢は秘密です」と出力する方法は、
undefined をif文の条件式に使います。
指定した値が「undefined」と等しいかどうかで処理を分岐します。
const characters = [
{name: "村人A", age: 14},
{name: "村人B", age: 100},
{name: "村人C", age: 5},
{name: "村人D"}
];
for (let i = 0; i < characters.length; i++) {
console.log("--------------------");
const character = characters[i];
console.log(`${character.name}です`);
if (character.age === undefined) {
console.log("年齢は秘密です");
} else {
console.log(`年齢は${character.age}歳です`);
}
}
→ーーーーーーーーーーーーーーーー
村人Aです
年齢は14歳です
ーーーーーーーーーーーーーーーー
村人Bです
年齢は100歳です
ーーーーーーーーーーーーーーーー
村人Cです
年齢は5歳です
ーーーーーーーーーーーーーーーー
村人Dです
年齢は秘密です
複雑なオブジェクトを扱う
オブジェクト内のプロパティ値にオブジェクトを使用する
const character ={
name:"村人A",
age:14,
favorite:{
food:"ラーメン",
sports:"卓球",
color:"青"
}
}
オブジェクトの値の部分には、文字列や数値だけでなく
オブジェクトを用いることができます。
上記は「character」というオブジェクトの
「favorite」プロパティの値にオブジェクトを用いています。
オブジェクト内のプロパティ値のオブジェクトを呼び出す
const character ={
name:"にんじゃわんこ",
favorite:{
food:"ラーメン",
sports:"卓球",
color:"青"
}
}
console.log(character.favorite); →{food:"ラーメン"}
console.log(character.favorite.food); →ラーメン
このようなオブジェクトは、「オブジェクト名.プロパティ.プロパティ」で呼び出します。
定数characterというオブジェクトの中のfoodの値を呼び出すには、
「character.favorite.food」と指定します。
プロパティに複数の値を入れる時に配列を用いる
const cafe = {
name: "Progateカフェ",
businessHours: {
opening: "10:00(AM)",
closing: "8:00(PM)"
},
menus: ["コーヒー", "紅茶", "チョコレートケーキ"]
};
const cafe = {
name: "Origoカフェ",
businessHours: {
opening: "10:00(AM)",
closing: "8:00(PM)"
},
menus: ["コーヒー", "紅茶", "チョコレートケーキ"]
};
console.log(`店名: ${cafe.name}`);
console.log(`営業時間:${cafe.businessHours.opening}から${cafe.businessHours.closing}`);
console.log(`----------------------------`);
console.log("おすすめメニューはこちら");
for (let i = 0; i < cafe.menus.length; i++) {
console.log(cafe.menus[i]);
}
→店名:Origoカフェ
営業時間:10:00(AM)から8:00(PM)
ーーーーーーーーーーーーーーーーー
おすすめメニューはこちら
コーヒー 紅茶 チョコレートケーキ
関数
関数とは、「処理をまとめて準備しておくもの」です。
その処理を繰り返し実行もできる。
「function 関数名(){}」と書き、{ }内にまとめたい処理を書く。
後で出てくる下記能力もある。
引数を設定しておくと、関数を呼び出すたびに処理の一部分を変えて実行もできる。
戻り値を設定しておくと、関数実行後に処理後の値を、呼び出し元に戻らせることもできる。
イメージとしては、
引数「投入する材料」、関数「何かを作ってくれるマシン」、戻り値「出来上がったのも」
関数の定義
function 関数名(){
まとめたい処理
};
例
const introduce = function(){
console.log("こんにちは");
console.log("私はりーです");
};
関数の呼び出し
関数名();
例
const introduce = function(){
console.log("こんにちは");
console.log("私はりーです");
};
introduce(); →こんにちは 私はりーです
関数を定義しただけでは処理は実行されません。
関数を定義した際に代入した定数名を用いて、
「関数を代入した定数名()」と書くことで関数内の処理を実行できます。
const introduce = function(){
console.log("こんにちは");
console.log("私はりーです");
};
introduce(); →こんにちは 私はりーです
アロー関数
() =>
例
const introduce = function(){
↓
const introduce = ()=>{
「function()」の部分を「() =>」としても、
これまでと同じように関数を定義することができます。
「function」を用いるよりシンプルに書くことができます。
const introduce = function(){
↓
const introduce = ()=>{
引数
引数とは関数に与える追加情報のようなものです。
関数を呼び出すときに一緒に引数を渡すことで、
呼び出された関数では渡された引数の値を利用することが出来ます。
関数の定義(引数あり)
const 定数名 = (第一引数名,第二引数名)=>{
処理
};
例
const introduce = (name,age)=>{
console.log(`私は${name}です`);
console.log(`私は${age}歳です`);
};
関数に引数の受け取り場所を設定するには、()内に引数名を設定するとできます。
また、引数は複数受け取ることもできます。
()の中に受け取る引数をコンマ(,)で区切ると複数の引数を設定することができます。
引数は、左から順番に「第1引数、第2引数、…」と呼びます。
関数の呼び出し(引数あり)
関数を代入された定数名(引数に代入する値);
例
const introduce = (name,age)=>{
console.log(`私は${name}です`);
console.log(`私は${age}歳です`);
};
introduce("りー",20); →私はりーです
私は20歳です
引数を受け取る関数を呼び出すには、
「関数を代入された定数名(引数に渡す値);」と書きます。
関数は呼び出される時、渡される引数値を受け取り、その値は関数内の引数名に代入されます。
上記は関数を代入された定数名introduceの呼び出し時、「”りー”」という値を受け取り、関数内の引数nameに代入されています。
また、複数の引数を設定するには、定義するときと同じようにコンマ(,)を用います。
渡す引数の順番と関数を定義したときの引数の順番は紐づいているので、引数の順番に注意。
戻り値
return 戻したい値;
例
const add = (a,b)=>{
return a + b;
};
const sum = add(1,3);
console.log(sum); →4
例2
const add = (a,b)=>{
return a + b; ←実行され、処理はここで終了する。
console.log("計算しました"); ←ここまでは実行されない
};
戻り値とは、
関数内で計算など処理させた処理結果を関数から戻させる値のこと。
処理結果を関数から戻させる時、関数の呼び出し元で受け取る。
呼び出し元で受け取る処理結果を戻り値と呼び、「関数が戻り値を返す」と言います。
関数内で「return 値」と書くと、呼び出し元で処理結果の値を受け取れるようになります。
例
const add = (a,b)=>{
return a + b;
};
const sum = add(1,3);
console.log(sum); →4
また、returnは戻り値を返すだけでなく、関数の処理を終了させる性質も持っています。
よって、returnの後にある関数内の処理は実行さないので注意しましょう。
例2
const add = (a,b)=>{
return a + b; ←実行され、処理はここで終了する。
console.log("計算しました"); ←ここまでは実行されない
};
スコープ
const introduce = ()=>{
const name="りー";
console.log(name); ←ここは関数内だから実行される
};
introduce();
console.log(name); ←ここは関数外だから実行されない
定数や変数の使用できる範囲のことをスコープと呼びます。
関数の外側で定義した定数や変数は、プログラムのどこからでも使えます。
関数の{}内で定義した定数や変数は、その関数内でのみ使えます。
関数の内側で定義された定数を関数の外側で使用するとエラーになるので注意しましょう。
関数だけでなく、ifやswitchなどの条件文、forやwhileなどの繰り返し文などの
中括弧「{}」を使う構文でもスコープを作ります。
関数、無名関数、アロー関数の比較はこちら
関数:定義と呼び出し
定義:関数にそのまま式を入れて定義する。
function 関数名(){
まとめたい処理
};
呼び出し
console.log(関数名);
例えば、
function number(a,b){
return a +b;
};
console.log(number(1,2)); →3
無名関数:定義と呼び出し
定義:定数や変数に関数を代入し、定数を関数代わりとして定義する。関数式とも言う。
const 定数名 = function(){
まとめたい処理
};
呼び出し
定数名();
例えば、
const number = function(){
return a +b;
};
number(1,2); →3
アロー関数
無名関数の「function()」部分を「() =>」とするもの。他は無名関数と同様。
const introduce = function(){
↓
const introduce = ()=>{
アロー関数特殊バージョンの定義(特殊な時にもっと省略したバージョン)
const myNumber = a => a * a;
関数、無名関数、アロー関数の比較
例:数値を自乗する式を作ってみる
関数
function myNumber(a){
return a * a;
};
console.log(myNumber(2)); →4
無名関数(関数式)
const myNumber = function(a){
return a * a;
}
console.log(myNumber(2)); ←4
アロー関数
const myNumber = (a) =>{
return a * a;
}
console.log(myNumber(2)); ←4
関数の例題はこちら
時間を分に換算するtoMinutes関数を作成してみましょう。
この関数は時間(hour)と分(minutes)の数値を引数に
受け取り、分に換算した結果を戻り値として返します。
const toMinutes = (hour, minute) => {
return hour * 60 + minute; ←1時間を60分に直す
}
const result = toMinutes(3, 20); ←3時間20分を分に直す
console.log(`${result}分`); ←「◯◯分」となるように、分に換算した結果を出力
表示結果→200分
クラス
例
class Menu{
constructor(name,price,comment){
this.name=name,
this.price=price,
this.comment=comment,
}
greet() {
console.log("いらっしゃいませ!");
console.log("${this.name}をぜひご注文下さい!");
}
info(){
this.greet();
console.log(`メニュー名: ${this.name}`);
console.log(`価格: ${this.price}`円);
console.log(`一言: ${this.comment}`です!);
}
}
const menu1 = new Menu("カルボナーラ",700,"濃厚クリームと卵"); ←定数menuにMenuインスタンスを代入(インスタンス化)
const menu2 = new Menu("ウニいくら乗せパスタ",1200,"贅沢なウニといくら");
console.log(`メニュー名: ${menu1.name}`); →メニュー名:カルボナーラ
console.log(`価格: ${menu1.price}`円); →価格:700円
console.log(`一言: ${menu1.comment}`です!); →一言:濃厚クリームと卵です!
menu.greet(); →いらっしゃいませ!
カルボナーラをぜひご注文下さい!
console.log(`メニュー名: ${menu2.name}`); →メニュー名:ウニいくら乗せパスタ
console.log(`価格: ${menu2.price}`円); →価格:1200円
console.log(`一言: ${menu2.comment}`です!); →一言:贅沢なウニといくらです!
menu.greet(); →いらっしゃいませ!
ウニいくら乗せパスタをぜひご注文下さい!
--
menu.info(); →いらっしゃいませ!
カルボナーラをぜひご注文下さい!
メニュー名:カルボナーラ
価格:700円
一言:濃厚クリームと卵です!
クラスは、関数や変数など好きにまとめたい項目を1つの塊として準備できる便利なもの。
例えばメニューに関するデータをいくつも作成する場合、
最初に「メニューを作成するための設計図」を用意します。
データ作成する度に名前・価格・画像など同じ項目を書く必要はなく、
それらをまとめた1塊の専用のクラスにすることが出来て繰り返し出力可能です。
そうすることにより、メニューを作る度に1から項目を準備して作るのではなく、
決まった項目はクラスで準備しておき、値だけ後から入れていく構造ができる。
オブジェクトを自分の作りたい構造で作成可能なので「オブジェクトの設計図」と言える。
複数の関数や変数を使用して再現性を持った同じデータ構造のオブジェクトを
簡単に作ることができるようになる。汎用性の高いメンテナンスしやすい塊で管理出来る。
クラスの定義
class クラス名{
まとめたいデータ構造
}
例
class Menu{
}
「class クラス名{}」とすることで新しくクラスを作成できます。
クラス名は基本的に大文字から始めるようにしましょう。
{}内に関数や変数などを入れられます。
クラス内の関数を「メソッド」、変数を「プロパティ」と呼び、
クラス内で最初に自動で実行される機能を「コンストラクタ」と呼びます。
インスタンスの生成
new クラス名(クラスに投げる引数、引数、、、)
例
const menu1 = new Menu("カルボナーラ",700,"濃厚クリームと卵"); ←定数menuにMenuインスタンスを代入(インスタンス化)
const menu2 = new Menu("ウニいくら乗せパスタ",1200,"贅沢なウニといくら");
設計図を用意できたので、
実際にその設計図に値を投げて1塊りのデータを生ませる(オブジェクト生成)準備をしよう。
クラスからオブジェクトを生成するには、「new クラス名()」とします。
クラスから生成したオブジェクトは特別にインスタンスと呼びます。
また、MenuクラスのインスタンスをMenuインスタンスと呼びます。
それぞれの作りたいものの詳細データが入ったカプセル的な?即席インスタントラーメン的な?
コンストラクタ
constructor(受け取って使用する引数,引数,,){
インスタンス(クラスを使って作ったオブジェクト)生成時に実行させる処理
}
例
constructor(name,price,comment){
this.name=name,
this.price=price,
this.comment=comment,
}
コンストラクタは、インスタンス(クラスを使って作ったオブジェクト)を生成す
るタイミングで実行させたい処理を追加する機能。
コンストラクタの中には処理を記述することができます。
ここに書いた処理はインスタンスが生成された直後に実行されます。
大切なのは、インスタンスが生成された直後にインスタンスごとに毎回実行
されるということです。
また、( )内に引数名を記述することで、コンストラクタ内の処理で使用できます。
プロパティの追加
constructor(name,price,comment){
this.name=name,
this.price=price,
this.comment=comment,
}
生成したインスタンスに、コンストラクタ内で情報追加してみましょう。
コンストラクタの中で「this.プロパティ名 = 値」とすることで、
生成されたインスタンスにプロパティや値を追加することができます。
インスタンスとプロパティの呼び出し
console.log(`メニュー名: ${menu1.name}`); →メニュー名:カルボナーラ
console.log(`価格: ${menu1.price}`円); →価格:700円
console.log(`一言: ${menu1.comment}`です!); →一言:濃厚クリームと卵です!
console.log(`メニュー名: ${menu2.name}`); →メニュー名:ウニいくら乗せパスタ
console.log(`価格: ${menu2.price}`円); →価格:1200円
console.log(`一言: ${menu2.comment}`です!); →一言:贅沢なウニといくらです!
インスタンスとはオブジェクトです。
コンストラクタの中で追加した値はオブジェクトと同様に
「インスタンス.プロパティ名」とすることで
クラスの外からでもインスタンスを使用して呼出すことが出来ます。
オブジェクト指向
ここまで登場した「クラス」「コンストラクタ」「インスタンス」
は、プログラミング言語でオブジェクト指向と呼ばれる考え方です。
「複雑な仕組みをまとめて汎用化し、効率よくオブジェクトを生成
する方法」という考え方です。
メソッド
メソッドは、クラス内?オブジェクト内?の関数
(インスタンスの「動作」に関する処理のまとまり)
「名前」や「年齢」などのデータはプロパティ(クラス内変数)で追加したが、
「挨拶をする」「値を計算する」などの動作の処理はメソッド
メソッドの定義
メソッド名() {
行いたい処理
}
例
greet() {
console.log("いらっしゃいませ!");
console.log("${this.name}をぜひご注文下さい!");
}
メソッド内でインスタンスの値を使用するには、
「this」という特殊な値を用いて、「this.プロパティ名」とします。
プロパティ(クラス内変数)とメソッド(クラス内関数)の呼び出し
プロパティ呼び出し
console.log(インスタンスが代入された変数名.呼び出したいプロパティ名)
メソッド呼び出し
インスタンス.メソッド名()
例
console.log(`メニュー名: ${menu1.name}`); →カルボナーラ
menu.greet(); →いらっしゃいませ!
カルボナーラをぜひご注文ください!
プロパティは値を出力するからconsole.log()
メソッドは値ではなくまとまりごと呼び出すからmenu.greet()
メソッド内で同クラス内の他メソッドを呼び出す
class Menu{
constructor(name,price,comment){
this.name=name,
this.price=price,
this.comment=comment,
}
greet() {
console.log("いらっしゃいませ!");
console.log("${this.name}をぜひご注文下さい!");
}
info(){
this.greet();
console.log(`メニュー名: ${this.name}`);
console.log(`価格: ${this.price}`円);
console.log(`一言: ${this.comment}`です!);
}
}
const menu1 = new Menu("カルボナーラ",700,"濃厚クリームと卵");
menu.info(); →いらっしゃいませ!
カルボナーラをぜひご注文下さい!
メニュー名:カルボナーラ
価格:700円
一言:濃厚クリームと卵です!
メソッド内で他のメソッドを呼び出すことも可能です。
メソッド内で「this.メソッド名()」とすることで、
同じクラス内にあるの他のメソッドを使うことができます。
継承
class 作りたいクラス名 extends 継承したいクラス名{
}
例
class Dog extends Animal{
←Animalクラスを継承
}
例2
class Animal {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log("こんにちは");
}
info() {
this.greet();
console.log(`名前は${this.name}です`);
console.log(`${this.age}歳です`);
}
}
class Dog extends Animal {
}
const animal = new Animal("レオ", 3);
animal.info(); →こんにちは
名前はレオです
3歳です
「継承」とは、すでにあるクラスをもとに、新しくクラスを作成する方法のことです。
例えば動物に関するデータを扱う「Animalクラス」を作成した場合、
そこから犬のデータに特化した「Dogクラス」を作成していきましょう。
新しく作成するクラスが既存のクラスの一種である場合、
「継承」という方法を用いることで非常に効率よく作業を進めることができます。
例えば「Animalクラス」から「Dogクラス」を継承すると、
「Animalクラス」の全ての機能を引き継いで、「Dogクラス」を作成することができます。
また、継承を用いてクラスを作成するには「extends」を用います。
例
class Dog extends Animal{
}
ま継承では元となるクラスを親クラス(今回はAnimalクラス)、
新しく作成するクラスを子クラス(今回はDogクラス)と呼びます。
使えるメソッド
メソッドの追加 独自のメソッド
class 子クラス extends 親クラス{
子クラスに作りたいメソッド名(){
}
}
例
class Dog extends Animal{
getHumanAge(){
}
}
継承して作成したクラスにも、これまでと同じようにメソッドを追加することができます。
今回は犬の年齢を人間の年齢に換算する「getHumanAge」メソッドを用意してみましょう。
メソッドの戻り値
例
class Dog extends Animal{
getHumanAge(){
return this.age *7;
}
}
const dog =new Dog("レオ",4);
const humanAge = dog.getHumanAge();
console.log(humanAge); →28
メソッドでは、関数と同じように戻り値を用いることができます。
上記は「getHumanAge」メソッドの戻り値を、「humanAge」という定数に代入しています。
子クラスのメソッドと親クラス
例
class Dog extends Animal{
getHumanAge(){
return this.age `7;
}
}
const animal =new Animal("レオ",4);
const humanAge = animal.getHumanAge(); ←この場合、getHumanAgeメソッドはDogクラスにしかないのでエラーになる
例??
例
class Animal {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log("こんにちは");
}
info() {
this.greet();
console.log(`名前は${this.name}です`);
console.log(`${this.age}歳です`);
}
}
class Dog extends Animal {
getHumanAge() {
return this.age * 7;
}
}
const dog = new Dog("レオ", 4);
dog.info();
// 定数humanAgeを定義し、定数dogに対してgetHumanAgeメソッドを呼び出した値を代入してください
const humanAge = dog.getHumanAge();
// 「人間年齢で〇〇歳です」と出力してください
console.log(`人間年齢で${humanAge}歳です`);
→こんにちは
名前はレオです
4歳です
人間年齢で28歳です
オーバーライド(1)同名のメソッド
例
const dog = new Dog("レオ", 4);
dog.info();
class Animal{
info(){ ←こっちではなく、、
}
}
class Dog extends Animal{
info(){ ←こっち(子クラス)のinfoメソッドが呼び出される
}
}
継承したクラスは、親クラスのメソッドと子クラスのメソッドの両方が使用できることがわかったかと思います。
ではAnimalクラス(親クラス)にすでにあるメソッドと同じ名前のメソッドをDogクラス(子クラス)に定義すると、どちらのメソッドが呼び出されるでしょうか?
親クラスと同じ名前のメソッドを子クラスに定義すると、子クラスのメソッドが優先して使用されます。
これは、子クラスのメソッドが親クラスのメソッドを上書きしていることから、オーバーライドと呼ばれます。
??
infoメソッドの上書き
今回は、Dogクラスのinfoメソッドで人間年齢も出力するようにしましょう。
前のページで定義したgetHumanAgeメソッドを使って以下のように書き換えます。
class Dog extends Animal{
info(){
this.greet();
console.log(`名前は${this.name}です`);
console.log(`${this.age}歳です`);
const humanAge = this.getHumanAge(); ←ここと、
console.log(`人間年齢で${humanAge}歳です`); ←ここを追加
}
}
オーバーライド(2)コンストラクタのオーバーライド
class 子クラス extends 親クラス {
constructor(){
super() ←1行目にsuperが必要
子クラスのコンストラクタ処理
}
}
メソッドと同じように、コンストラクタもオーバーライドすることができます。
例えば、子クラスにプロパティを追加したい場合などに用います。
ただしコンストラクタをオーバーライドする際は1行目に「super()」と記述する必要があります。
子クラスのコンストラクタ内の「super()」では、
その部分で親クラスのコンストラクタを呼び出しています。
そのため、親クラスのコンストラクタが引数を受け取る場合には、
「super」の後ろの丸括弧「( )」に引数を渡す必要があります。
今回は親クラスのコンストラクタを呼び出したあとに、
犬の種類を表す「breed」プロパティを追加しています。
??
例
class Animal{ ←①親クラスのコンストラクタ実行
constructor(name,age){
this.name = name;
this.age = age;
}
}
class Dog extends Animal{
constructor(name,age,breed){
super(name,age);
this.breed = breed; ←②子クラス独自の処理実行
}
}
例2
class Animal {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log("こんにちは");
}
info() {
this.greet();
console.log(`名前は${this.name}です`);
console.log(`${this.age}歳です`);
}
}
class Dog extends Animal {
// constructorを追加してください
constructor(name, age, breed) {
super(name, age);
this.breed = breed;
}
info() {
this.greet();
console.log(`名前は${this.name}です`);
// 「犬種は〇〇です」と出力してください
console.log(`犬種は${this.breed}です`);
console.log(`${this.age}歳です`);
const humanAge = this.getHumanAge();
console.log(`人間年齢で${humanAge}歳です`);
}
getHumanAge() {
return this.age * 7;
}
}
// 3つ目の引数に「"チワワ"」を渡してください
const dog = new Dog("レオ", 4, "チワワ");
dog.info();
→こんにちは
名前はレオです
犬種はチワワです
4歳です
人間年齢で28歳です
ファイルの分割
コードの量が増えてくると1つのファイルで管理するのが大変になるため、
複数のファイルでコードを管理することがあります。
今回は、メインのプログラムを実行する「script.js」と
Animalクラスを定義する「animal.js」、Dog クラスを定義する「dog.js」
の3つのファイルにコードを分けてみましょう。
script.js プログラムの実行部分
dog.js Dogクラスの定義部分
animal.js Animalクラスの定義部分
ファイルを分割したときのエラーは、
それぞれのファイルを関連づけし、必要な値を渡すことで解決できます。
今回の場合「dog.js」でAnimalクラスを、
「script.js」でDogクラスを使用できるように設定する必要があります。
ファイルの分割 export
(animal.js内↓)
class Animal{
}
export default Animal; ←Animalクラスを他ファイルでも使用可能にする設定
(animal.js内↓)
class Animal{
}
export default Animal; ←Animalクラスを他ファイルでも使用可能にする設定
ファイルの分割 import
(dog.js内↓)
import Animal from "./animal";
次に「dog.js」内でAnimalクラスを使用できるようにしてみましょう。
他のファイルで定義されているクラスを使用するにはインポート(読込)をする必要があります。
使用するファイルの先頭で「import クラス名 from “./ファイル名”」と書くとインポート可能です
その際、ファイル名の拡張子の「.js」は省略することができます。
値のエクスポート
例
(sample1.js内↓)
const text="Hello World";
export default text; ←textをsample2にエクスポートする記述
(sample2.js内↓)
import text from "./sample1";
console.log(text); →Hello World
クラスのエクスポートを行いましたが、エクスポートできるのはクラスだけではありません。
文字列や数値や関数など、どんな値でもエクスポートが可能です。
エクスポートする際は、下図のように「export default 定数名」とします。
インポートする際は「import 定数名 from “./ファイル名”」とします。
データ定義部分を分割する時
例
(script.js内)
変更前
import Dog from "./dog";
const dog = new Dog("レオ",4,"チワワ");
dog.info();
↓ ↓
変更後
(dogData.js内)
import Dog from "./dog";
const dog = new Dog("レオ",4,"チワワ");
export default dog;
(script.js内)
import dog from "./dogData";
dog.info();
「script.js」でDogインスタンスを定義している部分を、新しく作る「dogData.js」に移動します
実際には演習のコード量はそこまで多くないため、ファイルを分けるメリットは大きくないですが
練習のためにやってみましょう。
Dogインスタンスのエクスポート
実際に変更するコードは下の図のようになります。
「dogData.js」はDogクラスをインポートし、Dogインスタンスである定数dogをエクスポートします。
「script.js」は定数dogをインポートするようにします。
名前付きエクスポート デフォルトエクスポート
(dogData.js)
const dog = new Dog("レオ",4,"チワワ");
export default dog; ←dogをエクスポート
(script.js)
import doggy from "./dogData"; ←doggyとdogがエクスポート・インポートで名前が違くてもOK
doggy.info();
export defaultはデフォルトエクスポートと呼ばれ、
そのファイルがインポートされると自動的に「export default 値」の値がインポートされます。
そのためエクスポート時の値の名前と、インポート時の値の名前に違いがあっても問題ありません
デフォルトエクスポートの注意点
デフォルトエクスポートは1ファイル1つの値のみ使えます。
このファイルをインポートする際には、デフォルトエクスポートの値を自動でインポートするため、
値が1つのみとなっています。
複数の値をエクスポートしたい場合は、「名前付きエクスポート」を用います。
名前付きエクスポート(1)
(dogData.js)
const dog1 = new Dog("レオ",4,"チワワ");
export{dog1};
(script.js)
import {dog1} from "./dogData";
dog1.info();
名前付きエクスポートとは左の図のように、defaultを書かずに、名前を{}で囲んでエクスポートする書き方です。
名前付きエクスポートした値をインポートする際は、エクスポート時と同じ名前で値を指定します
インポートする値は、エクスポート時と同様に、「import { 値の名前 } from “./ファイル名”」と{}で囲んで指定します。
名前付きエクスポート(2)
(dogData.js)
const dog1 = new Dog("レオ",4,"チワワ");
const dog2 = new Dog("ベン",2,"プードル");
export{dog1,dog2};
(script.js)
import {dog1,dog2} from "./dogData";
dog1.info();
dog2.info();
名前付きエクスポートは、デフォルトエクスポートと違い、
複数の定数やクラスを指定してエクスポートが出来ます。
また、左の図のように、「export { 名前1, 名前2 }」という形で書くことにより、
1つのファイルから複数のエクスポートが出来ます。
インポートの際も、コンマで区切ることで複数のインポートができます。
パス指定
相対パス(1)
これまでファイルの指定は「./ファイル名」としてきました。
これは相対パスと言い、記述されているファイルからみた位置関係を示しています。
右の図では”./dogData”と書いてあります。
この相対パスは「script.js」からみた「dogData.js」の位置を表しています。
同じディレクトリのファイル指定
例
from "./dogData";
ドット1つの「./」は相対パスが書かれているファイルと同じディレクトリを意味します。
つまり右の図で書かれている相対パス”./dogData”は「script.js」と同じsrcディレクト
リの中にある「dogData.js」ファイルを意味します。
異なるディレクトリのファイル指定
from "./data/dogData";
相対パスを練習するために、これまでのディレクトリ/ファイル構成を変えてみましょう。
script.js>dataフォルダ>dogData.jsをインポートするときの相対パスを見てみましょう。
相対パス(2)
例
dogData.jsから→一つ上のdataフォルダ→classフォルダ→dog.jsの時は下記になる
import Dog from "../class/dog";
1つ上の階層に戻る場合はドット2つの「../」を用います。
左の図のように「dogData.js」でclassディレクトリに入っている「dog.js」をインポー
トする場合は下図のような相対パスになります。
パッケージ(1)
JavaScriptの世界では、誰かが作った便利なプログラムがパッケージという形で公開されています
また、JavaScriptの機能を使うことで、このパッケージを自分のプログラムの中に組み込んで使うことができます。
パッケージのimport
(script.js内)
import 定数名 from "パッケージ名";
例
import chalk from "chalk";
パッケージを自分のプログラムで使うためには、importを用いてパッケージをインポートします。
パッケージのimportは、ファイル名ではなくパッケージ名を指定します。
今回は右の図のようにchalkというパッケージをインポートします。
chalkパッケージの使い方
(script.js内)
import chalk from "chalk";
console.log(chalk.yellow("Hello World")); ←文字色指定
console.log(chalk.bgCyan("Hello World")); ←背景色指定
インポートすれば、そのファイルでパッケージが使えるようになります。
chalkは出力する文字の色を変えることが出来ます。
左の図のように文字列を、chalk.yellowやchalk.bgCyanで囲むだけで、文字の色を変更できます。
コンソールから値を受け取ろう
import readlineSync from "readline-sync";
readlineSync.question("名前を入力してください"); →名前を入力してください
コンソールから値を入力できるようにするためのパッケージを使ってみましょう。
readline-syncというパッケージを導入すると、コンソールへの値の入力と、
その入力された値をプログラムの中で使うことができるようになります。
左の図のようにインポートし、readlineSync.question(質問文) のように記述します。
質問文が出力されると一旦処理が止まり、コンソールに値が入力されると、次の処理に進みます。
入力値を使う
import readlineSync from "readline-sync";
const name=readlineSync.question("名前を入力してください→");
console.log(`${name}と入力されました`);
→名前を入力してください→アリエル
→アリエルと入力されました
入力された値は、定数や変数に代入することが出来ます。
下記のように、上記のreadlineSync.questionの部分を定数に代入すると、
入力された値がそのまま定数nameに代入されます。
入力値を使う(整数)
const name=readlineSync.question("名前を入力してください→");
const age=readlineSync.questionInt("年齢を入力してください→");
例
(dogData.js)
// readline-syncをインポートしてください
import readlineSync from "readline-sync";
import Dog from "../class/dog";
const dog1 = new Dog("レオ", 4, "チワワ");
// readlineSync.questionを使って書き換えてください
const name = readlineSync.question("名前を入力してください: ");
// readlineSync.questionIntを使って書き換えてください
const age = readlineSync.questionInt("年齢を入力してください: ");
// readlineSync.questionを使って書き換えてください
const breed = readlineSync.question("犬種を入力してください: ");
const dog2 = new Dog(name, age, breed);
export { dog1, dog2 };
→名前を入力してください:
(入力したら次の質問が表示される)
→年齢を入力してください:
(入力したら次の質問が表示される(数字出ないとエラー表示される)
→犬種を入力してください:
入力したら下記が表示される
こんにちは
名前はaです
犬種はaです
1歳です
人間年齢で7歳です
(ちなみに他ファイルは下記な感じ)
(script.js)
import { dog1, dog2 } from "./data/dogData";
console.log("---------");
dog1.info();
console.log("---------");
dog2.info();
(script.js)
import { dog1, dog2 } from "./data/dogData";
console.log("---------");
dog1.info();
console.log("---------");
dog2.info();
(dog.js)
import chalk from "chalk";
import Animal from "./animal";
class Dog extends Animal {
constructor(name, age, breed) {
super(name, age);
this.breed = breed;
}
info() {
this.greet();
console.log(chalk.yellow(`名前は${this.name}です`));
console.log(chalk.bgCyan(`犬種は${this.breed}です`));
console.log(`${this.age}歳です`);
const humanAge = this.getHumanAge();
console.log(`人間年齢で${humanAge}歳です`);
}
getHumanAge() {
return this.age * 7;
}
}
export default Dog;
(animal.js)
class Animal {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log("こんにちは");
}
info() {
this.greet();
console.log(`名前は${this.name}です`);
console.log(`${this.age}歳です`);
}
}
export default Animal;
上記ではquestionを用いましたが、
年齢のように整数を入力してほしい場合はquestionIntを用います。
あとは入力値を用いて、Dogのインスタンスを生成すれば完成です。
色んなメソッド
pushメソッド
const numbers = [1,2,3];
console.log(numbers); → [1,2,3]
numbers.push(45);
console.log(numbers); → [1,2,3,45]
pushメソッドとは、配列の最後に新しい要素を追加するメソッドです。
pushメソッドの後の()の中に追加したい要素を入力します。
以下の例では、pushメソッドの引数「4」が配列の最後に追加されています。
forEachメソッド
const numbers = [1,2,3];
numbers.forEach((number)=>{
console.log(number);
}); → 1 2 3
forEachメソッドは配列の中の要素を1つずつ取り出して、全ての要素に繰り返し同じ処理を行うメソッドです。
以下の例では、例えばconsole.logにしているので配列numbersの要素がすべて順番に出力されます。
配列numbersの要素が1つずつ順番に引数numberに代入され、
処理内に書いてあるconsole.log(number)が繰り返し実行されています。
コールバック関数
引数に入っている関数はコールバック関数と呼びます。
上記であれば下記の部分がコールバック関数になる
(number)=>{console.log(number);}
findメソッド
const numbers = [1,3,5,7];
const foundNumber=numbers.find((number)=>{
return number>3;
});
console.log(foundNumber); →5
findメソッドとは、条件式に合う1つ目の要素を配列の中から取り出すメソッドです。
以下の例では、配列numbersの中から、3より大きい1つ目の要素である5が
foundNumberに代入されコンソールに出力されています。
コールバック関数の中は { return 条件 } と書くことで、条件に合う要素が戻り値となります。
findメソッドは、配列の要素がオブジェクトの場合も使うことができます。
以下の例ではオブジェクトのプロパティを条件の中で使用しています。
オブジェクトのプロパティを条件として使用する場合、そのプロパティを
持っているオブジェクトそのものを取り出します。
const characters=[
{id:1,name:"にんじゃ"},
{id:2,name:"村人"}
];
const foundCharacter=characters.find((character)=>{
return character.id===1;
});
console.log(foundCharacter); →{id:1,name:"にんじゃ"}
filterメソッド
const numbers = [1,3,5,7];
const filteredNumbers=numbers.filter((number)=>{
return number>3;
});
console.log(filteredNumbers); →[5,7]
filterメソッドとは記述した条件に合う要素全てを取り出して新しい配列を作成するメソッドです。
findメソッドと同様に、配列の要素がオブジェクトの場合もfilterメソッドを使うことができます。
以下の例ではオブジェクトのプロパティを条件の中で使用しています。
オブジェクトのプロパティを条件として使用する場合、そのプロパティを持ってい
るオブジェクトそのものを取り出します。
const characters=[
{name:"にんじゃ",age:14},
{name:"村人",age:50},
{name:"勇者",age:29}
];
const filteredCharacters=characters.filter((character)=>{
return character.age>10;
});
console.log(filteredCharacters); →[
{name:"にんじゃ",age:14},
{name:"勇者",age:29}
]
mapメソッド
const numbers=[1,2,3];
const doubledNumbers=numbers.map((number)=>{
return number*2;
});
console.log(doubledNumbers); →[2,4,6] ←配列numberの全ての要素を2倍を実行し、2倍された新しい配列が作成され、定数doubledNumbersに代入したのが表示された
mapメソッドとは、配列内のすべての要素に処理を行い、その戻り値から新しい配列を作成するメソッドです。
以下の例では配列numbersの全ての要素を2倍した要素を持つ、新しい配列を作成しています。
コールバック関数の中の処理は { return 値 } と書きます。
const names=[
{firstName:"Kate", lastName:"Jones"},
{firstName:"Brain", lastName:"Smith"},
];
const fullNames=names.map((name)=>{
return name.firstName + name.lastName;
});
console.log(fullNames); →["KateJones","BrainSmith"]
コールバック関数
const printWanko = () => {
console.log("にんじゃわんこ");
};
const printHitsuji = () => {
console.log("ひつじ仙人");
};
const call = (callback) => {
console.log("コールバック関数を呼び出します。");
callback();
};
call(printHitsuji); →コールバック関数を呼び出します。
ひつじ仙人
JavaScriptでは引数に関数を渡すことができます。
引数に渡される関数(ある他の関数に引数として渡される関数)を
コールバック関数という。コールバック関数には2種類ある。
1,事前に定義されている関数を使う
const a = ()=>{ ←関数a
処理
}
const b =(引数名)=>{ ←関数b
処理
}
b(a); ←関数bを呼び出す際、
関数bの引数に関数a(別の関数)を渡す
この時、引数に渡される関数(関数a)を
「コールバック関数」と言う
関数は、関数名の後に()を付けると関数を呼び出し、
()を付けないと関数そのものをさすことになる。
そのため、コールバック関数で関数まるごと渡すときは()を付けない(b(a);)。
例
const a = () => { ←関数aを定義
console.log("あいうえお");
};
const b = (callback) => { ←関数bを定義し、コールバック関数で来た関数aをcallbackという引数名に変換して関数b内で関数aを使用している。
console.log("かきくけこ");
callback();
};
b(a); ←関数bを呼出すが、関数bの引数に関数aを渡して関数b内で使用させる。
→かきくけこ
あいうえお
2.関数を呼び出す際、引数に関数を入れて渡す
関数を呼ぶ()内に、呼ぶ関数内で使いたい関数を
その場で書いて渡して使用させちゃう。
const call(callback)=>{ ←関数callを定義(引数で何かを受ける準備をcallback名でしてある)
console.log("あいうえお");
callback();
}
call(()=>{ ←関数callを呼出す。その時に、呼出す()内に関数call内で使わせたい関数を書いちゃう。
console.log("かきくけこ");
});
→あいうえお
かきくけこ
関数を渡した先の関数内で出力させるのではなく、
渡した関数を、渡した元(呼び出し元)で出力させることも可能。
複数引数でそれらをさせることも可能(複数の時はその引数の数を合わせることに注意)。
const call = (callback) => {
callback("にんじゃわんこ", 14);
};
call((name, age) => { ←関数callを呼び出し、引数を渡すが、
console.log(`${name}は${age}歳です。`); 渡し先の関数から利用したい値分の引数を、
}); 呼び出し元の引数に数を合わせて入れ、渡し、戻させ、
呼び出し元の関数でそれを出力させている。
→にんじゃわんこは14歳です。
引数で関数を定義する
先程は事前に定義した関数をコールバック関数として渡しましたが、関数を直接引数の中で定義することもできます。
引数で関数を定義した場合の流れは、事前に定義した関数を引数に渡す場合と同じです。
事前に定義した関数
const printWanko = () => {
console.log("にんじゃわんこ");
};
const printHitsuji = () => {
console.log("ひつじ仙人");
};
const call = (callback) => {
console.log("コールバック関数を呼び出します。");
callback();
};
call(printHitsuji); →コールバック関数を呼び出します。
ひつじ仙人
直接引数の中で定義した関数
const call = (callback) => {
console.log("コールバック関数を呼び出します。");
callback();
};
call()=>{
console.log("にんじゃわんこ");
});
例
const printWanko = () => {
console.log("にんじゃわんこ");
};
const call = (callback) => {
console.log("コールバック関数を呼び出します。");
callback();
};
call(printWanko);
call(() => {
console.log("ひつじ仙人");
});
引数を渡す
コールバック関数では、普通の関数と同じように引数を渡すことができます。
普通の関数の場合
const introduce = (name) => {
console.log(name);
};
introduce("わんこ"); →わんこ
コールバック関数の場合
const introduce = (callback) => {
callback("わんこ");
};
introduce(name)=>{
console.log(name);
}); →わんこ
複数の引数を渡す
2つ以上の引数を渡すこともできます。
コールバック関数の引数と、実行時に渡す引数の数をそろえるように気をつけましょう。
普通の関数の場合
const introduce = (name,age) => {
console.log(`${name}は${age}歳です`);
};
introduce("わんこ",25); →わんこは25歳です
コールバック関数の場合
const introduce = (callback) => {
callback("わんこ",25);
};
introduce(name,age)=>{
console.log(`${name}は${age}歳です`);
}); →わんこは25歳です