第67天 举例子说说你对js隐式类型转换的理解
js中双等号比较的时候也会产生隐式类型转换,所以才推荐采用三个等号进行比较是否相等。另外比如let a=1;b=''+a;b就会变成字符串的1,这种隐式类型转换。
- console.log(1+"1");
这个应该是11,不是2
https://github.com/foreverZ133/blogs/issues/13
其实这里面的坑实在是有点多,比如等于判断,大小判断,入参类型转换,运算时类型转换等等。
等于判断时,是会去先转为相同数据类型,再判断的。
Array -> String -> Number -> Boolean 有顺序的。
0 == '0'; // true,转为 0 == 0
0 == []; // 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; // true
undefined <= undefined; // false,怀疑是 0 <= undefined 在比较
null > 0; // false
null == 0; // false
null >= 0; // true
NaN > -1; // false,NaN 基本无法被比较
NaN == NaN; // false
比如 Number 和 Math 相关的方法,都会进行数字化转化等。
没仔细整理过,就不多逼逼了。
+' 014' // 14
+'0x12' // 18
1 + '14' // '114'
1 + '0x12' // '10x12'
1 + +'14' // 15
'14' + 1 // '141'
1 + [1, 1]; // '11,1'
1 + {}; // '1[object Object]'
1 + null; // 1
1 +undefined; // NaN
++'14' // ReferenceError
Infinity+Infinity; // Infinity
-Infinity+(-Infinity); // -Infinity
Infinity+(-Infinity); // NaN
+0+(+0); // 0
(-0)+(-0); // -0
(+0)+(-0); // 0
js在做运算时,如果两边数据不一样,编译器会自动做一个数据转换再进行比较
转换规则
特殊点:
1.数组、对象等复杂数据类型在隐式转换时会先使用valueOf()获取其原始值,如果原始值不是Number则调用toString()转成Sting,再转成Number
2.Boolean转换在以下几种情况下为false:
0,-0,NaN,undefined,"",null,[],false
3.undefined与null的特殊情况
undefined == undefined // true
undefined == null // true
null == null // true
4.NaN与任何数据比较都是false,包括自己 // 六亲不认的步伐
其实这里面的坑实在是有点多,比如等于判断,大小判断,入参类型转换,运算时类型转换等等。
等于判断
等于判断时,是会去先转为相同数据类型,再判断的。
Array -> String -> Number -> Boolean 有顺序的。0 == '0'; // true,转为 0 == 0 0 == []; // 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; // true undefined <= undefined; // false,怀疑是 0 <= undefined 在比较 null > 0; // false null == 0; // false null >= 0; // true NaN > -1; // false,NaN 基本无法被比较 NaN == NaN; // false入参类型转换
比如 Number 和 Math 相关的方法,都会进行数字化转化等。
没仔细整理过,就不多逼逼了。运算时类型转换
+' 014' // 14 +'0x12' // 18 1 + '14' // '114' 1 + '0x12' // '10x12' 1 + +'14' // 15 '14' + 1 // '141' 1 + [1, 1]; // '11,1' 1 + {}; // '1[object Object]' 1 + null; // 1 1 +undefined; // NaN ++'14' // ReferenceError Infinity+Infinity; // Infinity -Infinity+(-Infinity); // -Infinity Infinity+(-Infinity); // NaN +0+(+0); // 0 (-0)+(-0); // -0 (+0)+(-0); // 0
- console.log(1+"1");
这个应该是11,不是2
应该是 console.log(1+ +'1')
Most helpful comment
https://github.com/foreverZ133/blogs/issues/13
其实这里面的坑实在是有点多,比如等于判断,大小判断,入参类型转换,运算时类型转换等等。
等于判断
等于判断时,是会去先转为相同数据类型,再判断的。
Array -> String -> Number -> Boolean 有顺序的。
大小判断
也是要先转为相同数据类型再比较的,但有很多令人费解的地方。
特别是两个字符串的大小比较,至今不懂其中规律,虽然不会这样去玩。
所以这会造成下面这种结果:
再者,undefined、null 和 NaN 一直都很特别。
入参类型转换
比如 Number 和 Math 相关的方法,都会进行数字化转化等。
没仔细整理过,就不多逼逼了。
运算时类型转换