JavaScript 数据类型转换
JavaScript 是一种弱类型语言,即不需要明确声明变量的类型,可以随时赋予任意类型的值。
强制转换(显式转换)
强制转换主要指使用
Number()
、String()
和Boolean()
三个构造函数,手动将各种类型的值,转换成数字、字符串或者布尔值。
转换成 Boolean 值
Boolean( [value] ) 根据 value 的值返回一个布尔值
返回 false 的 value 值(共6种): false、""(空字符串)、0、NaN、null、undefined
Boolean(undefined) // falseBoolean("") // falseBoolean(null) // falseBoolean("12345hello") // trueBoolean({}) // true
转换成数字
Number(arg)
把给定的值(任意类型)转换成数字(可以是整数或浮点数),它转换的是整个值,而不是部分值,和 parseInt()
、parseFloat()
不一样。如果该值不能完全转换为整型或浮点型,则返回NaN。
Number("123.1.2.3") // NaNparseInt("123.1.2.3",10) // 123parseFloat("123.1.2.3") // 123.1Number("123.1") // 123.1Number(true) // 1Number(null) // 0Number(undefined) // NaN
原始类型有 5 种:
Undefined
、Null
、Number
、Boolean
、String
当 Number() 的参数是一个对象时,内部处理步骤如下:
调用对象自身的valueOf方法。如果返回原始类型的值,则直接对该值使用Number函数,不再进行后续步骤。
如果valueOf方法返回的还是对象,则改为调用对象自身的toString方法。如果返回原始类型的值,则对该值使用Number函数,不再进行后续步骤。
如果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) // 0parseInt(0.0000001) // 1parseFloat(0.000001) // 0.000001parseFloat(0.0000001) // 1e-7
JavaScript 中精度小于0.000001的数字会自动转化为科学计数的字符串
转换成字符串
String() 可以把
null
、undefined
转换为字符串,而用 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() 的参数是一个对象时,内部处理步骤如下:
先调用对象自身的toString方法。如果返回原始类型的值,则对该值使用String函数,不再进行以下步骤。
如果toString方法返回的是对象,再调用valueOf方法。如果返回原始类型的值,则对该值使用String函数,不再进行以下步骤。
如果valueOf方法返回的是对象,就报错。
String({name: "percy",age: 21}) // "[object Object]"// 等同于String(({name: "percy",age: 21}).toString()) // "[object Object]"
隐式转换
将任何数据转换为数字的最简单办法就是 对它进行“一元加”运算
+ "12" // 12+ "a12" // NaN+ true // 1
字符串和数字相加结果是字符串
2 + "3" // "23""2" + 3 // "23"2 + "3ab" // "23ab"
字符串和数字相减结果是字符串
2 - "3" // -1"2" - 3 // -12 - "3ab" //NaN
数字与布尔值相加减会自动转换
3 - true // 23 + true // 4
参考资料
【文章】(推荐)
【文章】
【文章】(推荐)
【文章】