JavaScript 是一种动态类型语言,变量没有类型限制,可以随时赋予任意值。
虽然变量的数据类型是不确定的,但运算符对数据类型是有要求的。如果运算符发现,运算子的类型与预期不符,就会自动转换类型。
强制转换
Number()
Number()可以将任意类型的值转化成数值。
参数类型:
- 原始类型值
- 转换规则:
(1)数值:保持不变
(2)字符串:
如果可以被解析为数值,则转换为相应的数值;
如果不可以被解析为数值,返回 NaN;
空字符串转为0。
(3)布尔值
true=>1 false=>0
(4)undefined和null
undefined:转成 NaN;
null:转成0
Number(3); //3
Number('a4s5'); //NaN
Number('467'); //467
Number('3.567'); //3.567
Number('2,78'); //NaN
Number(true); //1
Number(undefined); //NaN
Number(null); //0
- Number()和parseInt()比较
(1)Number函数将字符串转为数值时,比parseInt函数严格很多。只要有一个字符无法转成数值,整个字符串就会被转为NaN。
(2)parseInt逐个解析字符,而Number函数整体转换字符串的类型。
(3)parseInt和Number函数都会自动过滤一个字符串前导和后缀的空格。
Number('42 cats') // NaN
parseInt('42 cats') // 42
Number('a4s5'); //NaN
parseInt('a4s5'); //NaN
Number('3.567'); //3.567
parseInt('3.567'); //3
Number('2,78'); //NaN
parseInt('2,78'); //2
- 对象
Number方法的参数是对象时,将返回NaN,除非是包含单个数值的数组。
转换方法:
(1)调用对象自身的valueOf方法。
如果返回原始类型的值,则直接对该值使用Number函数,不再进行后续步骤。
(2)如果valueOf方法返回的还是对象,则改为调用对象自身的toString方法。
如果toString方法返回原始类型的值,则对该值使用Number函数,不再进行后续步骤。
(3)如果toString方法返回的是类型字符串,结果就为NaN;如果toString方法返回的不是原始类型的值,结果就会报错。
Number({ a: 1 }) // NaN {a:1}.valueOf().toString()="[object Object]"
Number([1, 2, 3]) // NaN [1, 2, 3].valueOf().toString()="1,2,3"
Number([5]) // 5 [5].valueOf().toString()
String()
String()可以将任意类型的值转化成字符串。
参数类型:
- 原始类型值:
- 数值:转为相应的字符串。
- 字符串:转换后还是原来的值
- 布尔值:true转为字符串"true",false转为字符串"false"。
- undefined:转为字符串"undefined"。
- null:转为字符串"null"。
- 对象
String方法的参数如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式。
String({x: 1}) // "[object Object]"
String([1, 2, 9]) // "1,2,9"
转换规则:
(1)调用对象自身的toString()。
如果返回原始类型的值,则对该值使用String函数,不再进行以下步骤。
(2)如果toString()返回的是对象,再调用原对象的valueOf()。
如果valueOf()返回原始类型的值,则对该值使用String(),不再进行以下步骤。
(3)如果valueOf()返回的是对象,就报错。
Boolean()
Boolean()可以将任意类型的值转为布尔值。
转换规则:
(1)undefined、null、0(包含-0和+0)、NaN、’ '(空字符串)为false,其他均为true。
(2)true和false这两个布尔值不会发生变化。
(3)所有对象(包括空对象)的转换结果都是true。
自动转换
哪种情况下会发生
- 不同类型的数据互相运算
123 + 'hello' // "123hello"
- 对非布尔值类型的数据求布尔值
if ('something') {
console.log('hello')
} // "hello"
- 对非数值类型的值使用一元运算符(即+和-)
+ {w: 'sss'} // NaN
- [1, 9, 3] // NaN
转换类型
- 转换成布尔类型
当遇到预期为布尔值的地方,就会将非布尔值的参数自动转换为布尔值。系统内部会自动调用Boolean函数。
undefined、null、0(包含-0和+0)、NaN、’ '(空字符串)为false,其他均为true。 - 转换成字符串类型
当遇到预期为字符串的地方,就会将非字符串的值自动转为字符串。
转换规则:
(1)将复合类型的值转为原始类型的值;
(2)将原始类型的值转为字符串。
主要发生在字符串的加法运算时,当一个值为字符串,另一个值为非字符串,则后者转为字符串。 - 转换成数值
当遇到预期为数值的地方,就会将参数值自动转换为数值。系统内部会自动调用Number函数。
运算符(+)有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值,此外,一元运算符也可能会把运算子转成数值。