forever-z-133/blogs#13
其实这里面的坑实在是有点多,比如等于判断,大小判断,入参类型转换,运算时类型转换等等。
等于判断
等于判断时,是会去先转为相同数据类型,再判断的。
Array -> String -> Number -> Boolean 有顺序的。
0 == '0'; // true,转为 0 == 00 == []; // true,转为 0 == '' 再转 0 == 0'0' == []; // false,转为 '0' == '''0' == true // false,转为 0 == true 再转 false == true
大小判断
也是要先转为相同数据类型再比较的,但有很多令人费解的地方。
特别是两个字符串的大小比较,至今不懂其中规律,虽然不会这样去玩。
'1' > '-1'; // true,实则为 1 > -1,反例 '1' > '1.1' 为 false'a' > 'A'; // true,实则为 97 > 65,反例 'a' > 'b' 为 false'a' > -1; // false,这里不知是不是转成了 NaN > -1'a' > ''; // true,这个也不知是不是 97 > undefined
所以这会造成下面这种结果:
[-1] > 0; // false,实为 -1 > 0[-1] > ''; // true,实为 '-1' > ''
再者,undefined、null 和 NaN 一直都很特别。
undefined == undefined; // trueundefined <= undefined; // false,怀疑是 0 <= undefined 在比较null > 0; // falsenull == 0; // falsenull >= 0; // trueNaN > -1; // false,NaN 基本无法被比较NaN == NaN; // false
入参类型转换
比如 Number 和 Math 相关的方法,都会进行数字化转化等。
没仔细整理过,就不多逼逼了。
运算时类型转换
+' 014' // 14+'0x12' // 181 + '14' // '114'1 + '0x12' // '10x12'1 + +'14' // 15'14' + 1 // '141'1 + [1, 1]; // '11,1'1 + {}; // '1[object Object]'1 + null; // 11 +undefined; // NaN++'14' // ReferenceErrorInfinity+Infinity; // Infinity-Infinity+(-Infinity); // -InfinityInfinity+(-Infinity); // NaN+0+(+0); // 0(-0)+(-0); // -0(+0)+(-0); // 0


