JavaScript 数据类型转换

最后更新:
阅读次数:

JavaScript 是一种弱类型语言,即不需要明确声明变量的类型,可以随时赋予任意类型的值。

强制转换(显式转换)

强制转换主要指使用Number()String()Boolean() 三个构造函数,手动将各种类型的值,转换成数字、字符串或者布尔值。

转换成 Boolean 值

Boolean( [value] ) 根据 value 的值返回一个布尔值

返回 false 的 value 值(共 6 种): false、””(空字符串)、0、NaN、null、undefined

Boolean(undefined); // false
Boolean(""); // false
Boolean(null); // false
Boolean("12345hello"); // true
Boolean({}); // true

转换成数字

Number(arg) 把给定的值(任意类型)转换成数字(可以是整数或浮点数),它转换的是整个值,而不是部分值,和 parseInt()parseFloat()不一样。如果该值不能完全转换为整型或浮点型,则返回 NaN。

Number("123.1.2.3"); // NaN
parseInt("123.1.2.3", 10); // 123
parseFloat("123.1.2.3"); // 123.1
Number("123.1"); // 123.1
Number(true); // 1
Number(null); // 0
Number(undefined); // NaN

原始类型有 5 种:UndefinedNullNumberBooleanString

当 Number() 的参数是一个对象时,内部处理步骤如下:

  1. 调用对象自身的 valueOf 方法。如果返回原始类型的值,则直接对该值使用 Number 函数,不再进行后续步骤。
  2. 如果 valueOf 方法返回的还是对象,则改为调用对象自身的 toString 方法。如果返回原始类型的值,则对该值使用 Number 函数,不再进行后续步骤。
  3. 如果 toString 方法返回的是对象,就报错。
var obj = { name: "percy", age: 21 };
Number(obj);

// 等同于
var obj = { name: "percy", age: 21 };
if (typeof obj.valueOf() === "object") {
Number(obj.toString());
} else {
Number(obj.valueOf());
}

parseInt 和 parseFloat 都是全局函数,不属于任何对象

parseInt(string, radix);

  • 将给定的字符串以指定基数(radix/base)解析成为整数,字符串开头的空白符将会被忽略,它是逐个对字符进行解析的。
parseInt("  123 Hello", 10); // 123

parseFloat(string)

  • 将参数中指定的字符串解析成为一个浮点数字并返回,它也是逐个对字符进行解析的
parseFloat(" 1.2.3.sds"); // 1.2

下面来跳一个坑:

parseInt(0.000001); // 0
parseInt(0.0000001); // 1
parseFloat(0.000001); // 0.000001
parseFloat(0.0000001); // 1e-7

JavaScript 中精度小于 0.000001 的数字会自动转化为科学计数的字符串

转换成字符串

  • String() 可以把 nullundefined 转换为字符串,而用 toString() 转换的话,会报错
  • null 和 undefined 没有 toString() 方法,会报错

所有的对象都有 toString()方法,作用就是返回一个反映这个对象的字符串。下面列出了一些:

  • Object.prototype.toString()
  • Number.prototype.toString()
  • RegExp.prototype.toString()
  • Function.prototype.toString()
  • ······
String(null); // "null"
String(12 + 11 + true)(
// 24

12
)
.toString()(
// "12"
10
)
.toString(16); // "a"

当 String() 的参数是一个对象时,内部处理步骤如下:

  1. 先调用对象自身的 toString 方法。如果返回原始类型的值,则对该值使用 String 函数,不再进行以下步骤。
  2. 如果 toString 方法返回的是对象,再调用 valueOf 方法。如果返回原始类型的值,则对该值使用 String 函数,不再进行以下步骤。
  3. 如果 valueOf 方法返回的是对象,就报错。
String({ name: "percy", age: 21 }); // "[object Object]"

// 等同于
String({ name: "percy", age: 21 }.toString()); // "[object Object]"

隐式转换

  • 将任何数据转换为数字的最简单办法就是 对它进行 一元加 运算
+"12" + "a12"; // 12 // NaN
true; // 1
  • 字符串和数字相加结果是字符串
2 + "3"; // "23"
"2" + 3; // "23"
2 + "3ab"; // "23ab"
  • 字符串和数字相减结果是数字
2 - "3"; // -1
"2" - 3; // -1
2 - "3ab"; //NaN
  • 数字与布尔值相加减会自动转换
3 - true; // 2
3 + true; // 4

参考资料