JS中隐式转换

167 阅读3分钟

JS中为什么会有隐式转换

JavaScript 是动态类型语言,意味着你在声明变量时可以不必指定数据类型,数据类型会在代码执行时根据需要自动转换,数据转换有隐式转换和强制类型转换两种

JS数据类型

最新ECMAScript规定了8种数据类型

  • 其中7种基本数据类型:
    • String:字符串
    • Boolean:有2个值,true 和 false
    • Number:数字,整数或浮点数,例如:23或者3.14
    • null:表明null值的特殊关键字,JS是大小写敏感,null与Null,NULL或变体完全不同
    • undefined:和null一样是特殊关键字,undefined表示变量未赋值时的属性
    • Symbol:一种实例是唯一且不可改变的数据类型。
    • BigInt:可以安全存储和操作大整数,甚至可以超过数字的安全整数限制

• 1种引用类型:Object

JS隐式转换规则

  1. 7种基本类型的转换:
类型转Boolean转String转Number
nullfalse'null'0
undefinedfalse'undefined'0
Boolean-true -> 'true', false -> 'false'true -> 1,false -> 0
String'' -> false, 非'' -> true--数字格式的字符串转对应数字,例如 '8.0' -> 8.0, 空字符串转0 ''-> 0, 非数字非空字符串转 NAN, 例如'string' -> NAN
Number0 -> false, 非0-> true直接转string,例如 8 -> '8'-
BinInt0n -> false, 非0n -> true直接转string,例如 BigInt(900719925474099123892839289) -> '900719925474099123892839289'转为对应的number,可能会丢失精度
Symboltrue"safer" String(sym) conversion 的作用会像symbol类型调用 Symbol.prototype.toString() 一样,尝试将一个 symbol 值转换为一个 number 值时,会抛出一个 TypeError 错误 (e.g. +sym or sym0).
  1. 运算过程的隐式转换
  • '+', '+=' 操作符: 操作符任意一边存在string,都会把操作符两边的数据转换成string进行字符串拼接。 操作符两边没有string,将操作符两边的数据转number进行数值运算
'' + 1; // '1'
'1' + '0'; // '10'
'1' + true; // '1true'
'string' + undefined; // 'stringundefined'

1 + 1; // 2
1 + true; // 2
1 + false; // 1
1 + undefined; // NAN
1 + null; // 1

true + true; // 2
true + false; // 1
true + undefined; // NAN

let s = '1';
s += 2; // '12'
s += true; // '12true'
  • '-', '*', '/', '%', '++', '--', '-='操作符:转成number进行计算
1 - '-1'; // 2
1 - ''; // 1
2 - false; // 2
2 - true; // 1
1 - undefined; // NAN

1 / true; // 1
1 / false; // Infinity
1 / undefined; // NAN
1 / '2'; // 0.5
null / 1; // 0
true / '2'; // 0.5

1 * 'string'; // NAN
1 * ''; // 0
1 * true; // 1
1 * false; // 0
1 * null; // 0

let s = true;
s--; // s: 0
++s; // s: 1
s += ''; // s: 1
s -= '1'; // s: 0

  • 相等操作符'=='
    • boolean类型同任何类型执行'==',首先把boolean转number再比较
    true == 1; // true
    true == 2; // false
    true == '2'; // false
    false == ''; // true
    false == '0'; // true
    false == 0; // true
    false == undefined; // false
    false == null; // false
    
    • string 同 number 执行'==',把string转number再比较
    123 == '123'; // true
    '' == 0; // true
    123 == '123.00'; // true
    
    • null == undefined, null,undefined 同其他类型执行 '==' 都是false
    null == 0; // false
    undefined == 0; // false
    null == false; // false
    undefined == false; // false
    
  1. 引用类型转基础类型转换规则 es7开始引用类型object和array使用Symbol.toPrimitive转换为原始类型,进而遵循原始类型的计算和比较进行计算和比较。
[0]+[0]; // '00'
[1]-[2]; -1
{}+{}; // '[object,object][object,object]'
{}-{}; // NAN

参考: zh.javascript.info/object-topr… developer.mozilla.org/en-US/docs/…