您的位置:首页 > Web前端 > JavaScript

JS中数据类型间转换

2017-05-02 20:17 417 查看

数据类型间转换

显示类型转换

通常所说的类型转换,是直接通过某些方法将值从一种类型转换为另一种类型

字符串转化为数值

Numer()函数

其参数可以是任何数据类型

不同数据类型Number()函数转化的情况

Boolean值,true和false分别被转化为1,0

undefined,转化为NaN

String

* 字符串只有数值(正负号也算),转化为十进制,(开头数字的0会被忽略)
* 字符串包含有效的浮点数格式,则转为为对应的浮点数(开头数字的0会被忽略)
* 字符串包含有效的十六进制,则将其转化为十进制
* 空字符串会被转换为0
* 除此之外的一切字符串都为NaN


对象(包括数组)

如果是对象的话首先会转化为相应的基本数据类型,如果对象有valueOf()方法则调用该方法并返回基本类型值,如果没有就使用toString()的返回值。最后再进行强制转换。如果valueOf()、toSting()都没有则会产生错误TypeError(使用Object.create(null)创建的对象就是这样的)。

举些例子

var num1=Number(ture);//1
var num2=Number(false);//0
var num3=Number(undefined)//NaN
var num4=Number('123');//123
var num5=Number('0xf');//15


parseInt(string,radix)函数

radix是转化后的进制数,默认为十进制

作用

从头开始解析字符串,一旦检测到非有效数字就会停止检测,这也就是为什么开头为字母的字符串始终都不能被转化为整数。

实例

var num1=parseInt("123sda"); //123
var num2=parseInt(""); //NaN
var num3=parseInt("0xA");10
var num4=parseInt("22.5"); //22.5
var num5=parseInt("070"); //56
var num6=parseInt("70"); //70
var num7=parseInt("0xf"); //15
var num8=parseInt("F"); //NaN
var num9=parseInt("F",16); //15
var num10=parseInt("F",1); //NULL


注意

radix如果是0则按照十进制进行转换,如果radix小于2或者大于36则返回NULL。

Boolean()

参数可以是任何数据类型

不同数据类型转化的情况

转化成false的有:

- +0,-0,NaN

- ”(空字符串)

- false

- null

- undefined

- 假值对象

转换成ture的有:

除了上面的以外的值都是真值,所以的对象均是真值。

补充

假值对象不是我们所说的对象,它实际上在JS语言范畴之外。举个例子:document.all就是一个类数组对象,但现在它并不是一个真正意义上的对象,它的布尔值转换为false。如果在老的版本中,可能它是一个真正意义上的对象,所以为转化为true

对于数组

数组使用这个方法的时候跟其他的数据类型不太一样,它里面每个元素都会调用toString方法,然后用,号把返回的字符串连在一起。

String()、toString()

没有基数参数,能把任何数据转换为字符串,除了null、undefined其他的数据类型转换的结果在默认情况下均与toString这个函数相同。如果参数是布尔值或者字符串返回的就是其本身的字符串形式。如果参数是数字,如果数的绝对值大于等于1e20的字符串将是它的指数形式,如果数的决定值小于或等于e-7,将也会是它的指数形式。如果参数是数组,则会使每个元素用逗号隔开形成的字符串。

注意

