• JavaScript中的基本数据类型介绍
    时间:2012-03-18   作者:佚名   出处:互联网

    大家经常可以见到javascript中的一些数据类型,比如“undefined”、“boolean”、“string”等等,但是ECMAScipt中的变量又是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。所以javascript中用var关键字来定义变量,所以无法确定变量一定会存储什么值,也就不知道变量到底会是什么类型,因为可以随时改变变量的类型。今天这篇文章就和大家一起来学习javascript中的类型,这个问题虽然简单,但是还是有很多童鞋在很多时候没办法真正掌握它,其中不正确的地方请大家指出来,共同学习,共同进步。

    javascript中的变量

           javascript中的变量只是一个占位符,前言已经说过了,因为松散类型的缘故。  定义变量:var name;
    上述代码定义了一个名为name的变量,该变量可以用来保存任何值(像这样未经过初始化的变量,会保存一个特殊的值--undefined),也可以初始化变量的值,
    var name =”jwy”; //javascript中的单引号和双引号没有区别,不过要注意正确嵌套
    name=10;
    一开始name初始化成了字符串值“jwy”,后又改成了数字值—100,这种做法是不建议的,但是在ECMAScript是有效果的,而且在很多时候会这样做。

    也可以一条语句定义多个变量,而且很多javascript框架是这么做的

    var name=”jwy”,author,age=29;
    每条语句加分号是很好的编程习惯。不过一条多个变量时,建议换行和缩进,这样可以提高可读性。

    简单数据类型

          ECMAScript中有5种简单数据类型:Undefined,Null,Boolea,Number和String。还有一种复杂数据类型—Object

    typeof操作符

          由于Javascript中的变量是松散类型的,所以它提供了一种检测当前变量的数据类型的方法,也就是typeof关键字,在上面提到的ECMAScript中的5种简单数据类型中,(记住,这5种只是数据类型,代表一种数据类型,就想C#中的int,string类型一样),通过typeof关键字,对这5种数据类型会返回下面的值(以字符串形式显示

    “undefined”    ----------   如果值未定义                       Undefined
    “boolean”      ----------     如果这个值是布尔值              Boolean
    “string”        ----------     如果这个值是字符串              String
    “number”      ----------     如果这个值是数值类型           Number
    “object”        ----------     如果这个值是对象或null        Object
    “function”       ----------     如果这个值是函数                 Function

    不过严格来说,函数在ECMAScript中是对象,每个函数都是Function这个类的一个实例,既然函数是一个对象,那么它也就是一个引用类型了,所以一个函数只是一个变量名而已,因此,在很多场合常常可以看到,将函数名作为参数,传进函数中,然后进行调用,这就类似于C#中的委托,在后面会详细的讲解函数这个东西,毕竟Javascript中很多东西都依赖于函数来实现。

    Undefined 类型

          上面说了,5种类型是数据类型,所以数据类型是有值的,Undefined的值就是undefined,注意,是u是小写的。如果声明变量却没有初始化,则当前变量的值就是undefined。不过,一般建议尽量给变量初始化,但是在早期的Javascript版本中是没有规定undefined这个值的,所以在有些框架中为了兼容旧版浏览器,会给window对象添加undefined值,如下:

    window['undefined'] = window['undefined']; 
    //或者
    window.undefined = window.undefined; 
    简单的说就是给window对象的undefined属性赋上undefined,在较老的浏览器对象并没有undefined这个属性,所以如果使用到undefined的操作将会导致失常,故采用这样的方式,不过一开始看会有点难理解,在旧版本的浏览器中会因为没有window.undefined这个对象而返回一个undefined值,所以这样做可以兼容旧浏览器。

    不过包含undefined值的变量与未定义的变量是不一样的,如:

    var name;
    alert(name);//undefined
    alert(age);// 错误:age is not defined
    还没声明过的变量只能执行一项操作,其他全都不能做,就是使用typeof操作符检测其数据类型。

    如果不管声明过未初始化以及未声明过的变量执行typeof都是返回undefined的值。两种变来那个都不能执行真正的操作

    Null类型

          Null类型的值是null,它表示一个空对象指针,没有指向任何对象,如果一个变量的值是null,那当前变量很有可能就是垃圾收集的对象,使用typeof监测null值时会返回”object”,

    var person = null;
    alert(typeof person);//”object”
    建议:如果变量是要用来保存对象的额,则初始化为null,这样到时就可以检测该变量是否已经保存了一个对象的引用的,

    注意:undefined值是派生自null的,所以对他们执行相等测试会返回true,如:

    alert(null == undefind);//true
    尽管如此,但是他们用途完全不同,无论在什么情况下都没必要将一个变量的值显示设为undefined,但是这个规则对null却不适用。

    Boolean类型

          这个类型只有两个值:true 和false。虽然只有两个值,但是javascript中所有类型的值都有与这两个值等价的值。要将一个值转换为对应的Boolean值,可以调用转型函数Boolean()  (其实Boolean ,Object,String,Number,Function等这些都是一个函数,构造函数,同样也可以理解为一个类,用类型调用toString()方法会返回这样的东西:

    "function Function() { [native code] }"  ,Function会相应的改成各自的那个调用函数   )

    其实在 if 语句判断中,会对里面的条件自动执行Boolean变化的。

    Number类型

          数值类型有很多值,最基本的当然就是十进制啦,如:     

    var num=510;
    除了十进制,整数还可以通过八进制或十六进制,其中八进制字面值第一位必须是0,然后是八进制数字序列,如果字面值中的数值超出了范围,那么前导零将被忽略。后面的额数值将被当做十进制数解析。

    var num1=070;//八进制的56
    var num2 =079;//无效的八进制—解析为79
    var num3 =08;// 无效的八进制—解析为8
    而十六进制前面则必须是0x,后跟十六进制数字(0~F),不分大小写。如:

    var num1 = 0xA;
    var num2 = 0x1f;
    虽然可以表示为八进制和十六进制,但是计算时会被转换成十进制值。

    除了整数,还有浮点数值,当然了,没有像其他强类型语言中的float之类的关键字了。

    var num1 = 1.1;
    var num2 =0.1;
    var num3 = .1;//有效,但不推荐
    在保存整数时内存分配大小只有浮点数的1/2,所以当浮点数可以转换为整数时,javascript会自动转换为整数。

    当然了,除了这些数值比较小的,还有一些极大或极小的数值,可以用科学计数法表示,

    var num=123.456e10;
    浮点数值的最高精度是17位小数,但是计算时其精确度远远不如整数。例如 ,0.1+0.2不等于0.3,而是0.3000000000000004,所以在做判断时,千万不要用浮点数相加判断等于预想中的某个值。

    在javascript中数值最小的是Number.MIN_VALUE,这里可以想象成Number是一个类,而MIN_VALUE 是一个静态变量,储存最小值,同样,最大的是Number.MAX_VALUE。

    如果计算中超出了这个最大值和最小值范围,则将被自动转换成Infinity值,如果是负数,就是-Infinity,整数就是Infinity,Infinity的意思是无穷,也就是正负无穷,跟数学中的概念是一样的。但是Infinity是无法参与计算的。可以用原生函数确定是不是有穷:isFinite();只有位于数值范围内才会返回true。

    在Javascript中数值除了那些普通的整数、浮点数、最大值、最小值、无穷之外呢,还有一个特殊的值,就是NaN。这个数值用于表示一个本来要返回数值的操作数未返回数值的情况。比如,在C#中任何数值除以0都会报错,抛出异常,但是在Javascript中,任何数值除以0会返回Nan,因此不会影响代码的执行。

    NaN的特点:

    1、任何设计NaN的操作(如:NaN/0)都会返回NaN.
    2、NaN与任何值都不相等,包括NaN本身。如:

    alert(NaN == NaN);//false
    所以Javascript中有一个isNaN()函数,这个函数接收一个参数,任意类型,它会帮我们确定这个参数是否”不是数值”。它会先尝试先讲这个值转为数值。如果不能被转换为数值的值在调用这个函数之后会返回true,即is  NaN 非数值。

    至于数值转换,这个内容在Javascript中扩展开来又是一篇文章,有时间再整理整理。

    String类型

    字符串可以由单引号或双引号表示,在Javascript中这两种引号是等价的,如:

    var name = ‘jwy’;
    var author = “jwy”;
    不过就是要注意正确嵌套。

    字符串可以直接用字面量赋值。任何字符串的长度都可以通过访问气length属性获得。

    在Javascript中的字符串是不可变的,其实这跟C#中是一样的,(估计也是为了提高性能),字符串一旦创建,他们的值就不能改变,要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含信纸的字符串填充该变量。

    var name=”jwy”;
    name = “jwy”+” study javascript”;

    这里一开始name是保存字符串”jwy”的,第二行代码则将“jwy”+” study javascript”; 值重新赋给name,它先床架一个能容纳这个长度的新字符串,然后填充,销毁原来的字符串。

    几乎每个值都有自己的toString()方法,在后面的文章会解释这个方法哪里来的,它会返回相应值的字符串表现。

    var age=11;
    var ageToString =age.toString();//”11”
    数值、布尔值、对象和字符串值都有toString(),但是null和undefined值没有这个方法。

    一般来说,调用toString()方法不必传递参数,但是,在调用数值的toString方法时,可以传递一个参数,用来指定要输出的数值的基数(看是要输出十进制、二进制、八进制、十六进制表示)

    由于null和undefined没有toString方法,在不知道是否是这两者的情况下调用是会报错的,所以还有一条路可以选,就是使用转型函数String(),它呢就可以接收任何类型的值转为字符串了,处理规则如下:

    1、如果这个值有toString则直接调用,并返回结果
    2、如果是null,则返回”null”
    3、如果是unde,则返回”undefined”

    Object 类型

    Object类型是Javascript引用类型的鼻祖了,(就跟在C#和Java中是一样的道理),在创建Object类型的实例后可以为其添加属性和方法,

    var o = new Object;//有效,不推荐
    var o =new Object();
     在Javascript中,Object类型所具有的任何属性和方法也同样存在于更具体的对象中。每个实例都有如下的属性和方法,如下:

    1、constructor ,保存着用于创建当前对象的函数。上面构造函数就是Object();
    2、hasOwnProperty,用于检查给定的属性是否在当前对象实例中,是就true,不是在实例中,而是在原型中,则是false;
    3、isPrototypeOf,用于检查传入的对象是否是另一个对象的原型
    4、propertyIsEnumerable,用于检查给定的属性是否能够使用for…in语句来枚举,
    5、toString,返回对象的字符串表示
    6、valueOf,返回对象的字符串、数值或布尔值表示,通常与toString方法返回值相同

    以上就是Object所具有的属性和方法,所有对象都会因为继承关系而继承这些属性和方法。

    结束语

             Undefined、Null、Boolean、Number、String是javascript中的基本数据类型,而Object属于引用类型。用typeof检测其他类型会返回相应的字符串,但是检测null或对象时,会返回”object",如果掌握了这些,以后就不会看到这些会点摸不着头脑了。顺带提一句:
    Boolean、Number、String 这三个是Javascript中的基本包装类型,也就是这三个其实是一个构造函数,他们是Function的实例,是引用类型,至于这里的String与文章说的String是同名,是因为其实上文说的String是指字符串,这里的String指的是String这个构造函数,上面那么写,是为了更好的理解,因为Javascript是松散类型的。我们可以看下String实例化的例子:
    var name = String("jwy");
    alert(typeof name);//"object"
    var author = "Tom";
    alert(typeof name);//"string"

    至于author这个会有length,substring等等这些方法,其实是String这里的方面,string只是String的一个实例,类似于C#中的String,和string,只不过这里特殊一点。
    注意,typeof 变量  如果值是"string" 的话,也就是这个变量是字符串,在Javascript中,字符串是基本类型,而在C#或Java中,字符串是引用类型,但是Javascript中的String是引用类型,因为它是Javascript中定义好的基本包装类型,在C#中,String跟string其实是一样的。这个东西有点绕,如果有错的,大家请指出来,一起交流交流。

    如果觉得不错的话,请点击下推荐,(*^__^*) !!

    网友留言/评论

    我要留言/评论

    相关文章

    使用jQuery控制图片的hover效果:本文介绍如何网站中应用添加超酷的hover效果
    极其实用 10 款 jQuery 日历插件:以下日历插件都非常棒,非常实用,下面分享给开发者们。
    6个强大的JavaScript日期操作插件:我们必须承认,JavaScript内建的Date方法实在是太基础了,远不够我们来处理日期。总有人会开发自己的JavaScript日期操作库,为何在能够使用已经开发并测试好的日期插件时还要再自己造个轮子呢。我已经碰到过很多次需要操作日期格式的情形,这些插件将节约大把的时间。
    Memcached 真的过时了吗?(Redis和Memcached比较):这两年Redis火得可以,Redis也常常被当作Memcached的挑战者被提到桌面上来。关于Redis与Memcached的比较更是比比皆是。然而,Redis真的在功能、性能以及内存使用效率上都超越了Memcached吗?
    UI端编程的22个问题 - 经验之谈:以下是结合了我这些年来从事UI端编程的经验,我将用一系列文章来搭建用户界面(UI)的底层框架,这里我使用的技术实现是Silverlight,但是,你将会发现,我所介绍的都是UI端的设计思想,所以是超越于语言,是不局限于技术实现的,所以,它将适用于Windows Form, WPF, FLEX, HTML5,以及所有手机编程领域Phone7, IOS, Android。
    vim 中替换命令的技巧汇总:VIM无疑是非常强大的,学会其中的命令会使你事半功倍,下面本文列举一下替换命令的一些技巧。
    Social Game (SNS) 连载之流程设计:本文转自果伦的BLOG,作者整理出一个SNS game(social game)的设计流程,给团队留下一个可参考的方案。主要谈及的是策划流程设计,文章写的不错。
    手动安装MyEclipse 9.0 SVN插件解决方案:最近下载MyEclipse9.0 R2版本来做开发尝试。我们要求必须使用SVN来管理整个项目的源代码,这样就要求掌握如何在MyEclipse9.0 R2版本下手动安装SVN插件。下面通过网上的一些相关资料,我们将其汇总为两个方法.