javascript数据类型

Javascript数据类型

引子

javascript是一门弱类型的动态编程语言,我身边有朋友对其弱类型的理解不是很明确,认为是没有数据类型的,javascript也是有数据类型的。要想真正的学好javascript这门语言,对其数据类型的理解必须要想当深刻才行,在闲暇时刻,写一下javascript中的数据类型的介绍供大家参考学习。

正文

  ECMAScript有5种简单(基本)数据类型:Undefined、Null、Boolean、Number和String,还有Object复杂数据类型。

1. typeof操作符(检测给定的数据类型)
  “undefined”--如果这个值未定义
  “boolean” --如果这个值是布尔值
  “string” -- 如果这个值是字符串
  “number” -- 如果这个值地数值
  “object”-- 如果这个值是对象或者null
  “function” -- 如果这个值是函数

2. Undefined类型
    Undefined只有一个值,即undefined。出现这个值是使用avr声明了一个变量但是没有进行初始化,其值即为undefined。
一般不存在显式的把一个变量设置为undefined,该值主要用于比较。不过,包含undefined值的变量与上位定义的变量时不一样的:

  var name;// 声明name变量
  alert(name); // "undefined"
  alert(age); // 产生错误

  但是对未进行初始化的变量执行typeof操作会返回undefined值,而未声明的变量执行typeof操作也会返回undefined值:
  var name;// 声明name变量
  alert(typeof name); // "undefined"
  alert(typeof age); // "undefined"
 
 【最佳实践】未进行初始化的变量会自动赋予undefined值,但显式初始化是最好的,这样,当typeof操作符返回undefined时,就知道被检测的变量还没有被声明而不是未初始化。

3. Null类型
  Null类型也是一个只有一个值(null)的数据类型,从逻辑上看,null值表示一个对象空指针,执行typeof操作时会返回Object:
  var book=null;
  alert(typeof book);// "object"
 
 【最佳实践】如果定义的变量使用来保存对象的,最好将其初始化为null值而不是其他值。这样只要检测null值就可以知道相应的变量是否保存有一个对象了:
  if(book != null){
    // 对book对象进行操作
  }
  alert(null == undefined);// true
 
  实际上,undefined值是派生自null值的,因此SCMA-262 规定对它们的相等性检测得到true;此处null和undefined之间的“==”操作符总是返回 true,这个操作符出于比较的目的会转换其操作数①。
  【最佳实践】无论在什么情况下都没必要把一个变量显式的设置为undefined,因为同样的规则不适用于null。所以,只要在保存对象的变量还没有真正保存对象就应该保存null值,这样不仅可以体现null作为对象空指针的惯例,也有助于进一步区分null和undefined。
 
4. Boolean类型

  Boolean是ECMAScript中使用最多的类型,该类型只有两个字面值:true和false。Boolean类型的字面值是区分大小写的。在ECMAScript中所有类型的值中都有与这两个Boolean类型值相等的值。可以调用Boolean()转换函数将一个值转换为其对应的Boolean值(这个值是true还是false取决于要转换的数据类型和其实际值):
  var name = "hello world";
  var nameAsBoolean = Boolean(name);
 
  转换规则:
  数据类型        转换为true的值        转换为false的值
  Boolean        true                      false
  String           任何非空字符串        ""(空字符串)
  Number        任何非0数字值         0 和 NaN
  Object          任何对象                 null
  Undefined     n/a(not applicable)  undefined 

