JS中数据类型间转换

来源:互联网 发布:淘宝双十一超级红包 编辑:程序博客网 时间:2024/05/14 13:42

数据类型间转换

显示类型转换

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

字符串转化为数值

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);//1var num2=Number(false);//0var num3=Number(undefined)//NaNvar num4=Number('123');//123var 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(){        return 1;    }}console.log(1 + testObj);// 2console.log('1'+ testObj);// 11

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

var testObj = {    valueOf:function(){        return 1;    }}console.log(1 + testObj);// 2console.log('1'+ testObj);// 11

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

var i = 0;var testObj = {    valueOf:function(){        return ++i;    },    toString:function(){        return ++i;    }}console.log(1 + testObj);// 2console.log('1'+ testObj);// 12

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

var date = new Date();date.toString = function(){    return 2;    }console.log(1+date);3date.toString = null;date.valueOf = function(){    return 3;}console.log(1+date);// 4date.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()方法,然后再进行比较。
0 0