
目次
サンプル・プログラム
比較演算子:Number型
comp1.html
19: <script>
20: //ページのロード時に実行
21: window.onload = function() {
22: let a = 3, b = 2;
23: let c;
24: document.getElementById('ret1').innerHTML = 'a = ' + a.toString();
25: document.getElementById('ret2').innerHTML = 'b = ' + b.toString();
26:
27: c = a > b;
28: document.getElementById('ret3').innerHTML = 'a > b ... ' + c.toString();
29: c = a < b;
30: document.getElementById('ret4').innerHTML = 'a < b ... ' + c.toString();
31: c = a == b;
32: document.getElementById('ret5').innerHTML = 'a == b ... ' + c.toString();
33: c = a != b;
34: document.getElementById('ret6').innerHTML = 'a != b ... ' + c.toString();
35: }
36: </script>
比較演算子:String型
comp2.html
19: <script>
20: //ページのロード時に実行
21: window.onload = function() {
22: let a = 'abc', b = 'abd';
23: let c;
24: document.getElementById('ret1').innerHTML = 'a = ' + a.toString();
25: document.getElementById('ret2').innerHTML = 'b = ' + b.toString();
26:
27: c = a > b;
28: document.getElementById('ret3').innerHTML = 'a > b ... ' + c.toString();
29: c = a < b;
30: document.getElementById('ret4').innerHTML = 'a < b ... ' + c.toString();
31: c = a == b;
32: document.getElementById('ret5').innerHTML = 'a == b ... ' + c.toString();
33: c = a != b;
34: document.getElementById('ret6').innerHTML = 'a != b ... ' + c.toString();
35: }
36: </script>
比較演算子:厳密等価と厳密不等価
comp3.html
19: <script>
20: //ページのロード時に実行
21: window.onload = function() {
22: let a = 123, b = '123';
23: let c;
24: document.getElementById('ret1').innerHTML = 'a = ' + a.toString() + '...' + typeof a;
25: document.getElementById('ret2').innerHTML = 'b = ' + b.toString() + '...' + typeof b;
26:
27: c = a > b;
28: document.getElementById('ret3').innerHTML = 'a > b ... ' + c.toString();
29: c = a < b;
30: document.getElementById('ret4').innerHTML = 'a < b ... ' + c.toString();
31: c = a == b;
32: document.getElementById('ret5').innerHTML = 'a == b ... ' + c.toString();
33: c = a != b;
34: document.getElementById('ret6').innerHTML = 'a != b ... ' + c.toString();
35: c = a === b;
36: document.getElementById('ret7').innerHTML = 'a === b ... ' + c.toString();
37: c = a !== b;
38: document.getElementById('ret8').innerHTML = 'a !== b ... ' + c.toString();
39: }
40: </script>
「2.2 データ型 - 動的型付け」で紹介したように、JavaScriptでは動的型付けが行われるため、等価演算子 123 == '123' はtrueになる。厳密等価演算子を使うとfalseになる。
予期しないバグの温床になるため、JavaScriptで等価比較を行う際は、厳密等価演算子を用いた方が無難である。
論理演算子
IE10以前では、ユーザーエージェント(navigator.userAgent)に 'MEIE' という文字列が含まれている。IE11では、これが 'Trident' という文字列に替わる。
これをプログラムにしたものが "logic1.html" である。
logic1.html
19: <script>
20: //ページのロード時に実行
21: window.onload = function() {
22: let ua = navigator.userAgent.toUpperCase(); //大文字変換
23: let res; //判定結果
24:
25: //ユーザーエージェントで判定
26: if (ua.indexOf('MSIE') > -1) {
27: res = 'IEです';
28: } else if (ua.indexOf('TRIDENT') > -1) {
29: res = 'IEです';
30: } else {
31: res = 'IEではありません';
32: }
33:
34: //結果表示
35: document.getElementById('res').innerHTML = res;
36: }
37: </script>
これを、あとで説明するif~else if~else文を使って場合分け判別している。
ただ、1つめのif文と、2つめのelse if文は、いずれも「IEである」場合だ。これを1つにまとめた方が、プログラムが短くなるし、バグを減らす効果もある。