5. Number类型

  Number类型是用IEEE754格式表示整数和浮点数。默认字面值是十进制的,也可以表示八进制、十六进制等数值。

  5.1 浮点数值

    var fnum1 = 1.1;
    var fnum2 = 1.0;
    var fnum3 = .1;// 有效,但是不推荐这种写法
    浮点数值需要的内存空间是整数值的2倍,所以,ECMAScript会不时的将浮点数转换为整数值。例如:
    var fnum4 = 1.;// 小数点后没有数字,解析为1
    var fnum5 = 12.0;// 浮点数本身是整数,解析为整数10
    对于极大的数值,javascript中也可以使用e表示法(科学计数法)表示浮点数:
    var fnum6 = 3.14159e7;// 表示31415900
    【最佳实践】浮点数的最高精度是17位小数,但是在进行计算时精度远远不如整数,永远不要测试某个特定的浮点数的值:
    if(a + b == 0.3){  // 开发中不要写这种测试浮点数的代码
       alert("判断两个浮点数的和是否为0.3");
    }
    上面的代码在a=0.05,b=0.25 或者a=0.15,b=0.15 不会有问题,但是若a=0.1,b=0.2 测试时无法通过的。
    这种误差问题是使用了IEEE754数值的浮点数计算的通病,并非只有ECMAScript,使用了相同数值格式的语言都会有。

  5.2 数值范围

  ECMAScript能够表示的最小值保存在Number.MIN_VALUE(一般为5e-324 )中,能表示的最大数保存在Number.MAX_VALUE(一般为1.7976931348623157e+308 )中如果某次计算超过这个数值范围,这个值会自动转换为Infinity(无穷),这个值是正数会转换为Infinity,反之-Infinity,是无法参与下一次运算的。想要确定一个数值是否在范围内,可以用isFinite()函数确定,在范围内返回true,否则返回false。当然,访问Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY也可以得到正和负Infinity的值,这说明:这两个属性分别保存着-Infinity和Infinity。

  5.3 NaN

  NaN(Not a Number),即非数值,是一个特殊的值,用于表示一个本来要返回数值的操作数未返回数值的情况的(避免抛错)。
    NaN的特点:
    ·任何涉及NaN的操作都会返回NaN,例如:NaN/9;
    ·NaN与任何值都不等,包括NaN本身,例如:alert(NaN == NaN);// false
    基于以上两个特点,ECMAScript定义了isNaN()函数,该函数接收一个可以是任何类型的参数,isNaN()在接收到参数后会尝试将这个值转换为数值,
    任何不被转换为数值的值都会导致这个函数返回true。
    alert(isNaN(NaN)); // true
    alert(isNaN(45)); // false(45是数值)
    alert(isNaN("45")); // false(45可以转换为数值45)
    alert(isNaN("JS")); // true(不能转换为数值)
    alert(isNaN(true)); // false(可以转换为数值1)
    isNaN()函数也适用于对象,基于对象调用isNaN()函数时,首先调用valueOf()方法,然后确定该方法返回值是否可转换为数值,若不能,这个返回值
    再调用toString()方法,再测试返回值。

  5.4 数值转换

  把非数值转换为数值主要使用到:Number(),parseInt()和parseFloat()三个函数。Number()函数使用于任何数据类型,另外两个专门把字符串转换成
    数值,三个函数对于同样的输入返回结果不同:
    (1)Number()函数:
    ·若是Boolean值,true为1,false为0
    ·若是数字值,就是简单的传入和返回
    ·若是null值,返回0
    ·若是undefined,返回NaN
    ·若是字符串
       字符串中只包含数字(包括正负号),转换为十进制数值,前导零会自动忽略
       字符串中包含有效的浮点数格式,将其转换为对应的浮点数(也会忽略前导零)
       字符串中包含十六进制格式(0xb),转换为相同大小的十进制数值
       字符串是空的(无任何字符),转换为0
       字符串中无上述格式,将其转换为NaN
    ·若是对象,调用valueOf()方法,然后找上面的规则转换返回值,若转换的结果是NaN,调用toString()方法,然后找前面的规则转换返回的字符串值
    由于Number()函数在转换字符串时比较复杂且不合理,因此常用parseInt()函数进行整数的转换。
    (2)parseInt()函数:
    parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。会忽略字符串前的空格,直到找到第一个非空格字符。
    如果第一个字符不是数字字符或负号,返回NaN(即该函数转换空字符串会返回NaN,而Number()函数返回0),下面是积分例子:
    var n1 = parseInt("789abc");  // 789
    var n2 = parseInt("");  // NaN
    var n3 = parseInt("0xf");  // 15(十六进制)
    var n4 = parseInt("3.14");  // 3
    var n5 = parseInt("070");  // ECMAScript3中56(八进制)
    var n5 = parseInt("070");  // ECMAScript5中0(八进制)
    var n6 = parseInt("0xb");  // 11(十六进制)
    在使用parseInt()解析八进制字面量的字符串时,ECMAScript3和5存在分歧,所以这个函数提供第二个参数:转换时使用的基数。如:
    var nn1 = parseInt("oxAF",16);// 175
    var nn2 = parseInt("AF",16);// 175,如果指定了16作为第二个参数,字符窜前面的“0x”可以省略
    var nn3 = parseInt("AF");// NaN
    指定了基数会影响转换结果:
    var num1 = parseInt("10",2);  // 2  (按二进制解析)
    var num2 = parseInt("10",8);  // 8  (按八进制解析)
    var num3 = parseInt("10",10); // 10 (按十进制解析)
    var num4 = parseInt("10",16); // 16 (按十六进制解析)
    (3)parseFloat()函数:
    与parseInt()函数类似,该函数也是从第一个字符串开始解析直到末尾或遇见一个无效的字符为止。此外除了第一个小数点有效之外,与parseInt()函数
    的区别在于它始终会忽略前导零,十六进制格式的字符串始终会转换为0,parseFloat()只解析十进制值,故无第二个参数;若字符串包含一个科解析为整
    数的数(无小数点或小数点后都为0),parseFloat会返回整数。下面写几个典型的例子:
    var num1 = parseFloat("123abc"); // 123(解析为整数)
    var num2 = parseFloat("0x9"); // 0
    var num3 = parseFloat("12.6"); // 12.6
    var num4 = parseFloat("34.52.23"); // 34.52
    var num5 = parseFloat("0306.8"); // 3.6.8
    var num6 = parseFloat("3.14e7"); // 31400000

