javaScript数据类型总结

javaScript数据类型

六种简单的数据类型:Undefined、Null、Boolean、Number、String、Symbol(ES6新增,表示独一无二的值)

一种复杂数据类型——Object

数据类型内存的存储和引用可以参考:JS中简单数据类型和复杂数据类型在内存中的存储和引用

  • Undefined类型

在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。也就是说undefined是变量的默认值

举个例子:下图a和b变量显示的结果是一样的

        var a=undefined;
        console.log(a)   //undefined
        console.log(a==undefined)   //true

        var b
        console.log(b)   //undefined
        console.log(b==undefined)   //true

 

对未初始化和未声明的变量执行typeof操作符(检测变量数据类型)返回的是值都是undefined(见下图),所以建议定义变量时要自己初始化一下,这样当typeof操作符返回的值为undefined时,我们就可以清楚的知道该值没有定义。

  • Null类型 

null值表示一个空对象指针

  • 由于null是一个空对象指针,所以(typeof null) 的返回值是"object"
  • 由于undefined值派生于null值,所以(undefined==null)返回的是true
  • 只要意在保存对象的变量还没真正保存对象,就应该明确地让该变量保存null值。

 

 

  • Boolean类型

该类型只有两个字面值truefalse

true和false是区分大小写的,所以True和False以及其他混合大小写形式)都不是Boolean值,只是标识符。

可以对任何数据类型的值调用 Boolean()函数,而且总会返回一个 Boolean 值。至于返回的 这个值是 true 还是 false,取决于要转换值的数据类型及其实际值。下表给出了各种数据类型及其对应的转换规则。

var mes='micky'
var mesBoolean = Boolean(mes)
数据类型 转换为true的值转换为false的值 
Booleantruefalse
String任何非空字符串 ""(空字符串) 
Number任何非零数字值(包括无穷大)0和NaN
Object任何对象null
Undefined/undefined 

 

  • Number类型

该类型表示整数浮点数值

最基本的数值字面量格式是十进制整数,如果要表示八进制的话,第一位必须是0,后跟八进制序列(0~7)。如果要表示十六进制的话,前两位必须是0x,后跟十六进制数字(0~9和A~F)。

  • 八进制字面量在严格模式下是无效的。
  • 如果八进制字面值中的数据超出了范围,则前面的零会被忽略,后面的数字当作十进制处理。
  • 在进行算术计算时,八进制和十六进制最终都会被转换成十进制进行计算。

1)浮点数值

浮点数值就是该数值中必须包含一个小数点,并且小数点后至少有一位数字,最高精度是17位小数。

当小数点后没有数字,例如 2.  ,或者浮点型本身就是一个整数,例如 2.0,都会被自动转换成整数。

极大和极小的数值,可以用科学计数法表示的浮点数值表示。

var floatNum = 3.125e7    //等于 31250000

在默认情况下,ECMAScript会将那些小数点后面带有6个零以上的浮点数值转换成以科学计算法表示的数值。

 

浮点计算的通病js也有,就是计算时精确度远远不如整数。

例如按理说0.1+0.2=0.3,而真实的结果居然是0.30000000000000004,所以 0.1+0.2==0.3 返回值是false!但是 0.1+0.3==0.4 返回值又是true。好吧,注意就好,认真就输了。

 

2)数值范围

大多数浏览器中,最小值是5e-324,最大值是1.7976931348623157e+308。其实一般情况下不会超出表示范围。

JavaScript能表示并进行精确算术运算的整数范围为:正负2的53次方,也即从最小值-9007199254740992到最大值+9007199254740992之间的范围;对于超过这个范围的整数,JavaScript依旧可以进行运算,但却不保证运算结果的精度。

 

3)NaN

NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况。

这解释有点绕,直接看代码吧。

先简单点解释下isNaN()函数,该函数用于检查其参数是否是非数值。如果是数值,就返回false。如果不是数值,会尝试转换成数值,转换后是数值就返回false,无法为转换成数值就返回ture。

(例如ture转成了1; '10'转成了10; 而对象的话就是先调用valueOf()方法,看它返回值是否是数值,如果不是再用它的返回值调用toString()方法,再测试返回值)

console.log(isNaN(NaN))       //true
console.log(isNaN(10))        //false(10是一个数值)
console.log(isNaN('10'))      //false(可以被转换成数值10)
console.log(isNaN('blue'))    //ture(不能被转换成数值)
console.log(isNaN(ture))      //false(可以被转换成数值1)

var o = new String('10')
console.log(isNaN(o))  //false (调用对象o的valueof()方法,返回值是数值10)

 

再来强调NaN两个非同寻常的特点:首先,任何设计NaN的操作(例如NaN/8)都会返回NaN。其次是NaN与任何值都不相等包括NaN本身!这小子连自己都不认了 -0-。

