これは Jeremy Thomas 氏のJavaScript in 14 minutesを 岡田洋が日本語に翻訳したものです。 著作権等はオリジナルのものに準じます。
Web design in 4 minutesを習得したので、Webのためのプログラム言語 JavaScriptを勉強しましょう。
by Jeremy Thomas(日本語訳 岡田洋)
これは Jeremy Thomas 氏のJavaScript in 14 minutesを 岡田洋が日本語に翻訳したものです。 著作権等はオリジナルのものに準じます。
Web design in 4 minutesを習得したので、Webのためのプログラム言語 JavaScriptを勉強しましょう。
お使いのブラウザには、WebページにJavaScriptを直接入力できるデベロッパーコンソールが付属しています。
あなたは Apple Safari を使っていますね。
ちゃんと動いていると確認しましょう!
コンソールで以下の物を入力して、Enter(↵)キーを押してください。
alert('Hello World!')
あなたは alert()
という関数(function)を'Hello World!'
という 引数で呼び出しました。
あなたは基本的に以下の4つのことをしました。
alert('Hello World!')
alert('Hello World!')
alert('Hello World!')
alert('Hello World!')
引数がない場合もあります。
複数の引数がある場合もあります。
関数には、ほとんど場合引数が必要ですが引数が省略できる場合もあります。
この場合、 alert()
は一つの引数を必要とします。
しかしどんな 型の引数 なのでしょうか?
あなたがテキストを扱う時には、文字列(string)を使います。文字列(string)は連続した文字(character)です。この場合、連続した12文字を使いました。
Hello World!
。 この文字列には英大文字、英小文字、空白、ビックリマークを含んでいました。
文字列の 開始位置 と終了位置を指定するため、文字列をクオーテーションマーク で囲みます。(シングル−クオート '
でもダブルクオートでも "
開始と終了で一致していればOKです。)
あなたが 'Hello World!'
という文字列(string)を定義したとき:
文字列の代わりに 数値を使ったらどうなるでしょうか?
他のプログラム言語と同様、 JavaScriptも 数値(number)を扱うことができます。
これらの数値は、大きくても小さくてもよく、小数点があってもなくてもよく、数値演算によって結合されます。
以下のものをコンソールに入力して(もしくは貼りつけて)下さい。
alert(9+5 * 3)
以下の事に注目してください
+
と *
という 演算子(operator)を使いました。5 * 3
が計算され次に 9 + 15
が計算されました。*
の周りの 空白 は出力に関係しません。 それらは単に私たち(人間!)がコード読む時にのみ役立ちます。 あなたは いろんな所で数値を見るでしょう。
数値はあらゆる所に現れます! とくにWebブラウザでは.
例を上げると、あたたが今使っているWebブラウザのウィンドウはあなたがJavaScriptを使って取得できる幅(width)をもっています。
以下のように入力してください。
alert(window.innerWidth)
これはあなたのブラウザのウィンドウの幅が 1680 ピクセルであることを意味します。
あなたが想像しているように window.innerHeight
(ウィンドウの(内側の)高さ) も存在します。また現在のスクロール位置である window.scrollY
も存在します。
けれど window
とは 実際には何でしょうか?
window
は JavaScript のオブジェクト(object)です。
innerWidth
は window
オブジェクト(object) の プロパティ(property)です。
このプロパティにアクセスするには、 window
オブジェクト内に存在するinnerWidth
を指定するためにドット.
を使用しました。
JavaScriptのオブジェクト(object)は基本的に他のものを含む型です。
例えば window
オブジェクトは以下のような物も含んでいます。
window.origin
は文字列です。window.scrollY
は数値です。window.location
はオブジェクトです。 window
が別のオブジェクトである location
を含んでいます。これは JavaScript の オプジェクトの典型的な例です…
オブジェクトのプロパティそれ自身がオブジェクトにであることがあります。
window.location
もまたオブジェクトなのでそれ自身のプロパティを持ちます。 それらのプロパティーにアクセスするためには、さらにもう一度ドット .
とプロパティーの名前を追加します。
例えば href
というプロパティーがあります。
alert(window.location.href)
あなたはこのWebページの完全なURLを表示しました。どうしてこうなったのでしょうか。
window
はオブジェクト(object)ですlocation
もオブジェクト(object)ですhref
は文字列(string)です
オブジェクトの入れ子の深さに制限はありません。
オブジェクトが持つことができるプロパティの数にも制限はありません。
これまで見てきたように、オブジェクトのプロパティは、文字列、数値、オブジェクト、さらには関数のいずれの型であってもかまいません。後者の場合、それはこう呼ばれます…
オブジェクトのプロパティが関数である場合、メソッドと呼ばれます。
実際には、これまで使用してきたalert()
関数はwindow
オブジェクトのメソッドです!
window.alert('OMG')
window
はブラウザのトップレベルのオブジェクトなので、すべてのプロパティとメソッドに直接アクセスできます。
そのため、 location.href
と入力するのは、window.location.href
と入力するのと同じです 。
同じようにalert()
はwindow.alert()
と同じです。
オブジェクトは、同じ名前と可視範囲(scope)でいくつかのプロパティをグループ化し、データ内に階層を定義するのに便利です。それは、枝が他の小さな枝を持つことができる木のようなものです。
しかし、もしあなたがリスト(一覧表)のようなものしか必要としないなら…
JavaScript のArray(配列)は、あたかも順序付きのリスト(一覧表)のように、複数の値を含むことができる型です。
alert()
関数に3つの文字列が入った配列を渡しましょう。
alert(['What', 'is', 'up'])
alert
関数を呼び出す構文はすでに分かっていますね。alert(パラメータ)
です。
この場合、パラメータは次のように定義した3つの項目を持つ配列です。
['What', 'is', 'up']
['What', 'is', 'up']
['What', 'is', 'up']
['What', 'is', 'up']
['What', 'is', 'up']
配列には文字列、数値、オブジェクト、他の配列、さらに色々なタイプの項目を含めることができます:
次の短いコードを試してみてください。
alert([2 + 5, 'samurai', true])
最初の項目2 + 5
は数値です。2番目の項目'samurai'
は文字列です。
3番めのパラメータは何でしょうか? それはクオーテーションマークで囲まれていないので文字列ではなく、数字でもありません。
それでは、一体これは何でしょう?
文字列と数値には無限のとり得る値がありますが、 Boolean(真偽値)はtrue(真)
またはfalse(偽)
のいずれかの値にしかなりません。
今、alert()
関数と3つの項目をもつ配列を一つの行に含めているの、コードが読みにくくなっています。
配列を独自の行に移動して2つに分割してはどうしょうか。
配列を変数に移動することができます。
変数は、特定の値を格納する入れ物です。それは名前を持っています(それを特定して再利用することができます)。そして値をもっています。(後で値を更新することができます)。
var my_things = [2 + 5, 'samurai', true];
my_things(僕の物)
は変数の 名前 です。
[2 + 5, 'samurai', true]
は変数の 値 です。
分解すると次のとおりです。
var
を入力しましたvar my_things = [2 + 5, 'samurai', true];
var my_things = [2 + 5, 'samurai', true];
=
を入力しました。var my_things = [2 + 5, 'samurai', true];
var my_things = [2 + 5, 'samurai', true];
var my_things = [2 + 5, 'samurai', true];
これは my_things
が [2 + 5, 'samurai', true]
と同じであることを意味します。
alert
を関数を書き直しましょう。
今や2つの文があるので、あるものがどこで終わり、次のものが始まるかを知るためにセミコロン;
で区切る必要があります
var my_things = [2 + 5, 'samurai', true];
alert(my_things);
配列に変数を格納することで、コードを読みやすくしました 。
この変数にはいくつかの項目の配列(リスト)が含まれていますが、配列(リスト)の1つの項目のみを扱うこともできます。
配列の特定の項目にアクセスするには、まず配列内のインデックス(位置)を知る必要があります。 このインデックスは大括弧で囲む必要があります 。
どの項目が表示されるのか推測できますか?
var my_things = [2 + 5, 'samurai', true];
alert(my_things[1]);
2番目のアイテムが現れました! プログラミングでは、インデックスは0
から始まります。
my_things[1]
my_things[1]
my_things[1]
my_things[1]
変数もやはりオブジェクトです! つまり、変数にもプロパティとメソッドがあります 。
たとえば、my_things
にはlength
というプロパティがあります。
var my_things = [2 + 5, 'samurai', true];
alert(my_things.length);
現在、配列には3つの項目があります。 my_things
項目を追加または削除すると、length
値がそれに応じて変更されます。
可読性とプロパティを持っていることは便利ですが、変数の主なポイントは編集可能であることです。後で値を変更することができます!
var my_things = [2 + 5, 'samurai', true];
alert(my_things);
my_things = [2 + 5, 'samurai', true, 'LOVE'];
alert(my_things);
警告(alert)ボックスは2つ表示されましたが、値は異なります。これは、最初の呼び出しと2番目の呼び出しの間で、 my_things
の値が更新されたためですmy_things
の4番目の項目として文字列'LOVE'
が追加されました。
2回目にmy_things
に値を割り当てる時には、var
キーワードを使用していないことに注意してください。これは、上記の2行で定義されたmy_things
変数を編集しているためです。
新しい変数を作成するときのみ、キーワードvar
を使用します。 新しい変数を編集するときは使用しません。
私はあなたに変数がメソッドを持っていると言ったことを覚えていますか?(オブジェクトなので)配列の値を編集する別の方法は、 push()
メソッドを使用する方法です。
var my_things = [2 + 5, 'samurai', true];
alert(my_things);
my_things.push('The Button');
alert(my_things);
my_things
配列は4項目に変わりました。
push()
メソッドは配列を変更しましたが、他のものは単純に値を返します。
var my_things = [2 + 5, 'samurai', true];
alert(my_things.includes('ninja'));
includes()
メソッドは文字列'ninja'
が配列内に存在するかどうかを調べます。今は存在しなかったので、メソッドはfalse
という Boolean(真偽値)を返しました。
実際、Boolean(真偽値)を扱うときは、キーワードtrue
またはfalse
を使うことは非常にまれです。通常、booleanは関数呼び出し(includes()
)や比較の結果として存在します。
以下は より大きい 比較の例です。
alert(window.innerWidth > 400)
これは、ブラウザのウィンドウが400ピクセルより広いことはないという結果を示します。
window.innerWidth > 400
window.innerWidth > 400
window.innerWidth > 400
+
と*
と同じように、 >
はJavaScript 演算子です。
"より大きい"演算子>
で比較すると、Boolean(真偽)値が得られます。
比較結果には2つの結果(true
またはfalse
) しかないので、コードが何か
決定を下す必要がある場合に便利です…
Conditional statement(条件文)は、プログラミングにおける最も重要な概念の1つです。特定の条件が満たされている場合にのみ 、コードで特定のコマンドを実行することができます。これらの条件は、例えば、
今のところ、あなたが私のドメインにいた場合にのみアラートボックスを起動しましょう!
if (window.location.hostname == 'hiroshiokada.github.io') {
alert('Welcome on my domain! 🤗')
}
ここでは別の比較を行っていますが、代わりに等しい 演算子==
使用しています。
if
を入力したif (window.location.hostname == 'hiroshiokada.github.io') {
if (window.location.hostname == 'hiroshiokada.github.io')) {
if (window.location.hostname == 'hiroshiokada.github.io') {
if (window.location.hostname == 'hiroshiokada.github.io') {
if (window.location.hostname == 'hiroshiokada.github.io') {
alert('Welcome on my domain! 🤗')
}
アラートボックスが表示されたので、 hostnameが実際に 'hiroshiokada.github.io'
に等しいことを意味します。
比較がtrue
返すケースを処理しました。
反対の場合を処理するために、ホスト名がhiroshiokada.github.io
でない場合、非等価演算子!=
を使用できます。
if (window.location.hostname != 'hiroshiokada.github.io') {
alert('Please come back soon! 😉')
}
このスニペット(コードの断片)を試してみると、何もトリガーしないことがわかります! (このチュートリアルが別のドメインにコピーされていない限り、😆)
両方のケースを同時に処理したい場合はどうすればよいでしょうか? if
文を2行書くことができます。
しかし、一方のステートメントは他方のステートメントとは
まったく反対であるため、それらをelse
ステートメントと組み合わせることができます。
if (window.location.hostname == 'hiroshiokada.github.io') {
alert('Welcome on my domain! 🤗')
} else {
alert('Please come back soon! 😉')
}
この条件文の一式で、次のことを確認できます。
残りのすべてのケース(場合)をカバーするにはelse
が便利です。しかし、時には2つ以上のケース(場合)を処理したい場合もあります。
else if
を使用して、中間の文を追加することにより、複数のケース(場合)を処理することができます。
if (window.innerWidth > 2000) {
alert('Big screen! 🔥')
} else if (window.innerWidth < 600) {
alert('Probably a mobile phone 📱')
} else {
alert('Decent size 👍')
}
1つの比較がtrue
を返すとすぐに、それがトリガーされ、後続のすべてのステートメントは無視されます。だからこそ、警告箱が1つしか現れなかったのです!
条件文は、 キーワード if
とelse
を使用し、その後に括弧というパターンを使用します 。
キーワード/括弧という組み合わせパターンは、別の必須のプログラミングコンセプトにも現れます…
コードブロックを一定回数実行する場合は、JavaScript のループを使用できます 。
あなたはこのスニペット(コードの断片)がいくつの警告ボックスをトリガーするかを当てられますか?
for (var i = 0; i < 3; i++) {
alert(i);
}
正確に3つの警告ボックスが表示されました。起こったことを分解して見ましょう。
var i = 0
は初期状態ですi
is assigned a value of zero 0
.
i < 3
は条件式です。true
であれば、ブロック内のコードを実行します。 false
場合、ループを終了します。 i++
はインクリメント(増やす)式です。i
の値は1だけインクリメント(増や)されます。
これを実装した方法は次のとおりです。
for
タイプしましたfor (var i = 0; i < 3; i++) {
for (var i = 0; i < 3; i++) {
for (var i = 0; i < 3; i++) {
for (var i = 0; i < 3; i++) {
for (var i = 0; i < 3; i++) {
for (var i = 0; i < 3; i++) {
for (var i = 0; i < 3; i++) {
for (var i = 0; i < 3; i++) {
for (var i = 0; i < 3; i++) {
alert(i);
}
ループの各反復を分析してみましょう。
反復 | i の値 |
テスト | アラートをトリガーするか |
---|---|---|---|
1回目 | 0 | 0 < 3 |
Yes |
2回目 | 1 | 1 << 3 |
Yes |
3回目 | 2 | 2 < 3 |
Yes |
4回目 | 3 | 3 < 3 |
No! |
このループにより、N回アクションを繰り返すことができました。それがコンピュータの目的です。
これまで説明してきたvariableの中で、とりわけloop(繰り返す)意味が有ります。
訳注: (variable = 変数/価値のあるもの, loop = ループ文/繰り返して勉強する) を掛けています。
プログラミングではしばしば配列の各項目に対して同じアクションを繰り返すことが多いため、ループの候補となります。
配列の各項目に対して警告ボックスをトリガーしたいとしましょう。配列のに項目があるのと同じ数のalert()
文を書くことができますが、
この解決法は面倒で効果がありません! エラーが発生しやすく、非常に沢山の項目がある配列にスケールアップすることは非現実的です。
プログラミング言語は私たちの仕事をシンプルにするためにあるので、より良い方法を見つけましょう。私たちはすでにいくつか知っています。
i
をアクセスすることができます。そして簡単に1ずつ増加できます
これらの情報を組み合わせることで、次のスニペットを思いつくことができます。
var my_things = [2 + 5, 'samurai', true];
for (var i = 0; i < my_things.length; i++) {
alert(my_things[i]);
}
1つ1つ、配列の項目がそれぞれのアラートボックスに表示されました。
ループを使用すると配列の各項目を処理するプロセスが簡素化されますが、
for
ブロックを手動で作成し、各ループの後にインクリメントする目的だけの新しい変数
i
を作成する必要がありました。
あなたが何を考えているか知っていますよ。「もっと良い方法があるはずだ!」
配列には実際にforEach()
というメソッドがあり、配列内の各項目に対してタスクを実行できます。
var my_things = [2 + 5, 'samurai', true];
my_things.forEach(function(item) {
alert(item);
});
いくつかの改善点に注目してください。
i
という変数を使わなくて済みました
length
にアクセスする必要がなくなりました。
my_thing[i]
のように使う必要がなくなりました
alert()
関数の構文を覚えていますか? それはalert(parameter)
でした
注意深く見ると、 forEach()
構文は他のメソッドと同じです。
これはforEach(パラメータ)
ですが、今、パラメータは3行にまたがる関数になっています。
ここまで、いくつかの関数とメソッドを使用しました。
alert()
関数(またはウィンドウメソッド)
push()
配列メソッド
includes()
配列メソッド
forEach()
配列メソッド
私たちは関数を呼び出す方法を知っていますが、では関数をどのように作成するのでしょうか?
プログラミング言語の力は、 あなたの自身のニーズに合った独自の関数を作成する能力です。
if/else
とfor
で使用したキーワードと括弧の組み合わせを覚えていますか?
ご想像の通り、カスタム関数の作成もほぼ同じパターンです!
唯一の違いは関数が名前を必要とするということなので、私はほぼと言っています!
greet()
というname
という1つのパラメータを持つ関数を作成し、
すぐにそれを呼び出してみましょう:
function greet(name) {
var message = 'Hey there ' + name;
alert(message);
}
greet('Alex');
あなたは最初の関数を作成しました!それは単純なものですが、それは多くを教えることができます。
いくつかのことに注目してください。
greet
です
name
と呼ばれ、値のコンテナ(入れ物)として機能するため、変数のようなものです
message
と呼ばれる(文字列)変数を作成しています。その値は'Hey there ' + name
です
+
は、2つの文字列を連結して1つの長い文字列を作成するものです
alert()
関数を呼び出し 、message
変数をパラメータとして使用します
'Alex'
を渡して呼び出します
各段階ににブレークダウンすると以下のようになります。
function
を入力しましたfunction greet(name) {
function greet(name) {
function greet(name) {
name
というパラメータを作成しましたfunction greet(name) {
function greet(name) {
function greet(name) {
var message = 'Hey there ' + name;
alert(message);
}
greet('Alex');
最後にgreet()
関数を呼び出さない限り、何も起こりません!これは、 alert()
コールがgreet()
スコープの内側にあるため、親関数greet()
自体が呼び出されない限りトリガされないためです。
基本的には、 greet()
を作成 greet()
するだけでは、ブラウザーに「ちょっと、私はこの新しい関数を作成しました。だから、ある時点で呼び出す場合は、何かを実行してください!」
と言っているだけです。
そのため、最後にgreet()
を呼び出すと、ブラウザはそのコンテンツを実行します。このコンテンツはalert()
呼び出すことになります。
関数は2段階のプロセスであることを理解することが重要です。最初に作成し後で呼び出すことです。
実際には、私たちが使ってきたalert()
関数はすでに事前に作成されています。それはちょうどあなたのブラウザのどこかに存在します。
とにかく、すでに14分で多くのことを学習しました!
それでは、 次には何をやったらよいでしょうか?
私たちここでは基本のみをカバーしています。しかし、心配しないでください!オンラインで入手できるたくさんのリソースがあります!
私がお勧めするいくつかの無料のリソースは以下のとおりです:
あなたがビデオチュートリアルを好むなら、これらをチェックしてください。Udemy courses:
あなたが急いでいる場合は、この短いコースを試してみてください!
JavaScriptは、Webページを作るものの3分の1に過ぎません!あなたは、HTMLとCSSも知る必要があります 。
幸いにも、私はあなたが参照できる2つの無料のリファレンスを作成したので、各言語が提供するすべてを学ぶことができます!
私はBulma -- 私の作った Flexbox に基づいたオープンソースのCSSフレームワーク -- で、このページを設計しました。 チェックしてください!
I wrote a 44-page PDF called "CSS in 44 minutes" which teaches how to build your own personal webpage from scratch with HTML5 and CSS3. 44ページの 「CSS in 44 minutes(44分でCSS) 」というPDFを書いて、 HTML5やCSS3を使って自分の個人用ウェブページを最初から作り上げる方法を教えています。
ボーナスとして、本書にはJavaScriptに関する小さな章も含まれています。ここでは、関数、条件文、オブジェクト、文字列について説明し、CSSとのやりとり方法についても説明します。