6 String类型

  String类型用于表示0个或多个16为Unicode字符组成的字符串序列。可以两边同时用 "或者 '表示。

  6.1 字符字变量

  String数据类型中包含一些特殊的字符串变量,也叫转义序列,用于表示非打印字符或其他用途:
    字面量        含义
    \n            换行
    \t            制表
    \b            空格
    \r            回车
    \f            进纸
    \\            斜杠
    \'            单引号(')
    \"            双引号(")
    \xnn        以十六进制代码nn表示的一个字符(n为0~f),如\x41表示A
    \unnn        以十六进制代码nnn表示的一个Unicode字符(n为0~f),如\u03a3表示求和符号
    任何字符串的长度都可以通过访问其length属性取得。

  6.2 字符串特点

    ECMAscript中的字符是不可变的,一旦创建它的值就不能改变,要改变原来的某个变量保存的字符串,要销毁原来的字符串,然后再用另外一个包含新值
    的字符串填充该变量:
    var str = "java";
    str = str + "script";
    上面例子中变量str开始包含字符串“hava”,第二行代码把str的值重新定义为“java”与“script”组合(“javascript”),其实际操作过程如下:
    首先创建一个能容纳10个字符的心字符串,然后在这个字符串中填充“java”和“script”,最后销毁原来的字符串“java”和“script”(因为它俩没用了),
    此过程在后台发生,这是某些旧版本的浏览器拼接字符串很慢的原因。

  6.3 转换为字符串

    除了null和undefined值没有toString()方法外,几乎每个值都有toString()方法,该方法返回字符串的一个副本。
    多数情况,该方法不会传递参数,但是在调用数值的toString()方法时可以传递参数:输出数值的基数。例如:
    var num = 10;
    alert(num.toString());// "10",不带基数参数默认为十进制
    alert(num.toString(10));// "10"
    alert(num.toString(2));// "1010"
    alert(num.toString(8));// "12"
    alert(num.toString(16));// "a"
    另外,在不知道要转换的值是不是null或undefined时,可以使用转型函数String(),此函数能把任何类型的值转换为字符串。
    ·若值有toString()方法,调用该方法(无参数)并返回相应的结果
    ·若值是null,返回“null”
    ·若值是undefined。返回“undefined”
    tip:要把某个值转换为字符串,可用加括号操作符把它与一个字符串("")加在一起。

7. Object类型

  ECMAScript中的对象其实就是一组数据和功能的集合。通过new操作符后跟要创建的对象类型名称来创建。
  var obj = new Object();
  var o = new Object;  // 在ECMAScript中,如果不给构造函数传递参数,括号可省略,但是不推荐
  在ECMAscript中Object类型是所有它的实例的基础,就像JAVA中的Object类。Object类型的每个实例都具有下列属性和方法:
  ·Constructor:保存着用于创建当前对象的函数。
  ·hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。作为参数的
     属性名必须以字符串形式指定。
  ·isPrototypeOf(object):用于检查传入的对象是否是另一个对象的原型。
  ·propertyIsEnumerable(propertyName):用于检查给定的属性是否能使用 for-in 语句来枚举。参数必须也是字符串形式。
  ·toLocaleString():返回对象的字符串表示,该字符串与执行环境对应。
  ·toString():返回对象的字符串表示。
  ·valueOf():返回对象的字符串、数值或布尔值表示,通常与toString()方法的返回值相同。

 相信看了这篇博文,大家对javascript的数据类型又会有了新的认识和理解。
 

posted @ 2014-03-22 03:02  Anycode  阅读(221)  评论(0)    收藏  举报