ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript数据类型转换

2021-04-13 18:53:42  阅读:165  来源: 互联网

标签:类型转换 转换成 数字 对象 javascript NaN 布尔值 字符串 数据


在js中,总的来说数据类型分为两大类,一类是原始值类型的,一类是引用类型的。原始值类型的包括:字符串(String) 、数字(Number) 、布尔值(Boolean) 以及两个特殊的值 null 和  undefined 。引用类型的主要是指对象,在js中,对象的范围很广,甚至有js中一切都是对象这样的说法。对象可以分为 对象(Object) 以及更具体的数组(Array) 、 函数(Function) 等类型。要注意的是,js中typeof运算符返回的类型只有:sting、number、boolean、object、function、undefined几种,typeof null 返回的是 object,但一般认为null是不属于对象的 .

关于js中是不是一切都是对象这句话,其实是有争议的。例如,我们可以直接在通过单引号或双引号定义的字符串字面量上调用方法:

?  

1

'this is a string'.charAt(0);  

这条语句是能够执行并得到正确结果的。字符串的确是个对象,但是问题在于没有通过构造函数而是直接使用字面量的字符串又算不算对象呢?这还要说吗,这个语句不就是在字符串字面量上调用的方法嘛,能调用方法的当然是对象了。是的,我们看到的的确是这样,但事实又是如何呢?

事实就是,通过字面量定义的字符串并不是对象,或者最多只能说它是个伪对象,因为当在字符串字面量上调用方法或属性时,程序会在背后默默的创建一个与这个字面量的值相等的临时字符串对象,然后再在这个临时对象上调用属性或方法,最后把结果返回去,这个临时字符串对象完成使命后也随之会被销毁。

还有一个有力的证据就是,你可以在字符串字面量上添加一个属性,或者是改变一个属性值,但结果是无法成功的:

?  

1

2

3

var  s = 'this is a string';  

s.bar = 'hello'; //给这个字符串添加一个属性  

alert(s.bar);  //结果得到的是 undefined,不是 'hello'  

得到undefined的原因是,s.bar 这个属性是加在了程序偷偷创建的那个临时字符串对象上,但我们无法得到这个临时字符创对象的引用,而且这个临时字符串对象很快就被销毁了。所以给字符串字面量添加属性或改变属性值是没有任何意义的,因为它根本不会受到影响。

数字字面量以及布尔值字面量也是类似的原理,这里就不再赘述了。

下面进入正题了---js中各种数据类型间的相互转换。

 

一、转换成布尔值

程序在 if 语句 以及 ||、&&、! 等逻辑判断的环境下会把表达式自动转换成布尔值。
想要手动转换某个东西为布尔值有两种方法:1、使用 !! ; 2、使用 Boolean(),记住前面不要加new;

1、数字转换成布尔值

01

除了0被转换成false外,所有自他数字都会被转换成true, NaN 也总是被转换成false

2、字符串转换成布尔值

01

这个更简单,除了空字符串被转换成false外,所有字符串都会被转换成true

3、其他类型转换成布尔值

01

undefined和null会被转换成false, 任何对象(包括数组)和函数都会被转换成true,记住,是任何

?  

1

2

3

var  o = new Boolean(false);  

alert(o);//转换成字符串,结果是false  

alert(!!o); //转换成布尔值,结果是 true  

 

二、转换成字符串

把某一个东西强制转换成字符串有两种方法:

?  

1

2

''  + x //方法一,用一个空字符串与之相加  

String(x) //方法二,使用不带new的字符串构造函数  

1、数字转换成字符串

01

这个没什么要说的,数字都是按原样转换成字符串,但用科学计数法表示的数字(也就是带e的)会转换成它内部代表的真实的数字的字符串。

还需要注意的是,当使用二元的加号运算符时,如果两个运算数中有一个不是数字,则会进行字符串的连接操作,而不是数学加法操作,两个运算数都会被转换成字符串。当null与数字相加时,不会进行字符串连接,而是会把null转换成0来进行数学元素。

?  

1

2

3

[]+1+3  //结果为13  

[1]+3   //结果为13  

null+1+3  //结果为4  

2、其他类型转换成字符串

01

当对象或函数转换成字符串时,会调用它们的 toString() 方法来进行转换,默认的是 Object.prototype.toString 和 Function.prototype.toString,但它们是可以被我们自定义的toString方法覆盖的。当把一个函数转换成一个字符串时,不一定就要显示函数的源代码,Function.prototype.toString 方法的结果依赖于它的环境是怎么实现它的。

 

三、转换成数字

除了加号以外的其他数学运算符,都会进行转换为数字的操作。把一个东西强制转换成数字也有两种方法:

?  

1

2

3

+x //使用一个一元的加号运算符,这是最快的方法  

x-0 或 x*1 //另一种形式  

Number(x)  //使用不带new的数字构造函数进行转换  

1、字符串转换成数字

01

除了空字符串会被转换成0以外,如果字符串中是正确的数字书写形式,那么都可以顺利转换成相应的数字,不管是小数、科学计数还是八进制、十六进制形式等。但是如果参杂了其他不能构成数字或不符合数字书写规则的东西,则会被转换成NaN。

NaN是指不是数字的意思,任何数字数字跟NaN进行运算得到的结果都是NaN,NaN甚至跟自己也不相等。

2、其它类型转换成数字

01

对象和函数总是被转换成NaN, undefined也会被转换成NaN, 但null会被转换成0

上面的表遗漏了数组的情况。数组会首先被转换成字符串,然后再转换成数字。

?  

1

2

3

4

5

alert(+[]);   //结果为0  

alert(+[1]);  //结果为1  

alert(+[1,2]);  //结果为NaN  

alert(+new Array(1)); //结果为0   

alert(+new Array(1,2)); //结果为NaN  

3、两个数字转换函数

parseInt

01

01

01

parseFloat

01

01

 

数据类型转换看起来很简单,但有些东西却很容易弄混淆,要想真正掌握它,也还是要花费一些功夫的。

 

标签:类型转换,转换成,数字,对象,javascript,NaN,布尔值,字符串,数据
来源: https://blog.51cto.com/u_15166492/2703891

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有