JavaScript中对象到原始值的转换
对象到布尔值:
对象到布尔值的转换只遵循一个原则:所有的对象(包括数组和函数)都转换为true。对于包装对象也是如此·。
var boo=new Boolean(false);
console.log(typeof(boo));//=>object
对象到字符串
JavaScript中对象到字符串的转换会经历以下几个步骤:
- 如果该对象有
toString方法,则调用这个方法。如果它返回一个原始值,JavaScript将这个原始值转换为字符串,并返回。但很多类定义更多特定版本的toString方法。如下:
var obj={x:1,y:2,z:3};
var arr=[1,2,3];
var fun=function(a){alert(a);};
var dat=new Date();
var reg=/[api]/i;
console.log(obj.toString());//=>[object Object]
console.log(arr.toString());//=>1,2,3
console.log(fun.toString());//=>function(a){alert(a);}
console.log(dat.toString());//=>Wed Feb 01 2023 18:45:55 GMT+0800 (中国标准时间)
console.log(reg.toString());//=>/[api]/i
//这两组对比,足以证明转换时调用了toString()这个方法
console.log(String(obj));//=>[object Object]
console.log(String(arr));//=>1,2,3
console.log(String(fun));//=>function(a){alert(a);}
console.log(String(dat));//=>Wed Feb 01 2023 18:45:55 GMT+0800 (中国标准时间)
console.log(String(reg));//=>/[api]/i
数组类的toString()方法将每个数组元素转换为一个字符串,并在每个元素之间添加一个逗号后合并成一个结果字符串。
函数类的toString()方法返回这个函数的JavaScript源代码字符串。
日期类的toString()方法返回一个可读的(可被JavaScript解析的)日期和时间字符串。
正则表达式类的toString()方法返回的则是正则表达式直接量的字符串。
- 如果对象没有
toString()方法,或者这个方法并不返回一个原始值,那么JavaScript会调用valueOf()这个方法(如果存在),该方法返回一个原始值,JavaScript将该原始值转换为字符串返回。 - 如果这两种方法都不存在,此时就会抛出一个类型错误异常。
对象到数字
转换过程与上面类似,只不过JavaScript会首先尝试使用valueOf()方法将对象转化为原始值,再将原始值转换为数字。
对于valueOf()这个方法的描述是将对象转换为原始值。但由于对象是复合值,且大多数对象无法真正表示为一个原始值,因此默认的valueOf()只会简单的返回对象本身,无法转换为数字。数组、函数、正则表达式继承了这个简单的默认方法,调用这些类型的valueOf()方法,只会简单的返回对象本身。接着JavaScript就会调用toString()方法。
这就能解释为什么空数组会转换成0,因为首先调用valueOf()方法,返回的是对象,而不是原始值,无法转换为数字。接下来就会调用toString()方法,将空数组转换为空字符串,空字符串转换为数字0.
var dat=new Date();
console.log(Number(dat));//=>1675252338583
console.log(dat.valueOf());//=>1675252338583
var arr=[1,2];
console.log(Number(arr));
console.log(Number(arr.toString()));//=>'1,2'=>NaN