JavaScript 8日目
小なり演算子:「<」
左辺が右辺より小さいかを調べる演算子。データ型が違う場合はデータ型を合わせた上で値が等しくない場合は「false」を返す。データ型が違う場合はデータ型を合わせた上で調べる。基本的に数値の比較に使うが、文字列同士でも結果を返す。
console.log('5回目の出力');
console.log(num < 10);
console.log(num < '10');
console.log(num < 5);
console.log(num < '東京');
小なり(イコール)、大なり(イコール)演算子で文字列比較
文字列型同士の比較の場合は対象の文字の並び順で比較する。
文字数が多い場合は先頭の文字から順番に比較し、異なる文字のところで結果を出す。
式 | 結果 |
---|---|
1<‘A’ | false |
‘1’<‘A’ | true |
‘A'<‘a’ | true |
‘a'<‘あ’ | true |
‘あ'<‘か’ | true |
‘あ'<‘ア’ | true |
‘あ'<‘亜’ | true |
‘Aあ'<‘Aい’ | true |
文字列を小なり(イコール)、大なり(イコール)演算子で比較することはほとんどないが、「結果が出る」ということは知っておく。
console.log(1 < 'A');
console.log('Aあ' < 'Aい');
問題:比較演算子
【問1】prompt()を使って名前を入力させる。
ユーザ入力値が自分の名前と…
同じ時は「OK」をコンソールに出力
違う時は「NG」をコンソールに出力
【問2】prompt()を使って年齢を入力させる。
ユーザ入力値が60かどうか…
同じ時は「還暦」をコンソールに出力
違う時は何もコンソールに表示しない
console.log('問題');
console.log('問1');
var userName = prompt(); // ユーザ入力値
if (userName === '増田') {
console.log('名前:OK');
} else {
console.log('名前:NG');
}
console.log('問2');
// prompt()を使って年齢を入力させる
// ユーザ入力値が60かどうか…
// 同じ時は「還暦」をコンソールに出力
// 違う時は何もコンソールに表示しない
//
var age = prompt();
if (age == 60) {
console.log('還暦');
}
【参考】名前:別解答
var userName = prompt('お名前は?');
var myName = '増田';
if (userName === myName) {
console.log('名前:OK');
}
else {
console.log('名前:NG');
}
名前を使う場面が多く出てくる場合や、変更が発生する場合は
「増田」を変数に入れる方が管理が楽。
逆に1回しか使わない・変更がない場合は変数に登録しない方がいい。
【間違い解答】年齢確認の演算子が間違っている
var userAge = prompt('おいくつ?');
if (userAge === 60) {
console.log('還暦');
}
// ↓確認する
console.log(userAge === 60);
console.log(typeof userAge);
厳密等価演算子(===)を使うと「’還暦’」が出ない。
①条件結果をコンソールで確認する
<console.log(userAge === 60);>
→ 結果が「false」になっている。
②変数のデータ型をコンソールで確認する <console.log(typeof userAge);>
→「string(文字列型)」になっている。
データ型が「number(数値型)」ではないため「厳密等価演算子」だと「false」が返ってくる。※外部から取得した値は「string(文字列型)」になる。
↓↓7章に戻る。
論理演算子
2つの条件式をまとめて記述することができる。
また「否定」を使用して条件式の結果を反転させることもできる。
演算子 | 名称 | 内容 |
---|---|---|
&& | AND演算子(論理積) | 左辺と右辺の値が両方真の時に真を返す |
|| | OR演算子(論理和) | 左辺と右辺のどちらかの値が真のときに真を返す |
! | NOT演算子(否定) | 真偽値の値を反転させる |
AND演算子(論理積):&&
左辺の第1条件式と右辺の第2条件式の両方の条件が満たされた時に「true」を返す。
1つでも条件を満たしていないものがあると「false」を返す。
ショートサーキット評価
論理演算子は最初に左辺の評価を確認し、次に右辺の評価を確認する。
左辺の評価を確認した時点で論理演算子の結果が確定した場合は右辺の評価を実行しない。
これを「ショートサーキット評価」と呼ぶ。
左辺条件式 結果 | 右辺条件式 結果 | AND演算子 結果 |
---|---|---|
true | true | true |
true | false | false |
false | 実行されない | false |
AND演算子の場合は左辺が「false」の時点でAND演算子の結果が「false」に確定するため右辺を実行しない。
AND演算子の左辺(第1条件式)と右辺(第2条件式)の結果を確認する。
左辺と右辺の結果を踏まえてAND演算子が結果を返す。
var num = 20;
console.log('1回目の出力');
console.log(num > 0 && num < 30);
// 左辺:true AND判定まだ不可
// 右辺:true AND判定OK「true」
console.log(num > 0 && num < 10);
// 左辺:true AND判定まだ不可
// 右辺:false AND判定OK「false」
console.log(num > 30 && num < 40);
// 左辺:false AND判定OK「false」
// 右辺:処理されない(無視)
console.log(num > 30 && num < 0);
// 左辺:false AND判定OK「false」
// 右辺:処理されない
AND演算子は左辺も右辺も両方「true」の時に「true」を返し、それ以外はすべて「false」を返す。
OR演算子(論理和):||
OR演算子「||」は左辺の第1条件式と右辺の第2条件式のどちらかがみたされていれば「true」を返す。両方条件を満たしていない場合のみ「false」を返す。
AND演算子同様、ショートサーキット評価を行う。
OR演算子の左辺(第1条件式)と右辺(第2条件式)の結果を確認する。
左辺と右辺の結果を踏まえてOR演算子が結果を返す。
var num = 20;
console.log('2回目の出力');
console.log(num > 0 || num < 30);
// 左辺:true OR判定OK「true」
// 右辺:処理されない
console.log(num > 0 || num < 10);
// 左辺:true OR判定OK「true」
// 右辺:処理されない
console.log(num > 30 || num < 40);
// 左辺:false OR判定まだ不可
// 右辺:true OR判定OK「true」
console.log(num > 30 || num < 0);
// 左辺:false OR判定まだ不可
// 右辺:false OR判定OK「false」
NOT演算子(否定):!
NOT演算子「!」は条件式の結果を反転させる。
条件を満たしていない場合に「true」、条件を満たした場合に「false」を返す。
条件式結果 | NOT演算子結果 |
---|---|
!true | false |
!false | true |
NOT演算子の右にある「()丸カッコ」で囲まれた条件式の結果を確認する。
var num = 20;
console.log('3回目の出力');
console.log(!(num > 0));
// (20 > 0) ⇒(true)⇒!(true) ⇒ (false)
console.log(!(num > 30));
// (20 > 30) ⇒(false)⇒!(false) ⇒ (true)
NOT演算子は「()丸カッコ」内の結果を反転させる。
論理演算子を使ったif文
論理演算子を使用したif文
AND演算子の左辺(第1条件式)と右辺(第2条件式)の結果を確認する
左辺も右辺も両方「true」なのでAND演算子は「true」を返す。
var age = 35;
console.log('1回目の出力');
// 30代かどうかの判定
// 30以上・40未満
// 2つの条件が満たされた時にtrue'30代'
if (age >= 30 && age < 40) {
console.log('30代');
}
if文の条件式が「true」なので直後のブロックを実行しコンソールに「30代」が表示される。このように論理演算子を使うと複数条件をまとめて記述できる。
「&&」で条件をつけると、すべての条件を満たすことで「true」になるため
ドンドン「true」の範囲が狭まる。
var age = 25;
console.log('2回目の出力');
// 30未満・40以上
// 「||」ORで条件をつなぐ
// どちらか片方の条件を満たしていればtrue「'30代じゃない'」
if (age < 30 || age >= 40) {
console.log('30代じゃない');
}
「||」で条件をつけると、ドンドン「true」の範囲が広くなる。
console.log('3回目の出力');
if (!(age >= 30 && age < 40)) {
console.log('30代じゃない');
}
// (age >= 30 && age < 40)は
// 1回目の出力「30代」の条件
// これを「!」(NOT演算子)で条件結果を反転させると
// 「30代じゃない」の意味にすることができる
【考察】
NOT演算子「」
var age = 20;
console.log('問題 7-8');
if (!age >= 30 && age < 40) {
console.log('30代じゃない');
}
// 変数ageには20が代入されている
console.log(!age == 0); // true
// ◆!age
// age 20 → true → ! →false
// ◆!age == 0
// false == 0
// false == false
// 結果true
真偽値への変換
JavaScriptは必要に応じて自動でデータ型を変換する。
例えば条件式の中に記述された値は真偽型に自動変換される。
元のデータ型 | 元の値 | 真偽値型変換 |
---|---|---|
数値型 | 0 | false |
数値型 | NaN | false |
文字列型 | ”(空文字) | false |
未定義型 | undefined | false |
Null型 | null | false |
※上記以外の値はすべて「true」に真偽値変換
(覚えるのは「false」だけでOK)
元のデータ型 | 元の値 | 真偽値型変換 |
---|---|---|
数値型 | 10 | true |
文字列型 | ‘0’ | true |
文字列型 | ‘あいう’ | true |
console.log('1回目の出力');
var x;
console.log(x);
if (x) {
// undefinedを条件判定すると「false」
// 条件判定は必ず真偽値で行う
// 条件部分に真偽値以外の値がきた時は
// 真偽値への型変換を行う
// undefined → 真偽値への型変換 → false
console.log('true');
} else {
console.log('false');
}
console.log('2回目の出力');
x = 5;
console.log(x % 2); // 1を出力
// 「%」余り算:2で割った余りを条件に使用
// 2で割った余りは「0」か「1」になる
if (x % 2) {
// 5を2で割った余り → 1 → 真偽値へ型変換 → true
console.log('true');
} else {
console.log('false');
}
console.log('3回目の出力');
x = 4;
console.log(x % 2); // 0を出力
// 「%」余り算:2で割った余りを条件に使用
if (x % 2) {
// 4を2で割った余り → 0 → 真偽値へ型変換 → false
console.log('true');
} else {
console.log('false');
}
console.log('4回目の出力');
x = 'aaa';
console.log(x - 5);
if (x - 5) {
console.log('true');
} else {
console.log('false');
}
console.log('5回目の出力');
x = '';
console.log(x);
if (x) {
console.log('true');
} else {
console.log('false');
}
console.log('6回目の出力');
x = 'あいう';
console.log(x);
if (x) {
console.log('true');
} else {
console.log('false');
}
console.log('7回目の出力');
x = '0';
console.log(x);
if (x) {
console.log('true');
} else {
console.log('false');
}
console.log('8回目の出力');
x = null;
console.log(x);
if (x) {
console.log('true');
} else {
console.log('false');
}
問題:真偽値への変換
【問題1】変数numを宣言して数値を代入
変数numが3の倍数の時「3の倍数★」
3の倍数じゃない時は「3の倍数じゃない」とコンソールに表示
※比較演算子は使用しない
var num;
console.log('問題1');
num = 100;
// 余り「0」(false)が3の倍数
// 余り「1」「2」(true)が3の倍数じゃない
if (num % 3) {
console.log('3の倍数じゃない'); // ←trueの時
} else {
console.log('3の倍数★'); // ←falseの時
}
【問題2】変数userNameを宣言
prompt()を使ってユーザに名前を入力してもらう
入力した名前が空文字の時、コンソールに「入力してください」を出力
(入力された場合には出力不要。何も処理しない)
var userName = prompt('お名前は?');
// 【文字列の真偽値変換】
// 空文字は「false」、文字が入っていれば「true」
if (userName) {
// ←false
} else {
console.log('入力してください'); // ←true
}
【別解答】
if (!userName) {
// 空文字「false」→ NOT演算子「!」 →「true」
console.log('入力してください');
}
比較演算子を使わない条件判定はプログラムの可読性が損なわれたり、
自動型変換に頼るのでバグが潜在してしまう可能性があるため注意!
★比較演算子はちゃんと使用した方が無難
第8章:三項演算子
三項演算子の使い方
三項演算子もif文と同じように条件によって処理や値を選択することができる。if文に比べて短く記述できるが、複雑な分岐処理の場合はわかりづらくなるので使いどころを選ぶ。シンプルな分岐処理を短く記述する際に使用するのが望ましい。
三項演算子もif文と同じように条件によって処理や値を選択することができる。if文に比べて短く記述できるが、複雑な分岐処理の場合はわかりづらくなるので使いどころを選ぶ。シンプルな分岐処理を短く記述する際に使用するのが望ましい。
(三項演算子を使わない人もいる)
条件式 ? true時の処理(値) : false時の処理(値) ;
※「true時の処理(値)」を「真式」
「false時の処理(値)」を「偽式」 と呼ぶ
条件式で変数numに入った数値が奇数か確認し、「true」時には「’奇数’」、「false」時には「’偶数’」をコンソールの表示している。
var num = 3;
console.log('1回目の出力');
num%2 == 1 ? console.log('奇数') : console.log('偶数');
// 条件:num%2 == 1
// 2で割った余りが「1」と等しいか
// 奇数の判定(負の整数が考慮されていないので不十分)
// true時:console.log('奇数')
// false時:console.log('偶数')
三項演算子は「真式」や「偽式」に処理ではなく値を記述することもできる。
条件式の結果に応じて値を変更するプログラムをif文に比べて短く記述できる。
今回は三項演算子によって「’奇数’」「’偶数’」の文字列を選択し、選択した文字列をい代入演算子で変数messageに入れている。
このように三項演算子や代入演算子を1行に記述するとわかりづらくなるので、条件式を「()丸カッコ」で囲んで見やすくする。
console.log('2回目の出力');
var message;
message = (num%2 == 1) ? '奇数' : '偶数';
// 1.代入しようとするけど右辺の値が決まっていない:保留
// 2.右辺の処理に三項演算子
// (num%2 == 1) ? '奇数' : '偶数';
// 条件:num%2 == 1
// true時:'奇数'
// false時:'偶数'
// 3.決定した右辺の値を変数messageに代入
console.log(message);
if文だと下記の通り。長いけど、わかりやすい。
if (num%2 == 1) {
message = '奇数';
} else {
message = '偶数';
}
console.log(message);
下記のプログラムは「2回目の出力」と同じ結果になる。三項演算子は短く記述できるが、わかりづらいソースコードになりやすいので注意。
最初は他人にわかりやすいソースコードを記述するのがオススメ。
なお、条件式には「真偽型変換」を使用している。あまり「1」の時は「true」、余り「0」の時は「false」に変換される。
console.log('3回目の出力');
message = num%2 ? '奇数' : '偶数';
console.log(message);
補足:三項演算子で複数処理
(レアケースなので参考まで)
var num = 3;
console.log('1回目の出力');
num%2 == 1 ? (
console.log('奇数1'),
console.log('奇数2')
) : (
console.log('偶数1'),
console.log('偶数2')
);
三項演算子で条件式に応じた処理を複数記述する場合は「,(カンマ)」を使う。
ただ、この書き方をするのであればif文で記述した方がわかりやすい。
ステップアップ
// functionは関数と呼ばれているもの
// よく使う処理をまとめておくもの
// ※13章で詳しく
// 「解答する」ボタンをクリックした時に呼び出される関数
function displayMessage(){
var score = 0; //得点管理用の変数
var answer = []; //ユーザの解答
// 問1の解答を配列に代入
answer[0] = document.getElementById('answer0').value;
// 問2の解答を配列に代入
answer[1] = document.getElementById('answer1').value;
// 問3の解答を配列に代入
answer[2] = document.getElementById('answer2').value;
// 右辺
// ◆ユーザ選択項目のvalue属性値を取得
// id名をもとにセレクトボックスを特定
// 選択した項目のvalue属性を参照
// 右辺の値を左辺の配列に代入する
// ユーザ解答確認用
console.log(answer);
score += (answer[0] == 1) ? 5 : 0;
score += (answer[1] == 1) ? 3 : 0;
score += (answer[2] == 1) ? 2 : 0;
// 左辺:score
// 演算子:+=(加算代入演算子)
// 右辺:(answer[0] == 1) ? 5 : 0;
// 1.加算代入演算子を実行したいが、右辺の値が確定していないので保留
// 2.右辺((answer[0] == 1) ? 5 : 0;)の値を確定させる
// 条件:answer[0] == 1
// true時:5 false時:0
// 数値の「5」か「0」が選択される
// 3.保留になっていた加算代入演算子が実行される
// (scoreの値に得点分を加算代入(+=)される)
document.getElementById('display1').innerHTML = score + '点';
// ブラウザの特定箇所(id:display1)に特定を表示
}
セレクトボックスで選択したvalue値を取得
document.getElementById('id名').value;
()内に文字列で対象要素のID名を記述して対象のセレクトボックスを指定する。
選択したoption要素のvalue属性値を取得する。
<select id="answer0">
<option value="0">選択</option>
<option value="1">○</option>
<option value="2">×</option>
</select>
answer[0] = document.getElementById('answer0').value;