类型转换
一 转换成字符串
toString()方法
几乎每一个值都有toString()方法。
var age = 18;
console.log(age.toString()); //'18'
var result = true;
console.log(result.toString()); //'true'
数值类型的toString()方法,可以传入一个参数,输出对应进制的值。
String()函数
有些值没有toString()方法,这个时候可以使用String()。比如undefined
和null
(1)原始类型值
数值:转为相应的字符串
字符串:不变
布尔值:true
转换为字符串'true'
,false
转换为字符串'false'
undefined:转换为字符串'undefined'
null:转换为字符串'null'
var age = 18;
console.log(String(age)); //'18'
var result = true;
console.log(String(result)); //'true'
console.log(String(undefined)); //'undefined'
console.log(String(null)); //'null'
(2)对象
String
的参数如果是对象,就返回一个类型字符串;如果是数组,则返回数组的字符串形式。
console.log(String({a: 1})); //'[object Object]'
console.log(String([1, 2, 3])); //'1,2,3'
转换规则:与Number方法基本相同,只是互换了
valueOf
和toString
的执行顺序。
(1)先调用自身的toString
方法,如果返回原始类型的值,则对该值使用String
函数,不再进行以下步骤
(2)如果toString
方法返回的是对象,再调用原对象的valueOf
方法。如果valueOf
方法返回原始类型的值,则对该值使用String
函数,不再进行以下步骤。
(3)如果valueOf
方法返回的是对象,报错。
使用拼接字符串(加一个空的字符串)
var age = 18;
console.log(age + '');
var result = true;
console.log(result + ''); //'true'
console.log(undefined + ''); //'undefined'
console.log(null + ''); //'null'
二 转换成数值类型
Number()函数
可以把任意值转换成数值。
下面分为两种情况讨论,一种是参数为原始类型的值,另一种是参数为对象。
原始类型值
//数值:转换后还是原来的值
console.log(Number(123)); //123
//字符串:如果可以被解析成数值,就转换为相应的数值;不可以被解析成数值,返回NaN
console.log(Number('123')); //123
console.log(Number('123abc')); //NaN
//空字符串转换为0
console.log(Number('')); //0
console.log(Number(' ')); //0
//会自动过滤字符串前导和后缀的空格(parseInt相同)
console.log(Number('\t\v\r123.123\n')); //123.123
//布尔值:true转换为1,false转换为0
console.log(Number(true)); //1
console.log(Number(false)); //0
//undefined:转换为NaN
console.log(Number(undefined)); //NaN
//null:转换为0
console.log(Number(null)); //0
对象
除非是包含单个数值的数组,否则都是返回NaN。
转换规则:
(1)调用自身的valueOf
方法。如果返回原始类型的值(包含单个数值的数组会返回原始类型的值,其余的都是返回对象),则直接对该值使用Number
函数,不再进行后续步骤;
(2)如果valueOf
返回的还是对象,则改为调用对象自身的toString
方法,如果返回原始类型的值(一般返回[object Object]
),则对该值使用Number
函数,不再进行后续步骤;
(3)如果toString
方法返回的是对象,就报错。
console.log(Number({})); //NaN
console.log(Number({x: 1})); //NaN
console.log(Number([1, 2])); //NaN
console.log(Number([1])); //1
//如果toString方法返回的不是原始类型,会报错
var o = {
toString: function(){
return {};
}
};
console.log(Number(o)); //TypeError: Cannot convert object to primitive value
valueOf
和toString
方法都是可以自定义的
var o1 = {
valueOf: function () {
return 1;
}
};
var o2 = {
toString: function () {
return 2;
}
};
var o3 = {
toString: function () {
return 2;
},
valueOf: function () {
return 1;
}
};
console.log(Number(o1)); //1
console.log(Number(o2)); //2
console.log(Number(o3)); //1 valueOf方法先于toString方法执行
parseInt()函数
parseFloat()
参看文章 parseInt与parseFloat
使用运算符
使用减乘除都可以(加是拼接字符串)
console.log('100' - 0); //100
console.log('100' * 1); //100
console.log('100' / 1); //100
三 转换成布尔类型
Boolean函数
可以将任意类型的值转为布尔值。
转换为false的值:false
、""
、0
和NaN
、null
、undefined
。其余的值转换后全部为true
console.log(Boolean(0)); //false
console.log(Boolean(NaN)); //false
console.log(Boolean(undefined)); //false
console.log(Boolean(null)); //false
console.log(Boolean('')); //false
所有的对象(包括空对象)的转换结果都是true。甚至false
对应的布尔对象new Boolean(false)
也是true
。
console.log(Boolean({})); //true
console.log(Boolean([])); //true
console.log(Boolean(new Boolean(false))); //true
两个逻辑非运算
第一个逻辑非操作会基于无论什么操作数返回一个布尔值;
第二个逻辑非操作则对该布尔值求反;
于是就得到了这个值真正对应的布尔值(结合性从右向左)
console.log(!!('123')); //true