Skip to content

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

Open
@haizhilin2013

Description

@haizhilin2013
Collaborator

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

Activity

rocky-191

rocky-191 commented on Jun 22, 2019

@rocky-191

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

yxkhaha

yxkhaha commented on Jun 22, 2019

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

liangchaofei commented on Jun 24, 2019

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

这个应该是11,不是2

forever-z-133

forever-z-133 commented on Jun 28, 2019

@forever-z-133

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

damofan commented on Sep 7, 2019

@damofan

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

smile-2008

smile-2008 commented on Jan 7, 2021

@smile-2008

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

jamsehua commented on Jan 12, 2021

@jamsehua
  • 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    jsJavaScript

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @smile-2008@haizhilin2013@rocky-191@damofan@forever-z-133

        Issue actions

          [js] 第67天 举例子说说你对js隐式类型转换的理解 · Issue #409 · haizlin/fe-interview