持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情
在JavaScript中,类型转换有两种形式:隐式类型转换和显示类型转换。
隐式类型转换
隐式类型转换一般发生在运算符之间,是运算符根据左右两边的数据类型进行运算,如果两边变量类型不一致那么就会进行类型转换。
常见隐式类型转换的场景
console.log('5' - 2); // 3
console.log('5' + 2); // 52
console.log('5' * 2); // 10
console.log('6' / 2); // 3
console.log('5' + true); // 5true
console.log('5' + false); // 5false
console.log(5 + true); // 6
console.log(5 + false); // 5
console.log('5' + null); // 5null
console.log('5' + undefined); // 5undefined
console.log(5 + null); // 5
console.log(5 + undefined); // NaN
console.log(true + null); // 1
console.log(true + undefined); // NaN
- 在所有的运算符中,除了+号之外,所有的运算符都会将变量的类型转成数字型,然后再进行运算,其中undefined会转成NaN。
- 运算符+在进行运算时,如果运算符左右有字符串类型的变量,那么就会将其他类型都转成字符串类型,直接进行字符串拼接。否则的话也遵循上面那条规则,将变量转成数字型进行计算。
小结:
在开发的过程中,要十分留意隐式类型转换会造成的坑,否则会出现你意想不到的情况。
显示类型转换
显示类型转换和隐式类型转换相反,它不是运算符自动进行类型转换的,而是需要我们手动进行类型转换。
显示类型转换的场景
一般显示类型转换需要调用全局函数,有三种情况:转成数字,转成布尔值,转成字符串
1. 转成数字
1.1 Number()
将目标值转成数字型,语法格式Number(val),其中val就是目标值。
console.log(Number('12.34555')); // 12.34555
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(Number(null)); // 0
console.log(Number(undefined)); // NaN
console.log(Number(Symbol())); // 报错
console.log(Number(42n)); // 42
- 如果参数中只包含数字,将转换为十进制数字,忽略前导 0 以及前导空格,如果数字前面有负(-)号,那么
-会保留在转换结果中,如果数字前面有加(+)号,转换后会删掉+号; - 如果参数中包含有效浮点数字,将转换为对应的浮点数字,忽略前导 0 以及前导空格,同样对于数字前的正负号,会保留负号忽略正号;
- 如果参数中包含有效的十六进制数字,将转换为对应大小的十进制数字;
- 如果参数为空字符串,将转换为 0;
- 如果参数为布尔值,则将 true 转换为 1,将 false 转换为 0;
- 如果参数为 null,将转换为 0;
- 如果参数为 undefined,将转换为 NaN;
- 如果参数为 Date 对象,将转换为从 1970 年 1 月 1 日到执行转换时的毫秒数;
- 如果参数为函数、包含两个元素以上的数组对象以及除 Date 对象以外的其他对象,将转换为 NaN;
- 如果在参数前面包含了除空格、
+和-以外的其他特殊符号或非数字字符,或在参数中间包含了包括空格、+和-的特殊符号或非数字字符,将转换为 NaN。
1.2 parseInt()
前面的Number()是按照双精度来进行转换的,而parseInt()是将目标值转成整数。
console.log(parseInt('12.34555')); // 12
console.log(parseInt(true)); // NaN
console.log(parseInt(false)); // NaN
console.log(parseInt(null)); // NaN
console.log(parseInt(undefined)); // NaN
console.log(parseInt(Symbol())); // 报错
console.log(parseInt(42n)); // 42
- parseInt只能转数字型的变量或者包含数值的字符串
- 解析字符串时,会忽略字符串前后的空格,如果字符串第一个字符为负号(-),那么负号会保留在转换结果中,如果字符串第一个字符为正号(+),那么转换后将忽略正号;
- 如果字符串前面为除空格、正号(+)、负号(-)以外的特殊符号或者除 a~f(或 A~F)之外的非数字字符,那么字符串将不会被解析,返回结果为 NaN;
- 在字符串中包含空格、小数点(.)等特殊符号或非数字的字符时,解析将在遇到这些字符时停止,并返回已解析的结果;
- 如果字符串是空字符串,返回结果为 NaN。
1.3 parseFloat()
前面的Number()是按照双精度来进行转换的,而parseFloat()是将目标值转成浮点数。
console.log(parseFloat('12.34555')); // 12.34555
console.log(parseFloat(true)); // NaN
console.log(parseFloat(false)); // NaN
console.log(parseFloat(null)); // NaN
console.log(parseFloat(undefined)); // NaN
console.log(parseFloat(Symbol())); // 报错
console.log(parseFloat(42n)); // 42
console.log(parseFloat(.123)); // 0.123
console.log(parseFloat(+2.123)); // 2.123
console.log(parseFloat(-2.123)); // -2.123
- parseFloat只能转数字型的变量或者包含数值的字符串
- 如果在解析的过程中遇到了正号(+)、负号(-)、数字(0-9)、小数点(.)、或科学计数法中的指数(e 或 E)以外的字符,则会忽略该字符以及之后的所有字符,并返回解析到的浮点数;
- 解析过程中若遇到多个小数点,则会在解析到第二个小数点时停止,并返回第二个小数点之前的解析结果;
- 解析过程中会忽略参数开头或末尾的空白字符;
- 如果参数的第一个字符不能被解析为数字,则会返回 NaN。
2. 转成布尔值
像数字型一样,也可以手动将目标值转成布尔型。具体语法格式: Boolean()
console.log(Boolean('12')); // true
console.log(Boolean('')); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean(Symbol())); // true
console.log(Boolean(42n)); // true
console.log(Boolean(0)); // false
console.log(Boolean(1)); // true
console.log(Boolean(12)); // true
- 只有空字符串,0,null,undefined会被转成false,其余的基本上都会转成true。
3. 转成字符串
像字符串型一样,也可以手动将目标值转成字符串型。具体语法格式: String()
console.log(String(null)); // null
console.log(String(undefined)); // undefined
console.log(String(Symbol())); // Symbol()
console.log(String(42n)); // 42
console.log(String(0)); // 0
console.log(String(1)); // 1
console.log(String(12)); // 12
- 转成字符串很简单,只是单纯地将变量变成字符。