// 1.数字与字符串比较时会把字符串转换为数值,如果字符串不能转换为数值就转换成Nan,Nan与任何类型比较都为false // 2. boolean类型和其他类型比较时,会转换为数值,载按1比较 // 3. null和undefined只有相互比较,或自身比较才为true console.log(0 == ''); // 空字符,空白字符都会转换成0, true console.log(0 == '0'); // '0'可以转换为数值0,true console.log(2 == true); // true会转换成1,false console.log(2 == false); // false会转换成0,false console.log('false' == false); // false转换为0, 'false'转换为Nan,false console.log(0 == false); // false转换为0, true console.log(false == undefined);// 没有与null,或自身比较,false console.log(false == null); // 没有与undefine,或者自身比较,false console.log(null == undefined); // undefind和null比较为true // 1.其他类型和字符串相加时都会被认为是字符串拼接 null会转换为'null', undefined会转换为'undefined' console.log(null + '1' == null + 1); // 'null1'与 1, false console.log(null + 1 == 1); // null转换为0,true console.log(null == 0); // 记住前面讲的,null只有和undefin或者自身才等于true,false console.log(null == undefined); // true console.log(null + 1 == undefined + 1); // undefined + 1为Nan,Nan和任何变量都不相等,包括自身,false console.log(null + null == undefined + undefined);// 与上面同理,false var obj1 = { a: 1, b: 2, valueOf: function(){ return this.a + this.b }, toString: function(){ return 1 } } var obj2 = { toString: function () { console.log("没有调用"); return 0 } } console.log(obj1 + !!obj2); // 对象与其他类型做加法运算时会会优先调用valueOf将自己转换为原始类型,如果没有valueof // 则调用toString,上面的Obj1中有valueof,所以为3 + !!obj2,!!会将一个变量转换为 // 布尔类型,只要时truthy就转换为true,不接收任何方法的返回值,所以!!obj2位true, 3 + true = 4