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函数
:强制转换成字符串
ex:
使用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
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