js类型转换

130 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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
  • 转成字符串很简单,只是单纯地将变量变成字符。