欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

javascript---强制数据类型转换 javascript数据类型转换

程序员文章站 2022-04-12 22:34:19
...

 

javascript有时会自动根据需要将数据类型进行转换,这是我们不能控制的,这是javascript的自动类型转换,之后我也会对这种情况写个学习笔记的博文,现在引出这个,希望能更深的理解强制数据类型转换的主观性。
今天得主角---强制转换主要指使用Number、String和Boolean三个构造函数,是手动将各种类型的值,转换成数字、字符串或者布尔值,是我们主观想法想要让它转换的!
Number函数:强制转换成数值
使用Number函数,可以将任意类型的值转化成数字。
 
(1)原始类型值(数值,字符串,布尔值等基本类型或叫值类型)的转换规则
>数值:转换后还是原来的值。
>字符串:如果可以被解析为数值,则转换为相应的数值,否则得到NaN(了解更多)空字符串转为0
>布尔值:true转成1,false转成0。
>undefined:转成NaN(题外话:所以数值与undefined的任何运算[+、-、*、/]都得到NaN)
>null:转成0。
 
ex:
Number("123") // 123
Number("123a") // NaN
Number("123.6") // 123.6
Number("123.6.9") // NaN
Number("123.6a") // NaN

Number(false) // 0 ---布尔值true转为1,false转为0
Number(true) // 1 ---同上
Number(undefined) // NaN --- 要记住哦!以及任何数与undefined的任何运算的结果都是NaN
Number(null) // 0 
Number("") // 0  ---空字符串转为0
 
 Number("       ") // 0  ---空字符串转为0,前后空格被自动忽略了
 Number('\t\v\r12.34\n')  //  12.34  ,前后的空格、换行等都被忽略了
 
(2)对象类型(数组,函数,object{},RegExp等复合数据类型或叫引用类型)转换为Number类型的规则
对象数据类型的转换规则比较复杂,遵循以下步骤
 1)先调用对象自身的valueOf方法,如果该方法返回基本数据类型值类型,数值、字符串或布尔值等的值,则直接对该值使用Number方法,遵循上面原始类型的转换规则进行转换,不再进行后续步骤。
2)如果valueOf方法返回复合类型的值,再调用对象自身的toString方法,如果toString方法返回基本数据类型值类型,数值、字符串或布尔值等的值,则直接对该值使用Number方法,遵循上面原始类型的转换规则进行转换,不再进行后续步骤。
3)如果toString方法返回的是复合类型的值,则报错。
 
对于以上步骤的推敲与验证请参考后面的网址,我这篇学习笔记大多数部分参考的这篇文章:http://javascript.ruanyifeng.com/grammar/conversion.html
 
ex:
Number( {a:1} ) // NaN---首先调用valueOf方法,得到的是对象{a:1}本身,然后调用toString方法得到字符串"[object Object]",再使用Number方法,得到NaN的最终结果
 
Number( [1,2,3]) // NaN --- 首先数组调用valueOf方法,得到数组[1,2,3]本身,然后调用toString方法得到字符串"1,2,3",再使用Number方法,得到NaN的最终结果
 
var a = new Number(5); Number(a) // 5---这里a是封装的number类型的对象类型,a先调用valueOf方法,直接得到了基本类型的数据,所以直接按基本数据类型的转换规则得到了5的结果
 
var a = new String("5");Number(a) // 5---原理同上,差别在于valueOf直接得到了字符串“5”
 
var a = new String(true);Number(a + "2") // 5---原理同上,差别在于valueOf直接得到了字符串“5”
 
 
String函数:强制转换成字符串
使用String函数,可以将任意类型的值转化成字符串。规则如下:
 
(1)原始类型值(数值,字符串,布尔值等基本类型或叫值类型)的转换规则
>数值:转为相应的字符串。
>字符串:转换后还是原来的值。
>布尔值:true转为“true”,false转为“false”。
>undefined:转为“undefined”。
>null:转为“null ”。
 
ex:
String(123)  //  "123"
var a = 10;    a.toString()  //  10
var a = 10.0; a.toString()  //  10  ---需要注意一下
var a = 10.4; a.toString()  //  10.4
String("abc")  //  "abc"
String(true)  //  "true"
String(undefined)  //  "undefined"
String(null)  //  "null"
(2)对象类型(数组,函数,object{},RegExp等复合数据类型或叫引用类型)转换为String类型的规则
如果要将对象转为字符串,则是采用以下步骤。
 1)先调用toString方法,如果该方法返回基本数据类型值类型,数值、字符串或布尔值等的值,则直接对该值使用String方法,遵循上面原始类型的转换规则进行转换,不再进行以下步骤。
2)如果toString方法返回复合类型的值,再调用valueOf方法,如果valueOf方法返回基本数据类型值类型,数值、字符串或布尔值等的值,则直接对该值使用String方法,遵循上面原始类型的转换规则进行转换,不再进行以下步骤。恕我才疏学浅,我不能想到调用toString方法返回复合类型的例子,所以这里都是执行第一步就结束了,没有执行第二步的情况,哪位大牛能举出例子,小妹不胜感激!)
3)如果valueOf方法返回的是复合类型的值,则报错。
*String方法的这种过程正好与Number方法相反。Number是先调用valueOf方法,String是先调用toString方法。
 
对于以上步骤的推敲与验证同样参考:http://javascript.ruanyifeng.com/grammar/conversion.html
ex:
String( {a:1} )  //  "[object Object]" ---先调用{a:1}的toString方法直接得到字符串"[object Object]"
String( [1,2] )  //   "1,2" ---数组调用toSring方法,就是把各项值通过逗号(,)连接成的字符串
String( [] )  //   ""   --- 空数组没有值,调用toString方法的话自然也不用逗号连接了,直接是空字符
String( /\d+/ )  //   "/\d+/"  --- 正则调用toString方法,得到正则表达式本身的字符串
String( function(){ alert("a") } )  //   "function (){ alert("a") }"  --- 函数调用toString方法,即得到函数本身的字符串
 
 
Boolean函数:强制转换成布尔值
使用Boolean函数,可以将任意类型的变量转为布尔值。
 
(1)原始类型值(数值,字符串,布尔值等基本类型或叫值类型)的转换规则
以下六个值的转化结果为false,其他的值 全部 为 true 
>undefined
>null
>-0
>+0
>NaN
>''(空字符串)
 
ex:
Boolean(undefined)  //  false
Boolean(null)  //  false
Boolean(0)  //  false
Boolean(NaN)  //  false
Boolean("")  //  false
Boolean(" ")  //  true --- 注意哦,Boolean方法不忽略前后空白字符,所以即使一个空格也会返回true
 
(2)对象类型的转换规则
所有对象的布尔值都是true,甚至连false对应的布尔对象也是true。
ex:
Boolean(new Boolean(false))  //  true   ---  充分印证所有的对象转换为布尔值都是true的真理
Boolean( [] )  //  true
Boolean (  {}  )  //  true