Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
haizhilin2013 opened this issue Jun 21, 2019 · 8 comments
Open
Labels
js JavaScript

Comments

@haizhilin2013
Copy link
Collaborator

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

@haizhilin2013 haizhilin2013 added the js JavaScript label Jun 21, 2019
@rocky-191
Copy link

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

@yxkhaha
Copy link

yxkhaha commented Jun 22, 2019

  • js在做运算的时候遇到两边的数据类型不统一就会尝试着转换成统一的类型做运算,这个过程称为隐式转换。
  • 如: console.log(1+"1"); //2
    console.log(1 + true); // 2

@liangchaofei
Copy link

  • console.log(1+"1");

这个应该是11,不是2

@forever-z-133
Copy link

forever-z-133 commented Jun 28, 2019

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

@damofan
Copy link

damofan commented Sep 7, 2019

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

@MrZ2019
Copy link

MrZ2019 commented Jan 7, 2021

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

@jamsehua
Copy link

  • console.log(1+"1");

这个应该是11,不是2

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js JavaScript
Projects
None yet
Development

No branches or pull requests

9 participants