//这里有个梗,据说if()里面用的也是==,==在使用vulueOf,toString的情况会出现异常,暂时没遇到过,遇到了再加上
if()
并不会改变数据类型,也不会直接执行()里的函数本身
number NaN 不进入
number 0 不进入
object null 不进入
boolean false 不进入
undefined undefined不进入
string (空字符串'')不进入
对这些 ! 取反后都为 true ,且不会改变原数据
console.log(!(-120));//false
console.log(!120);//false
console.log(!0);//true
//该写个方法测的,好蠢 var a = '变量'; console.log(typeof a); //string if (a) { console.warn('pass1') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = ['变量']; console.log(a); console.log(a instanceof Array); //true if (a) { console.warn('pass2') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = NaN; //不进入 console.log(typeof a); //number if (a) { console.warn('pass3') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = 2; console.log(typeof a); //number if (a) { console.warn('pass4') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = 1; console.log(typeof a); //number if (a) { console.warn('pass5') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = 0; //不进入 console.log(typeof a); //number if (a) { console.warn('pass6') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = '0'; console.log(typeof a); //string if (a) { console.warn('pass7') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = '1'; console.log(typeof a); //string if (a) { console.warn('pass8') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = 'null'; console.log(typeof a); //string if (a) { console.warn('pass9') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = null; //不进入 console.log(typeof a); //object if (a) { console.warn('pass10') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = true; console.log(typeof a); //boolean if (a) { console.warn('pass11') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = false; //不进入 console.log(typeof a); //boolean if (a) { console.warn('pass12') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = 'true'; console.log(typeof a); //string if (a) { console.warn('pass13') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = 'false'; console.log(typeof a); //string if (a) { console.warn('pass14') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = 'undefined'; console.log(typeof a); //string if (a) { console.warn('pass15') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = undefined; //不进入 console.log(typeof a); //undefined if (a) { console.warn('pass16') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = []; console.log(typeof a); //object if (a) { console.warn('pass17') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = {}; console.log(typeof a); //object if (a) { console.warn('pass18') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = { 有: '朋自远方来' }; console.log(typeof a); //object if (a) { console.warn('pass19') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = ''; //不进入 console.log(typeof a); //string if (a) { console.warn('pass20') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = ' '; console.log(typeof a); //string if (a) { console.warn('pass21') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = function() {}; console.log(typeof a); //function if (a) { console.warn('pass22') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = function() { console.warn('会被执行吗?') }; //并不会 console.log(typeof a); //function if (a) { console.warn('pass23') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = function() { return false; }; //并不会执行,与return 的值无关 console.log(typeof a); //function if (a) { console.warn('pass24') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = 'error'; console.log(typeof a); //string if (a) { console.warn('pass25') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 var a = (function() { return false; })(); //本身先执行了,返回false,不进入 console.log(typeof a); //boolean if (a) { console.warn('pass26') } else { console.error((typeof a) + a + '不进入') } console.log(a); //不变 console.log(typeof a); //不变 function testIf(a) { console.log(typeof a, a); if (!a) { console.log('yes') } else { console.error('no') } console.warn(!a); console.warn(typeof a, a); } testIf(NaN); testIf(0); testIf(null); testIf(false); testIf(undefined); testIf(''); testIf('0'); //no testIf('1'); //no testIf('null'); //no testIf('false'); //no testIf('undefined'); //no
== 与 ===
===是不会改变数据和数据类型的,==貌似有特定情况会,还没遇到过
两个相同的数组,或者对象,是不相等的!
function abc(a, b) { console.log(typeof a, a, typeof b, b); console.log(a == b); console.log(typeof a, a, typeof b, b); console.info(a === b); } abc(0, false); abc("", false); abc("", 0); abc("0", 0); abc("17", 17); abc([1, 2], "1,2"); abc(new String("foo"), "foo"); abc(null, undefined);
# `==`的比较规则
先比 ===
然后是 null 和 undefined 的特殊情况
然后如果是 Number 和 String 比,把 String 转化成 Number 再重新比
然后如果有一个是 Boolean,先把 Boolean 转化成 Number 再重新比
如果是 String/Number/Symbol 和 Object 比,先把 Object 转化为 Primitive 再重新比
最后都不行就返回 False