JavaScript-数据类型

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等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值