#はじめに
JavaScriptのifを学習をしていてRubyとは違った記述などがあったのでアウトプットしていきます。
まずは簡単に記述します。
//()の中に条件式
if(true) {
console.log('this is true');
} else {
console.log('this is false');
}
// this is true
tureだった場合はconsole.logで'this is true'か返ってきます。
ここまでは記述の仕方は違えどtrueの時はこれ!falseの時はこれ!rubyの時のニュアンスは一緒だと思いました。
#'==='と'=='の意味
if(1 == '1') {
console.log('this is true');
} else {
console.log('this is false');
}
// this is true
数字の1文字列の**'1'**があります。
こちらが等しい時はもちろんtrueが返ってきます。
しかし数字と文字列は別の値だからfalseです!と思ったのですが。。。
this is true
ええええええ!
人間から見たら1は1だけど文字式だから違うって前に学習しましたよ〜〜!
MDNにちゃんと記載されてました。
JavaScript には、厳密な比較と型変換の比較の両方があります。厳密な比較 (例: ===) は、オペランドが同じ型で、内容も一致している場合にのみ真になります。もっとよく使用される抽象的な比較 (例: ==) は、比較する前にオペランドを同じ型に変換します。抽象的な関係比較 (例: <=) では、比較前にまずオペランドがプリミティブ型に変換され、それから同じ型に変換されます。
==
は等価演算子と言います。
等価演算子は、2 つのオペランドが同じ型でないならばオペランドを変換して、それから厳密な比較を行います。両方のオペランドがオブジェクトならば、 JavaScript は内部参照を比較するので、オペランドがメモリ内の同じオブジェクトを参照するときに等しくなります。
データの型までは比較されないので1と'1'は等しいとされtrueとなりました。
if(1 === '1') {
console.log('this is true');
} else {
console.log('this is false');
}
// this is false
イコールを3つした場合はfalseになりました。
===
の場合は厳密等価演算子と言います。
厳密等価演算子は、型変換なしでオペランド同士が (上に示した通り) 厳密に等しければ真を返します。
データの型も一緒でなければなりません。
今回は数字と1と文字式の1
なのでfalseという結果になりました。
#1とtrueの場合
if(1 == true) {
console.log('this is true');
} else {
console.log('this is false');
}
// this is true
boolean型のtrueなのになぜtrueとなるのか。
実はtrueは数字に変換した場合は1になります。
実際に数字に変換してみます。
const num = Number(true);
console.log(num);
// 1
//falseの場合は0です
出力結果の通り1になります。
3つの場合は厳密等価演算子となり、型も一緒でなければならないのでfalseになります。