少数情况下,js会发生隐式类型转换,我们不注意就会引起错误,总结一下。
1.运算符的转换:
- -,*,/,%会将操作数转换为数字去计算,但+不一样,两边纯数字会按数字相加,纯字符串会拼接,但数字和字符串也会将字符串和数字拼接起来。
console.log("1 - '2'");
console.log(1 - '2'); //-1
console.log("1 * '2'");
console.log(1 * '2'); //2
console.log("6 / '4'");
console.log(6 / '4'); //1.5
console.log("6 % '4'");
console.log(6 % '4'); //2
console.log("6 + 4");
console.log(6 + 4); //10
console.log("6 + '4'");
console.log(6 + '4'); //64
console.log("'6' + '4'");
console.log('6' + '4'); //64
console.log("typeof'6' + '4'");
console.log(typeof('6' + '4')); //string
2.双等号的隐式转换:
- 1) 双等号两边只要有以便是NaN,便返回false,且他自身不相等
console.log("NaN == 1");
console.log(NaN == 1); //false
console.log("NaN == NaN");
console.log(NaN == NaN);//false
console.log("undefined == NaN");
console.log(undefined == NaN);//false
- 2) 布尔值会转换为数字,false转换为0,true转换为1
console.log('0 == false');
console.log(0 == false);
console.log('1 == true');
console.log(1 == true);
- 3) 对象的转换
var a = [];
var b = [];
var c = {};
var d = {};
console.log("[] == []");
console.log(a == b);
console.log("[] == {}");
console.log(a == c);
console.log("{} == {}");
console.log(d == c);
console.log("[] == ![]");
console.log(a == !b);
解析:
对于前三个的原理是一样的,当两个值都是对象 (引用值) 时, 比较的是两个引用值在内存中是否是同一个对象. 因为此 [] 非彼 [], 虽然同为空数组, 确是两个互不相关的空数组, 所以为false。
而最后一个是因为右边空数组会转化为true,取反变为false,false变为0;左边空数组变为空字符串再变为0,0==0就为true。