humanIsFlyable;console.log(someoneIsFlyable);console.log(everyoneIsFlyable);OR演算は片方でも成立しているか、AND演算は両方とも成立しているかを調べることができているのを確認できます。NOT演算というものもあります。これは先頭に「!」をつけることで、真偽値を反転させることができるものです。効果を発揮するのは、比較演算子を使用したときです。比較演算子はその名の通り2つの値を比較する演算子で、評価結果が真偽値になります。比較演算子には以下のものがあります:===(等しい)!==(等しくない)>(大きい)>=(以上)<(小さい)<=(以下)===と!==は全ての型の値に対して使用できます。その他の比較演算子は主に数値に対して使用しますが、文字列を辞書順で比較することも可能です。trueconsole.log(comparison1);console.log(comparison2);console.log(comparison3);注意点として、比較演算子はあくまで演算子であり、「+」や「*」などと同じ働きをすると言うところです。比較演算子は不等式を表すものではありません。3;console.log(comparison);実行してもエラーは出ませんが、予期せぬ結果となります。'abc';console.log(comparison);また、型が違うと異なる値となります。'12';console.log(comparison);文字列に値を埋め込むJavaScriptには、文字列の途中に値を文字列化して埋め込む機能があります。便利なのでちょっと触ってみましょう。通常の文字列はシングルクォートを使って作りましたが、値を埋め込む時はバッククォート(`)を使います。この記号はshiftキーを押しながら@キーを押すと出てくるはずです。シングルクォートをバッククォートに置き換えて、あとは文字列中に「${値}」と書き込むことで、値を埋め込むことができます。文字列への値の埋め込みconsole.log(`BMIは${bmi}です。`);このとき、単なる値だけでなく、式も埋め込むことができます。heightMeter)}です。`);ただし、あまり複雑な式を埋め込むと読みにくくなるので、できるだけ変数を作ってそこに代入してから、文字列の中に埋め込んでください。ここまでのまとめ数値、文字列など、JavaScriptでは様々な値が存在します。値の種類は「型」と呼ばれていて、値の型によって挙動も異なります。数値型は基本的な計算ができますし、文字列型は文字列型同士の結合などができます。このとき、演算を行う記号のことを演算子と言いました。値はそのまま使うことはまずありません。変数と呼ばれる別名を宣言して、そこに代入するのが一般的です。変数は一度宣言すれば好きな場所で使うことができ、値に名前がつくことでプログラムが読みやすくなります。変数の宣言にはconstとletがあり、constは一度宣言・代入したら値の変更は不可能です。letで宣言された変数は何度でも値を変更でき、宣言時に代入を行わないといったこともできます。数値や文字列といった馴染み深い型の他に、真偽値型という値もあります。これは真か偽かを表す値で、条件の成立やフラグ管理などで使用されます。JavaScriptでは文字列の中に値を埋め込むことが可能です。シングルクォートのかわりにバッククォートを使うことで、値の埋め込みを可能にします。例題:円周率を3.14としたとき、半径(radius)が5の円の面積をコンソールに表示するプログラムを書け。3.14);これでも、もちろん動作には問題ありません。これではなんの計算をしているかわかりにくいという問題があります。pi;console.log(`半径${radius}の円の面積は約${area}です。`);この例では、出力も工夫し、文字列を使うことでわかりやすくしています。条件分岐とループ今までは、プログラムの流れが全く決まってしまっている、一直線なものを作りました。今度は分岐やループを用いて、少し複雑な流れを持つプログラムを作成してみましょう。if文(条件分岐)条件によって処理の流れが変化する、いわゆる条件分岐を持つプログラムを作成してみましょう。条件分岐はif文によって実現できます。真偽値がfalseの場合はここが実行される}真偽値の部分は、主に比較演算子などを用いた式であることが一般的です。こちらは実行されない}console.log('おわりです!');これを実行すると「3は5より小さいです!」「おわりです!」と出力されます。7行目は実行されません。現実ではもう少し複雑な式を使います。console.log(`${value}は奇数です!`);}このときvalueを2で割ってそのあまりが0であるとき、つまり偶数であるとき、ifの中を実行し、そうでない場合elseの中を実行するプログラムになっています。valueの値をいろいろ書き換えて実行してみてください。elseは省略することもできます。console.log('すごい!');}console.log('じゃあね。「わりとすごい!」と表示される。console.log('わりとすごい!')}console.log('じゃあね。ifをぶら下げることも可能です。elseの順番でなければなりません。インデント(字下げ)ところで気づかれた方もいるかと思いますが、if文の中身、「{」から「}」までの間、行の先頭にスペースが入っています。これはインデント(字下げ)と呼ばれ、コードを見やすくするためのものです。インデントにプログラム的な意味はありません。見栄えを調整するためだけのスペースです。「この行はこの文の中に存在する」ということが一目でわかると言うことは、コードを書いていく上で非常に重要となってきます。{console.log('えらい!');}}これを理解するのはそんなに難しくありませんが、少し時間がかかってしまいます。人によっては流れがわからないこともあるでしょう。}}if文の中にif文があって、その中にconsole.logがあるということがわかりやすくなりました。インデントは一般的にスペース2個や4個、タブが使われます。JavaScriptにおいては、多くの場合スペース2個かスペース4個が使用されます。Atomの標準設定ではスペース2個になっているはずです。インデントにプログラム的な重要性はありません。わかりやすいということはそれだけ優れたコードであるということです。優れたプログラマは理解しやすいコードを書くものです。switch文(条件分岐)例えば変数の値に応じてプログラムの動作モードを切り替えたいとします。console.log('無効なモードです');}これでも問題ありませんが、少し煩雑です。いったときはswitch文を使うと、少し書きやすくなります。console.log('無効なモードです')}switch文の中では、caseを使い場合分けをします。今回は数値での場合分けですが、switch文に文字列を渡せば、文字列での場合分けも可能です。if文でのelseにあたるのがdefaultで、どのcaseにも一致しなかった場合に実行されます。if文と違う点は、break命令によって明示的にswitch文を終了させないといけないことです。1まで実行されてしまいます。この特性はフォールスルーと呼ばれています。switch文はif文と実現できることが大して変わらない点や、breakを忘れるとフォールスルーが発生してしまうという点もあり、あまり積極的には使われない文です。使わないというわけでもないので、一応覚えておきましょう。while文(ループ)プログラムでは、同じ処理を何度も繰り返す、ということがよくあります。そのときに何行も何行も同じ処理を書き続けるのは苦痛ですし、例えば100回繰り返すとして、ミスを発見して修正を加えようとしたら100箇所も書き換えないといけないのです。そんなことはやってられません。プログラミング言語にはたいていループ(繰り返し)処理を実現するための構文があります。while文はそんなループ処理のうちのひとつです。//trueの間ここを繰り返す}書き方はif文と似ていますね。違うのは、真偽値がtrueである間、「{」から「}」までの間のプログラムを繰り返し実行するという点です。一般的に、while文のループ条件には変数を使い、while文の中で変数の値を書き換えつつ、ループが終わるのを待ちます。変数の値を書き換えていくので、宣言はletで行います。ここまできたらもう一度「A」まで戻るこれは宣言した変数countが、10未満である間繰り返すというwhile文です。while文の中でcountを増加させており、10回実行したら終わります。while文には注意点があります。それは真偽値がtrueである間はずっと繰り返されるので、少しのミスで「無限ループ」となり、プログラムが止まらなくなってしまうのです。ブラウザ上で実行するときは無限ループに陥ると、ブラウザが「長い時間がかかっていますが中止しますか?」と尋ねてくるので、中止することでプログラムを停止することができます。}これは条件式を変数に代入して実行しようとしています。賢いですが、少し見落としがあります。JavaScriptにおいては、条件式に限らず、式の評価はその場で行われます。true;」と評価されるので、condは常にtrueです。後からcountの数字を書き換えても意味がありません。while文は途中で抜け出すことも可能です。}}このコードはcountが5になった段階でbreakしてwhile文を抜け出しています。breakすると無条件で抜け出してしまうので、while文の条件は関係ありません。抜け出すとまではいかなくとも、途中でwhile文の先頭に戻ってループを続けたい場合というのもあります。このときはcontinueを使うことで実現できます。console.log('ここは実行されない');}breakもcontinueもあまり使う機会は多くありませんが、覚えておくと便利です。for文(ループ)while文は便利な一方ですぐに無限ループに陥る扱いにくさもありました。そこで、もう少し扱いやすくしたfor文というものもあります。for文は「カウント変数の初期化」「ループの条件」「カウント変数の変化」の3つの部品から構成されています。count++;}また、3つの部品のうちから好きなものを省略することもできます。セミコロンだけは省略できません。<10)と同じになります。全て省略してfor(;;)と書くと無限ループになります。while文と同じく、breakやcontinueも使えます。while文とfor文の使い分けというのは、しばしば問題になります。どちらも実現できることは結局同じだからです。使い分けに関しては個人の好み、としか言いようがありませんが、一般的には普通はfor文、特殊なループを行う際にはwhile文、というのが多いように思えます。例題:0から100までの間の数を順番にコンソールに表示せよ。「0は偶数です」「1は奇数です」などというように、偶数奇数のどちらであるかについても表示せよ。これはまずはループを使うと0から100まで簡単に繰り返せます。今回はfor文を採用します(もちろんwhile文でも構いません)。ここに処理を書く}そして変数nの値が偶数か奇数であるかを、if文を使って条件分岐します。割った余り(%演算子を使う)を見れば偶数かそうでないかの判定ができます。}}これを実行してみます。表示されました!100まで表示されていることを確認してください。変数のスコープ(有効範囲)今まで話していませんでしたが、実は変数には有効範囲が存在します。この有効範囲のことをスコープと言います。一般に変数のスコープはブロックの中です。ブロックというのは「{」から「}」までの間のことです。if分やwhile文、for文で見かけた記号ですね。ブロックの中で宣言された変数は、ブロックを抜け出すとアクセスできなくなります。if文のブロックの中で変数を宣言したとします。このとき、ブロックの外からではその変数にはアクセスできなくなります。messageにアクセスできないこれを実行すると「messageは未定義です」とエラーが出ました。このようにして、変数を扱うにはスコープを意識する必要があります。逆に、ブロックの外で宣言された変数は、ブロックの中からアクセスすることが可能です。これは今までの例から見ても明らかでしょう。難しいのはループにおけるスコープです。ループにおいては、各繰り返しごとにループ内で宣言した変数が無効になります。console.log(sq);}一見すると変数sqの宣言が10回重複しているように見えますが、各繰り返しごとに変数sqが無効になるので、これは正しいプログラムです。スコープの概念はまだ今回の段階では重要ではありませんが、徐々に重要になってきます。今は完全に理解しなくても良いので、頭の片隅にでも残しておきましょう。今回のまとめ今回はJavaScriptの基本的な文法について学びました。値、データ型、変数、どれもプログラミングにおいて大変重要な要素です。これらの要素には、これからずっとお世話になるでしょう。条件武器やループといった、プログラムの流れを制御する構文についても学びました。条件分岐やループを駆使することで、高度なプログラムを組むことができます。JavaScriptを習得すれば、世界が一気に広がります。ウェブページを動かすこともできますし、ウェブアプリを作ったりもできます。ゲームだって作れます。最近ではJavaScriptでスマートフォンアプリを作ったり、デスクトップアプリが作れるようにもなっています。サーバサイドのプログラムを書くことにも使えます。なんでもできるようになります。始まったばかりで、なかなか苦戦していると思います。今回学んだ基礎的な部分が一番難しく、後の要素は基礎の応用だけで理解できるようになっているので、頑張ってみてください。例題1例題:西暦が与えられたとき、昭和ならば「西暦xxxx年は昭和xx年」、平成ならば「西暦xxxx年は平成xx年」とコンソールに表示するプログラムを作成せよ。与えられる西暦は1930年から2018年までに限るとする。これの解き方は簡単で、与えられた西暦から平成元年である1989年を引いて、もし0以上なら平成、マイナスなら昭和、と判別することができます。ここでif文を使って場合分けして、それぞれの表示をしましょう。console.log(`西暦${year}年は平成${heiseiYear}年です。console.log(`西暦${year}年は昭和${syouwaYear}年です。`);}これで適切に表示されるはずです。yearの値を様々に変更して、結果が変わるのを確認してください。例題2例題:2の累乗の値を、0乗から5乗までコンソールに表示せよ。累乗は「**」で計算できる。2の0乗、2の1乗、2の2乗...という風に表示していくので、これはforループを使うと楽に解けます。${exp}`);}これを実行すると:ちゃんと表示されました。課題ここから先は課題です。自分の力で解いてみましょう。課題のjsファイルをmain.jsと混ぜるとあとで管理できなくなるので、別のjsファイルに書きましょう。homework1-1.jsというjsファイルを作って、そこに書きます。homework1-1.jsを実行するには、HTMLファイルを書き換えます。</body></html>変更したのは6行目だけです。jsファイル名の指定部分ですね。これでhomework1-1.jsが実行されます。課題1(homework1-1.js)課題:0から23までのいずれかの値である整数hourを考える。このときhourが0から11までのときは「午前xx時です」、12のときは「正午です」、13から23までのときは「午後xx時です」と表示するプログラムを作成せよ。hourの値を様々に変えてプログラムが正しく動作していることを確かめよ。else、elseを使ってうまく場合分けするとよい。課題2(homework1-2.js)課題:1から100までの数をコンソールに列挙せよ。3の倍数のときだけは頭が悪くなって数字を出力できないものとする。ヒント:3の倍数は3で割った時の余りが0となる。応用課題ここに書かれているのは応用課題です。無理に解く必要はありません。通常の課題だけでは物足りない人は解いてみてください。ここでa、b、cの値が与えられたとき、xについて実数解を全て出力せよ。ヒント2:平方根はMath.sqrt命令で求めることができる。応用課題2(homework1-4.js)課題:ある整数n>2が与えられたとき、nが素数ならば「nは素数です」、素数でないならば「nは素数ではありません」とコンソールに表示するプログラムを作成せよ。ヒント1:素数とは、1と自分自身以外で割り切れない数のことである。1までの自然数で順番に割っていけばよい。ヒント3:あらかじめletで変数isPrimeをtrueで宣言・代入しておき、一回でも条件を満たさなければfalseを代入すると良い。その2:関数わからないときはこの連載記事を読んで、わからないところ、不思議なところ、納得のいかないところ等出てくると思います。そのときはTwitterで@kfurumiyaまでご連絡ください。できる範囲で回答いたします。Twitterを使えない、Twitterでは短すぎるという場合はメールアドレス:kotofurumiya@gmail.comまでご連絡ください。0.2は0.3になります。console.log('正しくない...');}これを実行すると「正しくない...」と表示されてしまいます。この謎の現象を紐解くには、JavaScriptの内部で数値がどう扱われているかを知る必要があります。コンピュータ内部では、数値は0と1の組み合わせ、いわゆる2進数で扱われます。これはみなさんご存知でしょう。小数点以下の値が存在する「実数」がどう扱われているか、知っている人は多くありません。実は実数も0と1だけの2進数で表現されています。その表現方法として、ほぼすべてのプログラミング言語では浮動小数点という形式が使われています。浮動小数点では3つの組み合わせで数を表現します。「符号(プラスかマイナスか)」「数」「指数」の3つです。11.01のようになります。0.0001100110011...循環小数になりました。循環小数は無限に続く小数で、終わりがありません。コンピュータの内部で数字を表すには、有限桁にする必要があります。合わせて64桁(64bit)しかありません。え循環小数でも無理やり64bitに納める必要が出てきます。実際は符号や指数にbitを取られるので、もっと少ない桁(52bit)で表す必要があります。すると絶対に誤差というものが出てきます。必要な情報を切り捨てているわけですからね。コンピュータは「0.1」を正確に表現できないのです。計算するごとに誤差は積み上がっていき、最終的に全く違う値になります。0.300000000000000040.30000000000000004になりました!0.3ではありません!これでは0.3と比較しても同じにならないはずです。よって、実数を比較する際は、ある程度の誤差を許容する必要があります。===で結ぶのではなく、引き算して絶対値をとって差がdelta(任意の許容誤差)未満であるといったような処理が必要になります。delta;console.log(comp);これで結果がtrueとなりました。このようにして、実数を扱う時はその誤差に気をつけてください。思わぬバグに繋がる可能性があります。最適化編RSSプロフィール古都ことふるみやことです。フロントエンドとかいろいろやるよ。