珠峰培训

JS数据类型详解一

作者:wy

2016-06-29 17:31:25

168

1.基础知识


js的数据类型分为基本数据类型和引用数据类型

基本数据类型:number,string,boolean,null,undefined

引用数据类型:object类型({}object,[]array,/^\d$/正则,Math Date) 和特殊类型(function)

如何来检测我们定义的变量是什么数据类型呢?

  • 可以通过typeof来检测数据类型

但是如果是对象类型的,typeof 检测返回值都是"object",没法细分具体是属于对象数据类型中的哪一种. (Object类是所有对象类的基类,在Object类下面还派生出很多类,比如Array,RegEXp等),那这个缺陷,可以通过instanceof来弥补

例如:
    var ary = [12,3];
    ary instanceof Array ->true //返回值通过true or false 来确定这个对象是否是属于这个类的实例
  • 除了这种方法外,还有一种更加通过并且安全的方式来检测数据类型,就是通过调用Ojbect类的tostring()方法,查看这个对象原始的是属于什么数据类型的

这种方式的检测只能检测内置类,自定义类没法检测,自定义类全部是返回"[object Object]" 这是我曾希望通过这种方式来检测得出的结果,自定义类可以通过下面的constructor来检测

例如检测数组:
    var ary = [];
    var regExp =/^([1-9]\d|\d)(.\d{2})$/
    Object.prototype.tostring.call(ary) ->"[object Array]";
    Object.prototype.tosting.call(reg) ->"[object RegExp ]";
    Object.prototype.tostring.call(null)->"[object Null ]";
    object.prototype.tostring.call(undefined) ->"[object Undefined]";

(会有个专题专门讲解toString,大家可以关注下)

  • 当然可能还可以通过constructor来检测数据类型 ,constructor是类原型上的一个属性,指向对应的构造函数

    var ary = [2,34];//定义了Array类的实例
    var obj = {};//定义了对象类的实例
    ary.constructor == Array ->true;
    obj.constructor == Object ->true

    通过constructor来检测是非常不安全的,一旦原型链发生改变时,constructor的指向也会发生改变

2.基本数据类型详解:

1. 基本数据类型之number类型(数类型)

什么是number类型呢?(整数,小数,NaN(不是一个有效数))

这边有必要对整数,小数做个解释

在javascript内部,所有的数字都是以64位浮点数形式存储,即使整数也是如此,所以1与1.0是相对的(1===1.0)所以在js语言的底层,根本没有整数,所有的数字都是小数(64位浮点数),但是某些运算只有整数才能完成,那怎么办呢?那这时js会自动把64位浮点数转成32位整数,然后再运算...这个仅作了解,但是大家需要明白由于浮点数是不精确的,所以在js中,涉及小数的比较和运算都要特别小心

如:

    1.0+2.0 === 0.3 //false
    0.1+0.3 == 0.4 //true

2.number类型中NaN详解?

在number类型的概念中,其中有一个是NaN(not a number),这个是不好理解的,不是一个数,却又是number类型的,那什么情况下就不是一个数了呢?总结了以下两条规则:

  • 做数学运算(+,-,*,/,%)失败的时候
  • 将其他数据类型强制转化成number类型时,主要通过Number,parseInt(),parseFloat()来强制转换

第一个规则比较好理解,主要是第二条规则,我们来看下 Number()方法强制转换有如下几条规则:

  • boolean : Number(true)->1 Number(false) ->0
  • 数字仅仅是简单的传入和传出
  • null ->0;
  • undefined ->NaN
  • ""/'' ->0 //注:其他字符,只要有一个不是数值,则返回值是NaN,这是为什么呢?因为Number()方法是整个字符串一起解析的,而并非是单个字符单个字符的解析

强制将字符串其转换成number类型的,还有parseInt和parseFloat两个方法,并且这两个方法每次是逐个解析字符的


    parseInt() 将字符串的整数部分提取出来
    例如 :parseInt("12px") ->12
    parseFloat()不仅能将整数部分提取出来,还能将小数部分提取出来
    例如 : parseFloat("12.55px")->12.55

那如何知道这个数是否为有效数呢?怎么能知道这个值是不是NaN呢?

通过isNaN来检测下

  • isNaN()用来检测某个数值是否为有效数,如果是有效数返回false ,不是有效数返回true

  • isNaN检测的步骤如下:1.Number()强制转换成数类型 2.isNaN()再去检测


    例如:
    console.log(isNaN("abc"));//true  ->Number("abc")->isNaN(NaN)->true
    console.log(isNaN("15.55px"));//true
    console.log(isNaN("22.33"));//false
    console.log(isNaN(null));//Number(null) -->0 isNaN(0) ->false

二.基本数据类型之boolean类型(布尔类型)

  • boolean类型的数据只有两种,true和false,因此其他数据类型如果转换成boolean也只有两种结果,true/false
  • 以下这个五个值通过Boolean转换成布尔类型是fasle,其他的全部是true*0,undefined,null,"",NaN * **牢记这五个**

三.基本数据类型之字符串

  • 字符串就是零个或多个排列在一起的字符,放在单引号或双引号之中 "abc" 'abc'
  • 单引号字符串的内部可以用双引号,双引号的内部也可以用单引号

    'attr = "value"';
    "it's right!"
    这样混着用是可以的,但是如果这样写
    "a"b"  'c'd'
    这样写就会报错
  • 如果想在单引号内部用单引号,或者双引号内部用双引号,则需要在单引号/双引号前加反斜杠,用来转义

    'so happy to see \'liLy\''
    "so happy to see \"liLy\""
    常见的转义字符有:\\ \" \' \r(回车) \n()换行 \t(tab)
  • 在字符串中不能直接换行

    例如:
    'a
    b
    c'
    这样会报错 SyntaxError: Unexpected token ILLEGAL
    那如果想要换行这是一种方式:
    'a\nb\nc'
  • 另外一种:可以在每一行的尾部使用反斜杠。

    var longstring = "long \
    long \
    long \
    string "
    输出 "long    long    long    string "  输出的效果在书写时效果一致
    注意:反斜杠后面必须是换行符,不能有其他的字符(不如空格),否则会报错
    ps:连接运算符(+)可以连接多个单行字符串,将长字符串拆成多行书写,输出的时候也是单行。
    var longString = 'Long '
    + 'long '
    + 'long '
    + 'string';

    输出 "Long long long string"

四:基本数据类型之null和undefined

  • null:空
  • undefined:空(未定义)
  • 两个都代表的是没有,区别是什么?
  • null:暂时没有,我以后会有的
  • undefined:压根就没有
  • lily的女朋友--undefined lily的男朋友--null

下面总结了下什么情况下是null/undefined?

undefined


    1. 变量被声明了,但没有赋值时,就等于undefined。
    2. 对象没有声明或者赋值的属性,该属性的值为undefined。
    3. 函数没有提供参数或者返回值,默认为undefined

null


    1.根节点的父节点(document.parentNode) 是null
    2.作为对象原型链的终点