私事ですが今日の夜に商工会議所で3分間、自分の個人事業計画について発表する機会があります。20人くらいの参加者が発表して、質疑応答で計90分くらいのセミナーです。ものすごい貴重で重要な機会だと思うのですが何を話すかまだ決めていません。そもそも事業計画があるわけではなく、その前段階のプログラミング基礎を学んでいる状況です。でも勉強中ですっていう発表をするだけだともったいない気がします。今日の学習を進めながら考えたいと思います。では今日も張り切っていきましょう!
JavaScript オブジェクト/配列/イベント処理/forEach
9. オブジェクトの基礎(ドット&ブラケット記法)
オブジェクトとは?
JavaScriptにおいて、オブジェクトは複数のデータを1つのまとまりとして管理できるデータ構造です。オブジェクトは**プロパティ(key)と値(value)**のペアで構成されます。
オブジェクトを使うことで、関連するデータを1つの構造で整理し、効率的に扱うことができます。たとえば、ユーザー情報や商品の詳細など、複数のデータを一つにまとめて管理するのに便利です。
オブジェクトの基本的な構造:
オブジェクトは、中括弧 {}
を使って作成されます。プロパティ(key)と値(value)はペアで指定し、それぞれのペアは**コロン(:
)で区切られます。複数のプロパティはカンマ(,
)**で区切ります。
オブジェクトは、複数のプロパティと値をまとめて管理するためのデータ構造を定義するためのものです。
let person = {
name: "太郎", // プロパティ "name" の値は "太郎"
age: 30, // プロパティ "age" の値は 30
job: "エンジニア" // プロパティ "job" の値は "エンジニア"
};
console.log(person); // { name: '太郎', age: 30, job: 'エンジニア' }
・let person = {} のpersonが変数で、その変数の値が{}の中身
・name, age, jobがプロパティ(key)で、"太郎"、30、"エンジニア"が値(value)
・複数のプロパティをカンマで区切るというのは、nameなどコロン(:)の左側にあるプロパティが左側に複数ある場合という意味ではなく、上記のコードのようにname, age, jobという複数のプロパティを"太郎"、30という値(value)の右側をカンマで区切っているという意味
オブジェクトのプロパティにアクセスする方法:
・ドット(.
)記法を使う。
基本構文
オブジェクト.プロパティ // プロパティ(固定された文字列のみ)にアクセスする場合
オブジェクト.メソッド() // メソッドを呼び出す場合
オブジェクト:ドット記法を使う対象となるデータのまとまり。
プロパティ:オブジェクトが持つデータや値。
メソッド:オブジェクトが持つ関数や機能(オブジェクト内で使える関数のこと)。
※プロパティとメソッドはオブジェクトとセットで初めて機能します。単体では使えません。プロパティとメソッドの値にアクセスするためにはオブジェクトが必須です。オブジェクトの省略は不可です。
オブジェクトとは?
オブジェクトは、JavaScriptで使われるデータの集合体で、複数の関連するデータを1つにまとめて管理するためのものです。オブジェクトは、「キーと値のペア」から構成されています。
・キー(プロパティ名): データの名前。
・値: そのデータに対応する実際の内容。
let person = {
name: "太郎", // プロパティ "name" の値は "太郎"
age: 30, // プロパティ "age" の値は 30
job: "エンジニア" // プロパティ "job" の値は "エンジニア"
};
console.log(person.name); // "太郎" と表示される
固定されたプロパティやメソッド名を使う場合は、ドット記法が推奨されます。コードの可読性が高く、一般的に使われるケースが多いためです。
・ブラケット([])記法を使う。
基本構文
オブジェクト[プロパティ名] //プロパティは変数や動的な値も可
オブジェクト["メソッド名"]();
配列[インデックス番号]
・プロパティ名が変数や文字列で動的に決まる場合は、ドット記法では使うことができません。
・プロパティ名に空白や記号が含まれている場合、ドット記法は使えないので、ブラケット記法を使います。
console.log(person["age"]); // 30 と表示される
・ドット(.
)記法の場合、console.log(person.age); のように ドット(.
)で区切るだけ
・ブラケット記法の場合、["age"]のように""をつけなければならない
※console.log(person)にすると3つの要素が全て表示される
ドット記法が使えないケースのまとめ
①プロパティ名が変数で決まる場合:
例:let propName = "name"; person[propName]
②プロパティ名に空白や特殊文字が含まれる場合:
例:person["first name"], person["age!"]
③プロパティ名が動的に生成される場合:
例:ループの中で生成されたプロパティ名 user["user" + i]
ドット(.
)記法とブラケット([])記法のまとめ
① プロパティ(固定された文字列)
- 内容:オブジェクトが持つ固定されたデータ。
- アクセス方法:ドット記法 or ブラケット記法。(可読性の観点からドット記法が推奨)
- 例:javascriptコードをコピーする
let person = { name: "太郎" };
console.log(person.name); // ドット記法
console.log(person["name"]); // ブラケット記法
② プロパティ(動的)
- 内容:変数や条件に応じて決まるプロパティ。
- アクセス方法:ブラケット記法のみ。
- 例:javascriptコードをコピーする
let propName = "age"; let person = { age: 25 }; console.log(person[propName]); // 変数を使った動的アクセス
③プロパティ(特殊な文字や空白を含む)
- 内容:特殊な文字(!など)や空白を含むプロパティ。
- アクセス方法:ブラケット記法のみ。
- 例:
person["age!"]
,person["first name"]
④ メソッド(関数を含んだプロパティのこと)
- 内容:オブジェクトに保存された関数(動作や機能)。
- アクセス方法:ドット記法 or ブラケット記法。(可読性の観点からドット記法が推奨)
- 例:javascriptコードをコピーする
let calculator = { add: function(a, b) { return a + b; } }; console.log(calculator.add(2, 3)); // ドット記法
console.log(calculator["add"](2, 3)); // ブラケット記法
プロパティの追加や変更:
let person = {
name: "太郎", // プロパティ "name" の値は "太郎"
age: 30, // プロパティ "age" の値は 30
job: "エンジニア" // プロパティ "job" の値は "エンジニア"
};
// オブジェクトが定義された後に、新しいプロパティを追加
person.country = "日本"; // 新しいプロパティ "country" を追加
// プロパティ "country" が追加されたオブジェクト全体を確認
console.log(person);
// 出力結果: { name: '太郎', age: 30, job: 'エンジニア', country: '日本' }
// "country" プロパティだけを表示
console.log(person.country); // "日本" と表示される
・上記コードのように後からプロパティを追加する方法は、動的にデータを扱う場面などでは有用です。しかし、コードの可読性が低くなる可能性があるため、慎重に使う必要があります。
・上記コードの{}内に直接追加する方法は、コードがシンプルで可読性が高く、オブジェクトの全体像が把握しやすいので、多くの場合はこの方法が推奨されます。
let person = {
name: "太郎", // プロパティ "name" の値は "太郎"
age: 30, // プロパティ "age" の値は 30
job: "エンジニア" // プロパティ "job" の値は "エンジニア"
};
person.age = 31; // "age" プロパティの値を変更
console.log(person.age); // 31 と表示される
最初から値を正しく設定する方法は、データが固定されていて変更されることがない場合にはシンプルで効率的です。後から値を変更する方法は、プログラムが動的にデータを処理したり、状況に応じて値を変えたりする必要がある場合に有効です。
10. 配列の基礎
配列(Array)とは?
配列は、複数の値を1つの変数にまとめて管理できるデータ構造です。配列の各要素には**インデックス番号(0から始まる番号)が割り当てられており、順番にアクセスすることができます。JavaScriptでは、配列は[]
(角括弧)**を使って作成します。
オブジェクト:プロパティ(key)と値(value)
- プロパティ(key)と値(value)のペアでデータを管理する。
- プロパティ(key)は任意の文字列(プロパティ名)を使える。
- 順序は関係ないデータを管理するのに適している。
配列:
- 値のリストとしてデータを管理する。
- **インデックス番号(0から始まる)**で要素にアクセスする。
- 順序が重要なデータを管理するのに適している。
※プロパティ(key)と値(value)のペアを使う形は配列ではできない(オブジェクトで行う)
配列の基本的な作成方法:
let fruits = ["りんご", "バナナ", "みかん"];
・fruits
は配列変数です。
・配列内には、"りんご", "バナナ", "みかん" の3つの要素が含まれています。
・配列のインデックス番号は0から始まります。
配列の要素にアクセスする方法:
配列の要素にアクセスするには、インデックス番号を使います。
let fruits = ["りんご", "バナナ", "みかん"];
console.log(fruits[0]); // "りんご" と表示される
console.log(fruits[1]); // "バナナ" と表示される
console.log(fruits[2]); // "みかん" と表示される
・[0][1][2]の番号の入力は必須
・インデックス番号は0から始まるため[1][2][3]などへの変更は不可
・配列は自動的に0から順番にインデックス番号が割り当てられる
配列の長さ(要素の数)を確認する:
配列の長さを取得するには、length
プロパティを使います。
let fruits = ["りんご", "バナナ", "みかん"];
console.log(fruits.length); // 3 と表示される(要素の数)
let text = "こんにちは";
console.log(text.length); // 5 と表示される(文字数の数)
length
は、配列や文字列の要素数を取得するためのJavaScriptの組み込みプロパティで、自由に変更できない名前です。
配列に要素を追加する:
push()
メソッドを使って、配列に要素を追加することができます。
let fruits = ["りんご", "バナナ", "みかん"];
console.log(fruits.length);
fruits.push("ぶどう"); // 配列に "ぶどう" を追加
console.log(fruits.length); // 4 と表示される(要素の数)
push()メソッドを使わず下記のようにしても結果は同じです。
let fruits = ["りんご", "バナナ", "みかん", "ぶどう"];
console.log(fruits.length); // 4 と表示される(要素の数)
push
は JavaScriptに組み込まれたメソッド(組み込みメソッド)で、名前を変更することはできません。
次の pop()
メソッドも同様です。
混乱してきたのでちょっとおさらい
● プロパティ:
- データの情報を持つもの。
- 例:
length
は、配列や文字列の長さを表す。length
は、配列や文字列の要素数を取得するためのJavaScriptの組み込みプロパティで、自由に変更できない名前です。
● メソッド:
- 操作や動作をする関数。
- 例:
push
は、配列に新しい要素を追加する。 - 組み込みメソッドと自分で定義したメソッドがあり、前者は名称の変更不可、後者は可。
- pushやpopは組み込みメソッド
- greet: function()のように関数がある場合greetはメソッド(自分で定義したメソッド)greet: (※"hello"のように文字列の場合greetはプロパティ)
● 要素:
- 配列の中に入っているデータ。
- 例:
["りんご", "バナナ"]
の中の"りんご"
や"バナナ"
が要素。
● 引数:
- 関数やメソッドに渡すデータ。
- 例:
push("ぶどう")
の"ぶどう"
が引数。
配列の要素を削除する:
①配列の最後の要素を削除するには、pop()
メソッドを使います。
fruits.pop(); // 最後の要素 "ぶどう" を削除
console.log(fruits); // ["りんご", "バナナ", "みかん"] と表示される
fruits.pop()
は、配列の最後の要素を自動的に削除するメソッドです。削除したい要素を指定することはできません。pop()
は常に最後の要素を削除する動作をします。
②要素を選んで削除するには、splice()
メソッドを使います。
let fruits = ["りんご", "バナナ", "みかん", "ぶどう"];
fruits.splice(2, 1); // インデックス2の "みかん" を削除
console.log(fruits); // ["りんご", "バナナ", "ぶどう"] と表示される
fruits.splice(2, 2); // インデックス2から2つの要素("みかん" と "ぶどう")を削除
console.log(fruits); // ["りんご", "バナナ"] と表示される
pop()
は常に配列の最後の要素を削除します。特定の要素を削除したい場合は splice()
など他のメソッドを使う必要があります。
splice(2, 1)の2は削除するインデックス番号、1はその指定したインデックス番号からいくつ削除するかの数字。
11. イベント処理(ユーザーが操作したときの反応)
イベント処理とは?
イベント処理とは、ユーザーがWebページで操作を行ったときに発生する反応を指します。イベントは、たとえばボタンをクリックしたり、キーボードのキーを押したりすることによって発生します。それに応じて特定の処理(関数)を実行する仕組みがイベント処理です。
よく使われるイベントの例:
・クリック(click):ボタンやリンクをクリックしたときに発生。
・キーボード入力(keydown、keyup):キーを押したり離したりすると発生。
・マウス操作(mouseover、mouseout):マウスを要素の上に置いたり離したりすると発生。
イベントリスナーとは?
イベントリスナーは、特定のイベントが発生したときに実行する関数(処理)を登録するためのものです。イベントが発生すると、このリスナーに登録された関数が自動的に実行されます。
基本的な構文:
element.addEventListener("イベント名", 関数);
・element
:イベントを監視する要素(ボタンやリンクなど)。
・addEventListener
:イベントリスナーを登録するメソッド。
・イベント名
:どのイベントを監視するかを指定(click
や keydown
など)。
・関数
:イベントが発生したときに実行される処理。
addEventListener は、イベントが発生したときに反応を指定するための便利なメソッドであり、今は「イベントを監視して、その時に処理を実行できる」という基本の概念を理解することが重要です。具体的にどんなイベントがあり、どのように処理されるのかを少しずつ覚えていけばOKです。
ここで覚えておくべきポイント:
・addEventListener は、ユーザーがクリックやキー操作をしたときに特定の処理を実行するためのメソッド。
・「イベント処理」全般は、ユーザー操作に対する反応を作ることが目的。
今後さらに進んで学んでいくうちに、もっと詳しく掘り下げる必要が出てきますが、まずはこの程度の認識で問題ありません。
クリックイベントの例:
<button id="myButton">クリックしてね</button>
<script>
let button = document.getElementById("myButton");
button.addEventListener("click", function() {
alert("ボタンがクリックされました!");
});
</script>
HTML部分(ボタンの作成)だけ解説:
・タグでボタンを作成しています。
・id="myButton" は、このボタンに付けた一意のIDです。このIDを使ってJavaScriptでボタンを操作します。
・ボタンのラベルは 「クリックしてね」 というテキストです。
※このコードでは、ボタンがクリックされたときに「ボタンがクリックされました!」というアラートが表示されます。
現時点では、**「クリックイベントというものがあって、ユーザーがボタンをクリックしたときに何かが起こる」**という認識だけで十分です。詳細な仕組みやコードの動作については、今後学んでいく中で自然と理解が深まっていきます。
まずは、「こういうイベント処理ができるんだな」とざっくりしたイメージを持っていれば大丈夫です。
よく使われるイベントの種類:
・click:要素をクリックしたとき。
・mouseover:マウスが要素の上に来たとき。
・keydown:キーが押されたとき。
・submit:フォームが送信されたとき。
簡単なまとめ
・イベント処理は、ユーザーの操作に応じて反応するための仕組みです。
・イベントリスナーを使って、どの要素でどんなイベントが発生したら何をするかを定義できます。
12. 繰り返し処理の追加学習(forEach など)
forEach
と for
ループ、 while
ループは繰り返し処理という点では似ていますが用途が異なります。forEach
は配列専用のメソッドで、配列に対して使うと非常に便利です。配列のすべての要素を順番に処理する際に特化しています。for
ループや**while
ループ**は、より汎用的な繰り返し処理です。配列に限らず、様々な場面で条件を使って繰り返し処理を行えます。forEach
にできて、for
ループや while
ループにできないことは基本的にはありません。
forEach
メソッドとは?
forEach
は、配列の各要素に対して1回ずつ指定された処理を実行するためのメソッドです。配列のすべての要素にアクセスし、同じ処理を繰り返すときに便利です。
基本的な構文:
array.forEach(function(要素, インデックス, 配列) { //array はただの仮の名前
// 処理内容
});
・要素:現在の要素(必須)。
・インデックス:現在の要素のインデックス番号(オプション)。
・配列:元の配列(オプション)。
※array
は単に**「配列」**を指す一般的な名前として使われているだけ。具体的な配列名を入れる必要あり。
※forEach(function(…))のようにforEachとfunctionはセット
※※ふつうはfunction 〇〇()のように〇〇という関数の名前を付けるが、〇〇の部分がないものを無名関数と呼ぶ
例:配列の要素を表示する forEach
let fruits = ["りんご", "バナナ", "みかん"];
fruits.forEach(function(fruit) {
console.log(fruit);
});
結果:
"りんご"
"バナナ"
"みかん"
forEach は、配列の各要素に対して順番にアクセスし、console.log(fruit) でそれぞれの要素を出力します。
●fruits
と fruit
の役割:
・fruits:(グローバル変数)
配列全体を指します。この場合、fruits は ["りんご", "バナナ", "みかん"] という配列を指しており、複数の要素が入った配列です。
この配列に対して、forEach メソッドを使って各要素にアクセスし、処理を実行します。
・fruit:(ローカル変数)(forEach
内だけで使える)
配列 fruits の各要素を指しています。forEach は配列の各要素に対して順番に処理を行うので、ループのたびに1つの要素(この場合は "りんご"、"バナナ"、"みかん")が fruit に渡されます。
つまり、fruit はループのたびに fruits の中の1つの要素を表します。
●なぜfruits
と fruit
を使い分ける必要があるのか
letの変数fruitsとforEachの変数fruitを区別するため。
●forEach
の仕組み:
①fruits.forEach(function(fruit) {…}) の部分で、fruits という配列に対して forEach メソッドが呼び出されています。
・ここで、forEach メソッドは、fruits 配列内の全ての要素に対して処理を繰り返します。
②function(fruit) の fruit は、ループごとに fruits 配列内の1つの要素が渡される引数です。
・forEach は配列の各要素を自動的に探して順番に fruit に渡していきます。
・例えば、1回目のループでは fruit に "りんご" が渡され、2回目のループでは "バナナ" が渡されます。
追加の解説
forEach の動作の仕組み:
①forEach メソッドは、配列の各要素に対して1回ずつ関数を実行します。
②配列の各要素が、関数の引数(ここでは fruit)に順番に自動的に渡されます。
・1回目のループでは、配列の最初の要素 "りんご" が fruit に代入されます。
・2回目のループでは、次の要素 "バナナ" が fruit に代入されます。
・3回目のループでは、最後の要素 "みかん" が fruit に代入されます。
let fruits = ["りんご", "バナナ", "みかん"];
// "fruit" は自分で決めた名前だけど、配列の要素が順番に渡される
fruits.forEach(function(fruit) {
console.log(fruit); // 1回目は "りんご", 2回目は "バナナ", 3回目は "みかん" が表示される
});
どう結びつくのか:
・forEach が実行されると、配列 fruits の各要素("りんご", "バナナ", "みかん")が順番に fruit という引数に渡されます。
・自分で fruit という名前を付けた引数には、forEach が自動的に現在の要素を代入します。
・そのため、fruit は1回目には "りんご"、2回目には "バナナ"、3回目には "みかん" になります。
※fruitの代わりにitem
という名前を使っても同じです。forEach
は各要素を順番に引数に渡すので、その引数の名前が item
であっても、1回目は "りんご"
、2回目は "バナナ"
、3回目は "みかん"
という具合に、自動的に結びつきます。
まとめ:
・forEach は、配列の要素を1つずつ引数に自動的に渡すメソッドです。
・引数名(この場合 fruit)は自由に決められますが、その引数に配列の現在の要素が自動で代入されます。
・だから、fruit という名前を使っても、item という名前を使っても、どちらでも配列の要素が順番に結びついて処理されるというわけです。
forEach
の特徴(便利な点):
●配列専用で使いやすい:
forEach は、配列に対する処理を簡潔に書けるように設計されています。例えば、インデックス管理やループ条件を書く必要がないため、配列を操作するときにはシンプルに書けます。
●可読性が高い:
配列の各要素を順番に処理する場合、forEach はコードが短くて分かりやすいです。特に、配列の中身を処理するだけの場合は、forEach の方が見やすくなります。
●自動的に全要素を処理:
forEach は配列のすべての要素に対して自動的に処理を行います。配列の長さを意識する必要がありません。
簡単なまとめ
●forEach メソッド:配列の各要素に対して指定した関数を順番に実行するためのメソッド。
●基本的な構文:
array.forEach(function(要素, インデックス, 配列) {
// 処理内容
});
●引数:
要素:配列の現在の要素。
インデックス:現在の要素の位置(省略可)。
配列:元の配列(省略可)。
●無名関数と名前付き関数:
・無名関数:その場で定義する一時的な関数。(一般的なパターン)
※無名関数は、一時的にその場で関数を使いたい場合や、関数を再利用する必要がない場合に便利です。短く書けるため、よく使われます。
・名前付き関数:事前に定義して forEach に渡すことも可能。
※も名前付き関数は、関数を再利用したい場合や、コードを整理したい場合に便利です。関数に名前を付けることで、後で何度も呼び出すことができます。
●繰り返し処理の違い:
forEach:配列のすべての要素に対して自動的に処理を実行。
for や while ループ:条件に基づいて繰り返し処理を行う。break や continue が使える。
●注意点:
forEach はループを途中で終了できない(break や continue が使えない)。
関数内で使用される変数はローカル変数になる。
本日の感想
ここまで4時間半くらい。少しずつ学習スピードが上がってきたような気がします。これから余った時間でセミナーの発表準備をします。
9日目の記事はこちら
JavaScript初級編part4 9日目 2024/10/15(お金持ちまでの道のり)
11日目の記事はこちら
Javascript オフジェクト&配列の応用 11日目 2024/10/17(お金持ちまでの道のり)
ここに初めて来た人はゼヒ0日目を読んでください。プログラミング知識0のおじさんがお金持ちになるまでのプランと熱い思いが載っています。私と一緒に運要素を排除したゴリゴリの脳筋プレイでお金持ちを目指しませんか?
0日目の記事はこちら
お金持ちまでの道のり:0日目
コメント