4)数值转换

有三个函数可以把非数值转成数值:Number()parseInt()parseFloat()。Number()可以用于任何数据类型,其余两个专门把字符串转换成数值。

三个函数的详细转换规则可以参考该博客:阳光下的冷静的js数值转换

Number()函数转换规则,这里直接举个例子简单了解下。

var num1 = Number("Hello world!");    //NaN 因为其中不包含任何有意义的数字值
var num2 = Number("");               //0  空字符串会被转换成0
var num3 = Number("000011");         //11  忽略了其前导0
var num4 = Number(true);            //1  ture值则被转换为1

由于Number()函数在转换字符串时比较复杂而且不合理,因此在处理整数的时候更常使用parseInt()函数。而又因为使用一个参数的parseInt()解析八进制字面量的字符串,ES3和ES5是存在分歧的,比如

var num = parseInt("070")
console.log(num)    //ES3认为是56(八进制),而ES5认为是70(十进制)

因此转换时我们最好使用parseInt()的第二个参数——转换时使用的基数(即多少进制),这样可以保证得到正确的结果,比如:

var num1 = parseInt("10",2);   //2
var num2 = parseInt("10",8);   //8
var num3 = parseInt("10",10);  //10
var num4 = parseInt("10",16);  //16

parseFloat()转换数值几个典型示例

var num1 =  parseFloat(“1234blue”)`;        //1234  遇到无效的浮点数字字符'b'就停止解析了
var num2 =  parseFloat("oxA")`;             //0  同上
var num3 =  parseFloat("22.5")`;            //22.5  正常解析
var num4 =  parseFloat("22.34.5")`;         //22.34  遇到第二个小数点也停止解析
var num5 =  parseFloat("0908.5");           //908.5  忽略前置零
var num6 =  parseFloat("3.125e7");          //31250000  解析整数,则输出的值为整数

 

  • String类型

String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由双引号( " )或者单引号( ' )表示。

该类型也包含一些特殊的字符字面量,即转义序列,用于表示非打印字符,或者具有其他用途的字符。比如 '\n'(换行)、'\t'(制表)等。

任何字符串的长度可以通过访问其lenth属性取得,一个转义序列表示一个字符

var text = 'ok!\n'
alert( text.length)  //4

转换为字符串

要把一个值转换成一个字符串有两种方式,第一种是几乎每个值都有的toString()方法,null和undefined没有toString()方法。在不知道转换值是不是null或者Undefined的情况下,可以使用第二种转型函数String()来转换。

toString()一般不用传递参数。在调用数值的toString()方法时,默认是以十进制输出,如果想输出二进制的话,则可以用toString(2)输出,其他进制同理。

要把某个值转换成字符串,也可以使用加号操作符把它与一个字符串("")加在一起。

        var x = 10;
        alert(x.toString())     //字符串'10'
        alert(x.toString(2))    //字符串'1010'
        var y = true;
        alert(y.toString())     //字符串'true'
        var z
        // alert(z.toString())  //报错!
        alert(String(z))        //字符串'undefined'
        alert(z+"")             //字符串'undefined' 

 

  • Object类型

ECMAScript中的对象其实就是一组数据和功能的集合。

对象可以通过执行new操作符后跟要创建的对象类型的名称来创建,创建Object对象如下所示:

var o = new Object()

每个Object类型的实例共有的属性和方法:

  • constructor: 保存着用于创建当前对象的函数。
  • hasOwnProperty:用于检测给定的属性在当前对象的实例中是否存在。
  • isPrototypeOf : 用于检查传入的对象是否是当前对象的原型
  • propertyIsEnumerble : 用于检查给定属性能否使用for-in来枚举
  • toLocaleString() : 返回对象的字符串表示。
  • toString() : 返回对象的字符串表示。
  • valueOf() : 返回对象的字符串,数值,或布尔表示。通常和toString() 返回的值相同。

Object类型是所有对象的基础,因此所有对象都具有这些基本的属性和方法。

简单点说:当创建一个对象时,这个对象的数据类型就是Object,并且拥有Object的属性和方法,如下图所示

注意:array和function都是属于object的子类,原因如下,详细可参考该博客:JS内置Function对象详解

    var myArray=[]; 
  //等价于 
  var myArray=new Array(); 
  //同样,下面的两段代码也都是创建一个函数myFunction:  
  function myFunction(a,b){ return a+b; } 
  //等价于 
  var myFunction=new Function("a","b","return a+b");
  • Symbol数据类型

ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。

ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。

详细可以参考阮一峰老师的博客http://es6.ruanyifeng.com/#docs/symbol

 

 

以上内容参考自《JavaScript高级程序设计(第3版)》,再加上一些个人理解,还是小白学习阶段,如果理解有误,望各路大神指出。

引用了一些博客,如侵权请联系本人删除。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值