这是js的基本算法,有点疑问,答案为什么有区别呢,怎么解释?

第一题:答案为什么是26?
var a;
var b = a * 0;
if (b == b) {
console.log(b * 2 + "2" - 0 + 4);
} else {
console.log(!b * 2 + "2" - 0 + 4);
}

第二题:答案为什么是6?

var a = 1; var a; var b = a * 0; if (b == b) { //b=0 console.log(b * 2 + "2" - 0 + 4); } else { console.log(!b * 2 + "2" - 0 + 4); }
var a;//a没有被赋值,默认值为undefined
var b = a * 0; //undefined * 0 结果是 NaN
if (b == b) { // NaN 是js中唯一一个自身与自身比较不相等的值,即 NaN==NaN 结果是 false 执行else部分
console.log(b * 2 + "2" - 0 + 4);
} else {
console.log(!b * 2 + "2" - 0 + 4);
//NaN 在逻辑运算时为假 !b就是true
//true在数值运算时会转换成1, true * 2 等同 1 * 2
//2 + "2" 结果是 "22" 加号两边有一方是字符串,则加号为拼接字符串的操作
//"22"-0+4 结果是 26
}


var a = 1;
var a;//a已经声明,重复声明无效
var b = a * 0;//1*0等于0
if (b == b) {//0==0 结果是 true
console.log(b * 2 + "2" - 0 + 4);
//b是0 ,0*2为0
//0 + "2" 结果是 "02"
//"02"-0+4 结果是 6
} else { console.log(!b * 2 + "2" - 0 + 4); }