背景
下記のようなデータがある。
const data = { success: true, linemode: 1, xmode: 0 };
それぞれ「1」、「0」のために分岐操作を作ったが、
「0」のほうはうまくいかなかった。
if (data.xmode&&data.xmode===1) {
console.log('xmode is 1');
} else if (data.xmode&&data.xmode===0) {
console.log('xmode is 0');//実行されない
}
console.log(data.xmode);//出力:0
if (data.xmode&&data.xmode===1) {
console.log('xmode is 1');
} else if (data.xmode&&data.xmode===0) {
console.log('xmode is 0');//出力されない
} else{
console.log('xmode is falsy');//出力:'xmode is falsy'
}
原因
JSでは、0
は「falsy」として評価され、if
文の条件式で 、data.xmode&&data.xmode==0
のdata.xmode
がfalsy
*で後続の条件が評価されない。&&
演算子によってこの条件はfalse
と評価される。
*条件式で評価されると false
と同じ扱いをされる値のこと
対策
①条件式を変える
const data = { success: true, linemode: 1, xmode: 0 };
console.log(data.xmode);//出力:0
if (data.xmode===1) {
console.log('xmode is 1');
} else if (data.xmode===0) {
console.log('xmode is 0');//出力:'xmode is 0'
} else{
console.log('data.xmode is falsy');//実行されない
}
②数値だったデータを文字列に変える
const data = { success: true, linemode: "1", xmode: "0" };
console.log(data.xmode);//出力:0
if (data.xmode&&data.xmode==="1") {
console.log('xmode is string 1');
} else if (data.xmode&&data.xmode==="0") {
console.log('xmode is string 0');;//出力:'xmode is string 0'
} else{
console.log('data.xmode is falsy');//実行されない
}