こういうときに使うのが論理演算子である。
2つ以上の式がすべて成り立つか(論理積)、いずれか1つ以上が成り立つか(論理和)、1つも成り立たないか(論理否定)の3種類がある。
演算子 | 意味 |
---|---|
&& | 論理積(AND) |
|| | 論理和(OR) |
! | 論理否定(NOT) |
logic2.html
19: <script>
20: //ページのロード時に実行
21: window.onload = function() {
22: let ua = navigator.userAgent.toUpperCase(); //大文字変換
23: let res; //判定結果
24:
25: //ユーザーエージェントで判定
26: if ((ua.indexOf('MSIE') > -1) || (ua.indexOf('TRIDENT') > -1)) {
27: res = 'IEです';
28: } else {
29: res = 'IEではありません';
30: }
31:
32: //結果表示
33: document.getElementById('res').innerHTML = res;
34: }
35: </script>
比較演算子と論理演算子の組み合わせ
たとえば、1980年代生まれかどうかを判断するプログラムが "comp3.html" である。生年は乱数 Math.random() を使って発生させる。
comp4.html
19: <script>
20: //ページのロード時に実行
21: window.onload = function() {
22: let year = Math.floor(1950 + Math.random() * 70);
23: let a = '';
24: document.getElementById('year').innerHTML = year.toString();
25:
26: if ((year >= 1980) && (year <= 1989)) {
27: a = 'です';
28: } else {
29: a = 'ではありません';
30: }
31: document.getElementById('ret').innerHTML = a;
32: }
33: </script>
comp5.html
19: <script>
20: //ページのロード時に実行
21: window.onload = function() {
22: let year = Math.floor(1950 + Math.random() * 70);
23: let a = '';
24: document.getElementById('year').innerHTML = year.toString();
25:
26: if ((year < 1980) || (year > 1989)) {
27: a = 'ではありません';
28: } else {
29: a = 'です';
30: }
31: document.getElementById('ret').innerHTML = a;
32: }
33: </script>

このときの論理積(AND)と論理和(OR)の関係を表したのが下の数直線である。

コラム:集合と論理
ここでは、真理値表とベン図を掲載する。どうか高校数学の参考書の該当箇所を併読いただきたい。


コラム:falsyとtruthy
ここで、オペランドに暗黙の型変換や厳密不等価が含まれる場合に false となる falsy なデータは8つしかないので、これを下表に整理する。
falsy 以外のデータは true になる(truthy)。
No. | 値 | 型 | 備 考 |
---|---|---|---|
1 | false | Boolean | 基本 |
2 | 0 | Number | Number型のゼロ |
3 | -0 | Number | 数値のゼロに等しい |
4 | 0n | BigInt | BigInt型のゼロ |
5 | "" | String | 空文字列 |
6 | null | null | 何もない |
7 | undefined | undefined | 未定義 |
8 | NaN | - | 数値ではない |
コラム:比較演算子や論理演算子が返す値
一方の論理演算子は、論理否定(!)は常に true または false を返すが、論理積(&&)と論理和(||)は、短絡評価により、評価した値そのものを返す。
そういうことかというと、たとえば
a && bという論理積において、
- a が falsy なら、a を返す(b は評価しない)
- a が truthy なら、b を返す
a || bという論理和において、
- a が truthy なら、a を返す(b は評価しない)
- a が falsy なら、b を返す
コラム:デフォルト引数
defArg1.html
20: <script>
21: // ページのロード時に実行
22: window.onload = function() {
23: // 引数が1つの関数定義
24: function hoge1(x) {
25: x = x || 99; // デフォルト値 99
26: return x;
27: }
28:
29: let y;
30: // 引数を指定して関数実行
31: y = hoge1(1);
32: document.getElementById('ret1').innerHTML = y;
33: // 引数を指定しないで関数実行
34: y = hoge1();
35: document.getElementById('ret2').innerHTML = y;
36: }
37: </script>
ただし、引数として 0 を指定すると、x が falsy となってしまい、99が返ることになる。この点は注意が必要だ。
defArg2.html
20: <script>
21: // ページのロード時に実行
22: window.onload = function() {
23: // 引数が1つの関数定義
24: function hoge2(x = 99) { // デフォルト引数 99
25: return x;
26: }
27:
28: let y;
29: // 引数を指定して関数実行
30: y = hoge2(0);
31: document.getElementById('ret1').innerHTML = y;
32: // 引数を指定しないで関数実行
33: y = hoge2();
34: document.getElementById('ret2').innerHTML = y;
35: }
36: </script>
関数宣言時に
function 関数名(引数1=デフォルト値1, 引数2=デフォルト値2,...) {のように書くことで、引数が省略されたときにデフォルト値が代入される。
}
デフォルト引数を使うと、引数 x にゼロを代入しても、正しい値が戻される。
数値の範囲で判断するときには、比較演算子と論理演算子を組み合わせて使う。