Fe-interview: [js] 第67天 举例子说说你对js隐式类型转换的理解

Created on 21 Jun 2019  ·  8Comments  ·  Source: haizlin/fe-interview

第67天 举例子说说你对js隐式类型转换的理解

js

Most helpful comment

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

All 8 comments

js中双等号比较的时候也会产生隐式类型转换,所以才推荐采用三个等号进行比较是否相等。另外比如let a=1;b=''+a;b就会变成字符串的1,这种隐式类型转换。

  • js在做运算的时候遇到两边的数据类型不统一就会尝试着转换成统一的类型做运算,这个过程称为隐式转换。
  • 如: console.log(1+"1"); //2
    console.log(1 + true); // 2
  • 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. 字符串连接符(+),转换为String
    2.关系运算符(>,<,>=,<=,==,===,!==)、算术运算符号(+,-,*,/,%,++,--),转换为Number
    3.逻辑非运算符(!),转换为Boolean

特殊点:
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,包括自己 // 六亲不认的步伐

forever-z-133/blogs#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
  • console.log(1+"1");

这个应该是11,不是2

应该是 console.log(1+ +'1')

Was this page helpful?
0 / 5 - 0 ratings