数据类型转换
- 显式类型转换(又称强制类型转换),主要通过使用JavaScript内置的函数来转换数据;
- 隐式类型转换,是指JavaScript根据运算环境自动转换值的类型。
强制类型转换
1、转换字符串
String()可以将任意值强制为string字符串;toString()只能转换boolean 与 number 类型;undinfined与 null类型会报错。
2、转换为Number
Number(value);
- 如果参数中只包含数字,将转换为十进制数字,忽略前导 0 以及前导空格,如果数字前面有负(-)号,那么
-会保留在转换结果中,如果数字前面有加(+)号,转换后会删掉+号;- 如果参数中包含有效浮点数字,将转换为对应的浮点数字,忽略前导 0 以及前导空格,同样对于数字前的正负号,会保留负号忽略正号;
- 如果参数中包含有效的十六进制数字,将转换为对应大小的十进制数字;
- 如果参数为空字符串,将转换为 0;
- 如果参数为布尔值,则将 true 转换为 1,将 false 转换为 0;
- 如果参数为 null,将转换为 0;
- 如果参数为 undefined,将转换为 NaN;
- 如果参数为 Date 对象,将转换为从 1970 年 1 月 1 日到执行转换时的毫秒数;
- 如果参数为函数、包含两个元素以上的数组对象以及除 Date 对象以外的其他对象,将转换为 NaN;
- 如果在参数前面包含了除空格、
+和-以外的其他特殊符号或非数字字符,或在参数中间包含了包括空格、+和-的特殊符号或非数字字符,将转换为 NaN。
parseInt(string, radix);string 为要转换的值;radix 为一个可选参数,表示字符串的基数,取值范围在 2 到 36 之间,例如将 radix 参数设置为 16,则表示将 string 转换为一个十六进制数。
- 解析字符串时,会忽略字符串前后的空格,如果字符串第一个字符为负号(-),那么负号会保留在转换结果中,如果字符串第一个字符为正号(+),那么转换后将忽略正号;
- 如果字符串前面为除空格、正号(+)、负号(-)以外的特殊符号或者除 a~f(或 A~F)之外的非数字字符,那么字符串将不会被解析,返回结果为 NaN;
- 在字符串中包含空格、小数点(.)等特殊符号或非数字的字符时,解析将在遇到这些字符时停止,并返回已解析的结果;
- 如果字符串是空字符串,返回结果为 NaN。
parseFloat();
- 如果在解析的过程中遇到了正号(+)、负号(-)、数字(0-9)、小数点(.)、或科学计数法中的指数(e 或 E)以外的字符,则会忽略该字符以及之后的所有字符,并返回解析到的浮点数;
- 解析过程中若遇到多个小数点,则会在解析到第二个小数点时停止,并返回第二个小数点之前的解析结果;
- 解析过程中会忽略参数开头或末尾的空白字符;
- 如果参数的第一个字符不能被解析为数字,则会返回 NaN。
3、转换为boolean
Boolean();
除了
undefined、null、-0、+0、NaN、''(空字符串),其他都是自动转为true。
隐式类型转换
数据类型之间的比较转换规则
- 对象和布尔值比较
对象和布尔值进行比较时,对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字
- 对象和字符串比较
对象和字符串进行比较时,对象转换为字符串,然后两者进行比较。
- 对象和数字比较
对象和数字进行比较时,对象先转换为字符串,然后转换为数字,再和数字进行比较。
- 字符串和数字比较
字符串和数字进行比较时,字符串转换成数字,二者再比较。
- 字符串和布尔值比较
字符串和布尔值进行比较时,二者全部转换成数值再比较。
- 布尔值和数字比较
布尔值和数字进行比较时,布尔转换为数字,二者比较。
内部调用Number()
isNaN(),加加,减减,一元正负运算、减号,乘号,除号,取余。
内部调用Boolean()
与,或,非,if() 条件判断。
内部调用String()
当加号两边有一侧是字符串的话,那么表达式得到的就是字符串。
Symbol.toPrimitive()
在 Symbol.toPrimitive 属性(用作函数值)的帮助下,对象可以转换为一个原始值。该函数被调用时,会被传递一个字符串参数 hint,表示要转换到的原始值的预期类型。hint 参数的取值是 "number"、"string" 和 "default" 中的任意一个。
// 一个没有提供 Symbol.toPrimitive 属性的对象,参与运算时的输出结果。
const obj1 = {};
console.log(+obj1); // NaN
console.log(`${obj1}`); // "[object Object]"
console.log(obj1 + ""); // "[object Object]"
// 接下面声明一个对象,手动赋予了 Symbol.toPrimitive 属性,再来查看输出结果。
const obj2 = {
[Symbol.toPrimitive](hint) {
if (hint === "number") {
return 10;
}
if (hint === "string") {
return "hello";
}
return true;
},
};
console.log(+obj2); // 10 — hint 参数值是 "number"
console.log(`${obj2}`); // "hello" — hint 参数值是 "string"
console.log(obj2 + ""); // "true" — hint 参数值是 "default"