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隐式转换规则
- 7种基本类型的转换:
| 类型 | 转Boolean | 转String | 转Number | |
|---|---|---|---|---|
| null | false | 'null' | 0 | |
| undefined | false | 'undefined' | 0 | |
| Boolean | - | true -> 'true', false -> 'false' | true -> 1,false -> 0 | |
| String | '' -> false, 非'' -> true | -- | 数字格式的字符串转对应数字,例如 '8.0' -> 8.0, 空字符串转0 ''-> 0, 非数字非空字符串转 NAN, 例如'string' -> NAN | |
| Number | 0 -> false, 非0-> true | 直接转string,例如 8 -> '8' | - | |
| BinInt | 0n -> false, 非0n -> true | 直接转string,例如 BigInt(900719925474099123892839289) -> '900719925474099123892839289' | 转为对应的number,可能会丢失精度 | |
| Symbol | true | "safer" String(sym) conversion 的作用会像symbol类型调用 Symbol.prototype.toString() 一样, | 尝试将一个 symbol 值转换为一个 number 值时,会抛出一个 TypeError 错误 (e.g. +sym or sym | 0). |
- 运算过程的隐式转换
- '+', '+=' 操作符: 操作符任意一边存在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
- 引用类型转基础类型转换规则 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/…