JavaScript-数据类型
综述
JavaScript中的数据类型分为两类:1、简单数据类型(基本数据类型) 2、复杂数据类型
其中简单数据类型包括:undefined、null、boolean、number、string
复杂数据类型包括:object
如何判断变量的数据类型(typeof操作符)
typeof是操作符不是一个函数,()可以使用也可以不使用。
eg :下列写法表示同一个意思
console.log(typeof(1)) //number
console.log(typeof 1) //number
undefined 类型介绍
undefined类型只有一种情况,即在使用var声明变量但为进行初始化。关于undefined的认知,可以通过下列demo进行理解。
// undefined demo
var temp;
console.log(temp) //undefined 可以看出未初始化就是默认了 undefined;与后面提到的null类型可以进行一次比较
// console.log(othertemp) //报错:Uncaught ReferenceError: othertemp is not defined 备注报错后,下面语句就不能执行了
console.log(temp === undefined) //true
console.log(temp === 'undefined') //false 要区分一下 undefined 和 'undefined'是两个东西
console.log(typeof temp) //undefined
console.log(typeof temp === 'undefined') //true 可以看出typeof得到的类型结果都是string字符型
console.log(typeof temp === undefined) //false 可以看出typeof得到的类型结果都是string字符型
console.log(typeof (typeof (temp))) //string
console.log(typeof undefined) //undefined
null 类型介绍
和undefined很相识,这种类型只有一个值,这个值就是null。但是null不同于undefined地方在于逻辑上,null值表示一个对象的空指针(针对的是复杂数据类型object),而undefined针对的是简单数据类型。关于null的认知,可以通过下列demo进行理解。
//null demo
var undefineddemo;
console.log(typeof (undefineddemo)) //undefined 可以看出未初始化就是默认了 undefined;与后面提到的null类型可以进行一次比较
var nulldemo = null //如果定义的变量想用来保存对象,那将该变量初始化为null而不是其他值
console.log(typeof (nulldemo)) //object 说明: null值表示一个对象的空指针,所以类型返回了object
console.log(typeof (null)) //object 说明:null值表示一个对象的空指针,所以类型返回了object
boolean 类型介绍
boolean类型有两种值:true和false,区分大小写(不要写成True和False)。很容易理解,但是在JavaScript中,尤其在if...else语句中很多非boolean类型的值被用来做判断,这就涉及一个转化关系,具体的转化关系如下所示:
数据类型 | 转化为true的值 | 转化为false的值 |
String | 任何非空字符串 | “”(空字符串) |
Number | 任何非零数字值 | 0和NaN |
Object | 任何对象 | null |
undefined | 无 | undefined |
number 类型介绍-最复杂的类型
JavaScript你是找不到int、float、double等类型标识符的,只有number类型。但是JavaScript帮你处理了。
整数,如下Demo可以帮助理解:
//整型
var a = 2 //整数
var b = 010 //八进制-以0开头
var c = 0xF //十六进制-以0x开头
console.log(a) //2
console.log(b) //8 转成了10进制的8
console.log(c) //15 转成了10进制的15
console.log(a + b + c) //25 运算时都会转为10进制结果
浮点数:数值中必须包含一个小数点,且小数点后至少含有一个非0的数值,浮点数相对比于整数,在内存空间的存储上是两倍的关系,所以在以下几种情况下,浮点数转换为整数,这样就能节省空间。具体对浮点型的一些理解看如下Demo:
//浮点型
var float1=1. //小数点后没有数字,最后还是输出为1
var float2=1.0 //小数点后有数字但是0,最后还是输出为1
var float3=1.00000 //小数点后有数字但都0,最后还是输出为1
var float4=1.10 //是浮点型了,小数最后的0会被去掉,最后输出为1.1
var float5=1.1 //正规的浮点数
var float6=1.012345678901234567890123456789 //很长的浮点型 观察结果
var float7=123456789.01234567890123456789 //很长的浮点型 观察结果
console.log(float1) //1
console.log(float2) //1
console.log(float3) //1
console.log(float4) //1.1
console.log(float5) //1.1
console.log(float6) //1.0123456789012346 连小数点在内有18位,做了四舍五入处理
console.log(float7) //123456789.01234567 连小数点在内有18位,这里没做四舍五入处理
针对上面demo的float6和float7,我们来来探讨一下数据精度的问题。
JavaScript对于很大的值和很小的值会使用科学计数法(e或者E)来表示,用科学计数法表示的数值等于e前面的数值乘以10的指数次幂。
这里很大的值表示:当整数的位数超过22位时,会自动转化为科学记数法。
这里很小的值表示:小数点前边是0,小数点后面有6个或6个以上的0,会自动转化为科学记数法。
备注Start:
但使用很大的值或者进行浮点型数据计算时会发现很多奇怪的现象:比如
这里是精度丢失问题导致的,具体原因可参考另一篇文章,这里不过多描述。只是在计算上要多留一个心眼。
备注End
请看如下Demo:
var float1=12345678901234567890123456789
var float2=0.123456789012345678901234567
var float3=1.000000009012345678901234567
var float4=0.000001234567890123456789012
var float5=0.000000123456789012345678901
console.log(float1) //1.2345678901234568e+28 这是一个很大的值
console.log(float2) //0.12345678901234568 这是一个浮点数,但小数点后面没有6个或以上的0,所以不会转化为科学计数法
console.log(float3) //1.0000000090123458 这是一个浮点数,但小数点后面有6个或以上的0,但不是一个很小的值,所以不会转化为科学计数法
console.log(float4) //0.0000012345678901234567 这是一个很小的,但小数点后面没有6个或以上的0,所以不会转化为科学计数法
console.log(float5) //1.2345678901234568e-7 这是一个很小的值,但小数点后面有6个或以上的0,所以不会转化为科学计数法
浮点数值的最高精度为17位小数(这里的精度指的是:小数点前后总共的位数,但是要注意0的情况,怎么说呢,看下面Demo),
var float1=12345678901234567890123456789
var float2=0.123456789012345678901234567
var float3=1.000000009012345678901234567
var float4=0.000001234567890123456789012
var float5=0.000000123456789012345678901
console.log(float1) //1.2345678901234568e+28 1.2345678901234568 17位 做了四舍五入
console.log(float2) //0.12345678901234568 .12345678901234568 去掉了前面的017位 做了四舍五入
console.log(float3) //1.0000000090123458 1.0000000090123458 17位 做了四舍五入但是发现最后一位应该是7 但是结果是8
console.log(float4) //0.0000012345678901234567 12345678901234567 去掉了前面的0就是17位 但是没有四舍五入
console.log(float5) //1.2345678901234568e-7 1.2345678901234568 17位 做了四舍五入
NaN,非数值,可以用isNaN()这个函数来做判断。有如下特点:
console.log("zifuchuan" / 0) //NaN 这种计算按理应该抛出异常,但是没有会返回NaN
console.log("10" / 0) //Infinity 这里JavaScript的处理很让人无语,记住就好
console.log(NaN + 10) //NaN 任何数和NaN计算结果都是NaN
console.log(NaN === NaN) //false 任何数和NaN都不相等,包括自己
console.log(isNaN(NaN)) //true
console.log(isNaN("10")) //false 可以被转化为数值,所以不是NaN
console.log(isNaN("test")) //true 不可以被转化为数值,所以是NaN
console.log(isNaN(null)) //false 这个很不可思议,但是官方说法是isNaN方法会先尝试转为数值再判断,对象null会被转化为0,所以是数值,返回false
console.log(isNaN(new Date())) //false 这个也很不可思议,但是官方说法是isNaN方法会先尝试转为数值再判断,日期会转化为时间戳,所以是数值,返回false
console.log(isNaN({})) //true json对象不可以被转化为数值,所以是NaN
console.log(isNaN(false)) //false bool值是可以被转化为数值的,所以不是NaN
数值转换,这里有3个函数可以将非数值转换为数值,分别是Number()、 parseInt()、parseFloat()
Number()的转换规则如下:
1、如果是布尔值,true和false将分别转换为1和0;
2、如果是数字,只是简单的传入和返回;
3、如果是null 则转化为0;
4、如果是undefined则返回NaN;
5、如果是字符串:
5.1如果字符串中只包含数字,则会直接转换为十进制(十六进制的数也会转换为10进制的,但是八进制很尴尬,首位的0会被去掉),比如
5.2、字符串如果是空(“”)则转化为0;
5.3、字符串中有上述格式之外的字符,则转为NaN;
6、如果是对象则调用valueOf()的方法,依照上述的规则进行转换。
parseInt()相对Number()来说使用更加清晰
函数语法:parseInt(string, radix)
其中:
string必需,要被解析的字符串;
radix 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。这里也不要用八进制,会有很奇怪的现象,如果非要用,请将radix写为8。由于我们通常用的是10进制,所以务必将radix写成10,不要漏写!!!
console.log(parseInt("10")); //返回 10
console.log(parseInt("19",10)); //返回 19 (10+9)
console.log(parseInt("11",2)); //返回 3 (2+1)
console.log(parseInt("17",8)); //返回 15 (8+7)
console.log(parseInt("1f",16)); //返回 31 (16+15)
console.log(parseInt("010")); //未定:返回 10 或 8
console.log(parseInt("010",8)); //返回 8
parseFloat()
语法:parseFloat(string)
该函数指定字符串中的首个字符是否是数字。如果是,则对字符串进行解析,直到到达数字的末端为止,然后以数字返回该数字,而不是作为字符串。
1、 字符串中只返回第一个数字。
2、 开头和结尾的空格是允许的。
3、 如果字符串的第一个字符不能被转换为数字,那么 parseFloat() 会返回 NaN。
4、始终忽略前导0。
5、由于没有radix,所以只解析10进制。
console.log(parseFloat("10")); //返回 10 无异议
console.log(parseFloat("10.33")); //返回 10.33 无异议
console.log(parseFloat("10.33.34")); //返回 10.33 字符串中只返回第一个数字。
console.log(parseFloat("10 33 14")); //返回 10 字符串中只返回第一个数字。
console.log(parseFloat("string10")); //返回 NaN 如果字符串的第一个字符不能被转换为数字,那么 parseFloat() 会返回 NaN。
console.log(parseFloat("10 string")); //返回 10 字符串中只返回第一个数字。
console.log(parseFloat(" 10 ")); //返回10 开头和结尾的空格是允许的
console.log(parseFloat("010")); //返回 10 始终忽略前导0
console.log(parseFloat("0xFF")); //返回 0 由于没有radix,所以只解析10进制。
String类型介绍
用的最多的就是String类型了,没有太多好说的,直接看Demo:
console.log(typeof ('test')) //返回 string string 单引号和双引号都是被允许的
console.log(typeof ("test")) //返回 string
console.log("test" === 'test') //返回 true
var test1 = "china"
var test2 = "china "
var test3 = "china \r"
var test4 = "china r\r"
console.log(test1.length) //返回5 无异议
console.log(test2.length) //返回6 空格也是一个字符
console.log(test3.length) //返回7 /r是转义字符,只能算一个字符而不是两个
console.log(test4.length) //返回8 /r是转义字符,只能算一个字符而不是两个
console.log(true.toString()) //返回true
console.log(typeof(true.toString())) //返回string
console.log(0xFF.toString()) //返回255 会先转化为10进制
console.log(045.toString()) //返回37 八进制会先转化为10进制,但这么用的人脑子有问题
console.log(NaN.toString()) //返回NaN
console.log(typeof(NaN.toString())) //返回string
// console.log(undefined.toString()) //报错 Uncaught TypeError: Cannot read property 'toString' of null
// console.log(null.toString()) //报错 Uncaught TypeError: Cannot read property 'toString' of null
object类型介绍
一组数据和功能的集合,通过new创建,和Java、C#语法差不多。这里要注意object和Object是有区别的。小写的object是类型,大写的Object是 JavaScript 中一个重要的对象,其它对象都是基于它的,包括你创建的函数。
var test = new Object() //创建了一个对象 ()尽量不要省
console.log(test)
var test1 = new object() //直接报错了
这里我们可以看到test作为一个对象,有很多属性,如constructor等等。