|
let str = undefined;のようなコードがもしあれば、このif文では比較がtrueになるため{}内が実行されてしまう。これで良い場合もあれば、そうでない場合もある。曖昧さを許容しない比較のために厳密等価演算子が存在する。
if (str == null) { ... }
x\y | false | 0 | "" | null | undefined | NaN |
---|---|---|---|---|---|---|
false | ‐ | true | true | false | false | false |
0 | true | ‐ | true | false | false | false |
"" | true | true | ‐ | false | false | false |
null | false | false | false | ‐ | true | false |
undefined | false | false | false | true | ‐ | false |
NaN | false | false | false | false | false | ‐ |
if (obj == true) { ... }次のように書いても同様に機能する
if (obj) { ... }いずれも比較は == であることに注意が必要である。JavaScriptにおいては、booleanプリミティブ型以外が真値か偽値かは全く直感的でなく、以下は成立する。
let str = "";なぜなら、""は偽値だからである。
if (str == false) { ... }
if (obj === false) { ... }また上述のように、undefined と null を等価演算子==で比較すると一致しtrueとなるなどの罠があるため、注意が必要である。
if (obj === true) { ... }
var a = 0;しかし、これができること自体の利点はほぼ無く、バグの温床でしかない。なおかつvarのスコープは{}で囲ったブロックスコープではなく関数スコープつまり関数全体であり、悪影響が及ぶ範囲が広い。間違えて同じ変数名を用いてしまった場合、原因箇所の特定が難しいバグを生じさせる。このようにvarは予期しない不具合を招く危険が高い。
var a = 1;
console.log(a); // 出力は `1` となる
const arr = ['AAA', 'BBB', 'CCC'];アロー関数を用いて次のように書くこともできる。機能は同じである。
arr.forEach(function(elem, index) { ... });
const arr = ['AAA', 'BBB', 'CCC'];インデックスが不要の場合、アロー関数を用いれば更にシンプルに書くことができる。
arr.forEach((elem, index) => { ... });
const arr = ['AAA', 'BBB', 'CCC'];注意点として、このいずれの記法でもfor文のようにbreakすることはできない。returnはできるが、それをしてもfor文におけるcontinueと同じ機能にしかならない。
arr.forEach(elem => ... );
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];この場合、「要素が全て条件を満たす」か確認する場合はevery、「要素が一つでも条件を満たす」か確認する場合はsomeを使う。
arr.some(value => value > 5) // →trueを返す
arr.every(value => value > 5) // →falseを返す
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];ここから5を超えるものを抽出する場合、次のいずれかの記法で解決できる。記法の近いだけで動作は全て同じである。
const over5 = arr.filter(function(num) { return num > 5 });下二つはアロー関数の記法だが、特に一番下はアロー関数のshorthandと呼ばれている。特に理由がない限りはshorthandを用いる方がシンプルでよい。
const over5 = arr.filter(num => { return num > 5 });
const over5 = arr.filter(num => num > 5);