[null]会被转化为空字符串而不是’null`’

强制类型转换(隐式类型转换)

+导致类型转换

为了方便说明,下面我会随便写几个栗子作为讲解内容

栗子一:

var a=4+'a';//4a


这个栗子大家应该都知道,无非就是+作为字符串的连接符时,可以将数字和字符串连接起来形成字符串。

栗子二:

var b='5';
var c=3+ +b;//8


我们发现c的值是8而不是字符串’35’,之所以会这样是因为发生了强制类型转换,+b为将b强制转换为数值5,然后再与3相加。

栗子三:

var d={}+[];//"[Object Object]";


看到这里对于初学者来说,可能认为这两个表达式会报错,然而实际上它仍然变成了一个字符串。这是因为{}在表达式中作为一个空对象,当强制转换为字符串”[Object object]”,而[]会被转换为”空字符串。

栗子四:

var e={}+ +[];//"[Object Object]0"


结合栗子三和四,我们应该很清楚这是为什么了吧,这里我就不作过多解释。

原理分析

分析完上面四个栗子后,可能还是会觉得有点懵逼,+号到底是怎么导致的强制类型呢?我们可以看看下面的这个栗子

var testObj = {
toString:function(){
4000

return 1;
}
}

console.log(1 + testObj);// 2
console.log('1'+ testObj);// 11


从上面栗子就可看出,发生强制类型转换的时候,是通过toString()方法将其转换。只不过第二个console语句中,调用了两次(第一次调用的是这个对象的toString方法,第二次调用的是返回的数值1对应的基本包装类型的toStirng()方法),但是实际上真的有这么简单吗,可以看下面这个栗子:

var testObj = {
valueOf:function(){
return 1;
}
}

console.log(1 + testObj);// 2
console.log('1'+ testObj);// 11


然而我们发现这个时候,强制类型转换时调用的居然是valueOf这方法,不是之前说好的调用toString()方法么,让我们再看一个栗子

var i = 0;
var testObj = {
valueOf:function(){
return ++i;
},
toString:function(){
return ++i;
}
}

console.log(1 + testObj);// 2
console.log('1'+ testObj);// 12


最后我们发现,在发生类型转换的时候直接调用了valueOf()而不是toString()。不过这里还没有结束,我们还要举一个更这个悄悄相反的栗子。

var date = new Date();
date.toString = function(){
return 2;

}
console.log(1+date);3

date.toString = null;
date.valueOf = function(){
return 3;
}
console.log(1+date);// 4

date.toString = function(){
return 2;
}
date.valueOf = function(){
return 3;
}

console.log(1+date);// 3


这里在发生强制类型转换的时候首先尝试调用的是toString(),然后再尝试调用valueOf()。

综上可以得出在这种情况下发生强制类型转换的具体过程:

如果是非Data对象

首先尝试是否能调用valueOf()进行转换,若能则则返回转换后的结果值,返回之后

的结果值,然后再根据具体情况调用相应的方法做类型转换。

如果不能则是尝试调用valueOf()进行转换,则根据具体情况调用相应的方法做类型转换。

如果是Data对象

与上面刚刚相反

如果是原始类型

则根据具体情况调用相应的方法做类型转换。

==导致类型转换

==与===的区别大家应该都清楚,===不仅要求两者的值相等而且它们两的类型也必须相等。而==则只需要值相等就行了,不需要考虑两者的类型,但是这期间有时候也会偷偷地发生了类型转换。接下了又来随意举些栗子说明下:

console.log(null == undefined);// true


从这个栗子中我们狠可能误认为这无非是将null和undefined通过类型转换变为0了,因为这些都是假值,其实这里根本没有发生任何的类型转换,因为JS规定了它们两肯定不等。为了证明这点,来看看下面这个栗子:

console.log(null == 0);// false


输出的结果是false,很明显根本就没有发生类型转换。因此我们可以得出结论:如果两侧中只要存在null或者undefined就一定不会发生类型转换。那么发生类型转换的又是哪些呢?可以看看下面这栗子:

var obj = {
toString:function(){
return 1;
}
}
console.log( 1 == obj); // true


var obj = {
valueOf:function(){
return 1;
}
}
console.log( 1 == obj); // true


var obj = {
valueOf:function(){
return 1;
},
toString:function(){
return 2;
}
}
console.log( 2 == obj); // true


var test = new Date();
test.toString = function(){
return 1;
}
console.log(1 == test); // true


var test = new Date();
test.toString = function(){
return 1;
}
test.valueOf = function(){
return 2;
}
console.log(1 == test); // true


看完这些栗子,我们会发现这不就与之前提到的+号导致的类型转换发生的是一样的情况吗。

最后再来总结一下==引起的类型转换:

等式两侧有null或者undefined

永远不会发生类型转换

null == undefied 始终为true

等式某一侧是原始类型且另一侧不是null以及undefined:

将原始类型转换为数值再进行比较

等式某一侧是非Date对象且另一侧不是null以及undefined:

先对这一侧尝试调用valueOf()方法

如果失败则再尝试调用toString()方法,然后再进行比较。

等式某一侧是非Date对象且另一侧不是null以及undefined:

先对这一侧尝试调用toString()方法

如果失败则再尝试调用valueOf()方法,然后再进行比较。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript