数据类型
JS中的类型一共有六种。包括五种基本类型:数值(Number)、字符串(String)、undefined、null和布尔型(Boolean),一种复杂数据类型(Object)(ES6中新增了Symbol类型,这里暂不考虑)。
JS的数据类型之间可以进行类型转换
类型转换
JavaScript中的取值类型非常灵活。比如当JavaScript期望使用一个布尔值的时候,我们可以提供任意类型的值,JavaScript将根据需要自行转换类型。一些值转换为true,其他值转换为false。
10 + 'object';//‘10 object’数字10转换成字符串
'7' * '4';//28 两个字符串均转换为数字
1 - 'x';//NaN 字符串‘x’无法转换为数字
下表简要说明了在JavaScript中如何进行类型转换
值 | 字符串 | 数字 | 布尔值 | 对象 |
undefined | ‘undefined’ | NaN | false | throws TypeError |
null | ‘null’ | 0 | false | throws TypeError |
true | ‘true’ | 1 | new Boolean(true) | |
false | ‘false’ | 0 | new Boolean(false) | |
”(空字符串) | 0 | false | new String(”) | |
‘1.2’(非空,数字) | 1.2 | true | new String(‘1.2’) | |
‘one’(非空,非数字) | NaN | true | new String(‘one’) | |
0 | ‘0’ | false | new Number(0) | |
-0 | ‘0’ | false | new Number(-0) | |
NaN | ‘NaN’ | false | new Number(NaN) | |
Infinity | ‘Infinity’ | true | new Number(Infinity) | |
-Infinity | ‘-Infinity’ | true | new Number(-Infinity) | |
1(无穷大,非零) | ‘1’ | true | new Number(1) | |
{}(任意对象) | toString()、valueOf() | valueOf() toString() | true | |
[](空数组) | ” | 0 | true | |
[9](一个数字元素) | ‘4’ | 4 | true | |
[‘a’](其他数组) | 使用join()方法 | NaN | true | |
function(){}(任意函数) | toString() valueOf() | valueOf() toString() | true |
这里需要说明一下:对象转换为字符串的时候先调用toString()方法,如果对象没有toString()方法,则调用valueOf()方法,否则抛出错误。对象转换为数值的时候,如果对象有valueOf()方法,则调用该方法返回数值。否则,如果对象具有toString()方法,该方法返回字符串,然后js将其转换为数值并返回。否则,js抛出错误
显式类型转换
显示类型转换最简单的方法是使用Boolean()、Number()、String()、Object()函数。当不通过new运算符调用这些函数时,它们会作为类型转换函数
Number('3');//3
String(false);//'false'
Boolean([]);//true
Object(3);//new Number(3)
另外,当将其他类型的值转换为数值的时候,还有parseInt()方法。不同于Number()函数,parseInt()函数在转换字符串是,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直到好到第一个非空格字符。如果第一个字符不是数字字符或者符号,parseInt()就会返回NaN;也就是说,用parseInt()转换空字符串、空数组会返回NaN(Number()对空字符串、空数组会返回0)。parseInt也能够识别出各种整数格式(十进制、八进制、十六进制)。除了parseInt()之外,parseFloat()则可以解析整数和浮点数
parseInt('1234blue');//1234
parseInt('');//NaN
parseInt('oxA",16)//10(十六进制数)
parseInt(22.5);//22
parseInt('070',8)56(八进制数)
parseInt('70');//70
parseFloat('3.14 met');//3.14
parseFloat('$72.3');//NaN
隐式类型转换
JavaScript中的某些运算符会做隐式类型转换,有时用于类型转换。
- 如果‘+’运算符的一个操作数是字符串,它将会把另外一个操作数转换为字符串。
- 如果‘-’运算符的一个操作数是数值型,它将会把另外一个操作数转换为数值型。
- 一元‘+’运算符将其操作数转为数字。
- 一元‘!’运算符将其操作数转换为布尔值并取反
- 相等运算符‘==’中,如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值(false转换为0,true转换为1);如果操作数是一个字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;当两个值都是对象 (引用值) 时, 比较的是两个引用值在内存中是否是同一个对象
- 小于、大于、小于等于和大于等于这几个运算符,如果一个操作数是数值,则先将其转换为数值,在进行比较
2 + '4';//'24'('+'操作符将数值型的2转换为了字符串类型 +运算符为字符串连接符)
'2' - 1;//1(减操作符将字符串类型转换为数值型)
+'2';//2(字符串类型转换为了数值型)
!!2;//true(数值型转换为布尔型)
true == 2; //false(true转换为数值1,1==2返回false)
null == undefined; //true
[] == false; //true(当对象和布尔值进行比较的时候 将两个值变为数值的形式)
[] == [];//false(比较对象的地址是否相同)
[] == ![];//true(![]为false 当对象和布尔值比较的时候转换为数值进行比较)
0 == '';//true (字符串转换为数值0)
总结
JavaScript中类型转换有的时候很隐蔽,所以在写判断语句或者做运算的时候要注意