javascript的数据类型

ECMAScript中包含六种数据类型,其中前五种是简单数据类型(也称为基本数据类型)Undefined,Null,Boolean,Number和String,还有一种是复杂的数据类型:Object,Object的本质是有一组键值对组成。ECMAScript不支持任何创建自定义类型的机制,而所有值都将是上述的六中之一。由于ECMAScript中的数据类型具有动态性所以就没有在定义其他数据类型的必要了。

typeof操作符

由于ECMAScript是一种松散类型,因此需要有一种手段来检测给定的变量的数据类型,其中typeof就是来实现这种功能的。对于一个值,使用typeof可能返回下列字符串。

1、“undefined”:如果这个值未定义

2、"boolean":如果这个值是布尔值

3、"string":如果这个值是字符串

4、“number”:如果这个值是数值

5、“object”:如果这个值是对象或者null

6、“function”:如果这个值是函数

看如下的例子:

function show(x) {

            console.log(typeof(x));    // undefined
            console.log(typeof(10));   // number
            console.log(typeof('abc')); // string
            console.log(typeof(true));  // boolean

            console.log(typeof(function () { }));  //function

            console.log(typeof([1, 'a', true]));  //object
            console.log(typeof ({ a: 10, b: 20 }));  //object
            console.log(typeof (null));  //object
            console.log(typeof (new Number(10)));  //object
        }
        show();

从打印出的信息可以看出:前四种(undefined, number, string, boolean)属于简单的值类型,而不是对象,在作为参数进行传递的时候属于值传递。剩下的几种情况——函数、数组、对象、null、new Number(10)都是对象。他们都是引用类型。在作为函数参数的时候属于引用传递

其中判断一个变量是不是对象非常简单。值类型的类型判断用typeof,引用类型的类型判断用instanceof

var fn = function () { };
console.log(fn instanceof Object);  // true

下面仅对一些特殊的类型作说明:Undefined类型,Null类型

Undefined类型

Undefined类型只有一个值,即特殊的undefined。再使用var声明变量但是未对其加以初始化时,这个变量的值就是undefined,例如:

var message;
console.log(message);    //  undefined

这个例子中只是声明了message,而没有对其进行初始化。其实上面这个例子等价于:

var message = undefined;
        console.log(message);

我们通常没必要这个做,因为为初始化的值默认就是undefined。

在这里我们还是需要注意,包含undefined的值(只声明了变量,但是没有初始化)与尚未定义的变量还是不一样的。看看下面的例子:

var message;     //    这里声明了一个变量但是没有对他初始化
alert(message);     //   "undefined"

//  var age;
alert(age);   //   这里会报错

运行上面的程序,会发现第一个弹出框会提示“undefined”,而第二个弹出框没有显示,查看控制台的console,你会发现程序报错了。报错信息如下:

Uncaught ReferenceError: age is not defined

对于那些尚未声明过的变量,只能执行一项操作,即使用typeof操作符检测其数据类型。但是令人困惑的是对于为初始化与未声明的变量执行typeof操作的时候都会返回“undefined”

var message;     //    这里声明了一个变量但是没有对他初始化
alert(typeof message);     //   "undefined"

//  var age;
alert(typof age);   //  "undefined"

看《javascript高级程序设计》的时候是这样解释的:对于这两种情况都返回“undefined”,这个结果有其逻辑上的合理性。因为这两个变量从技术角度看存在本质的区别,但是实际上对上述两种无论那种变量也不能执行真正的操作。

Null类型

Null类型类型也是一个只有一个值的类型,这个特殊值是null,从逻辑的角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值,会返回"Object"的原因,如下所示:

 var message = null;     //    这里声明了一个变量但是没有对他初始化
 alert(message);     //   "object"

如果定义的变量将来用来保存对象,那么最好将该变量初始化为null而不是其他的值。这样只需要通过检测变量是不是null值,就可以知道相应的变量是否已经保存了一个对象的引用。如下面的例子:

if (car != null) {
}

书上说,undefined的值派生自null,通过如下代码做相等性验证:

alert(undefined == null)    //  true,关于“==”相等验证操作符处于比较会转换两边的操作数
console.log(undefined === null);   //  false,这两个不是同一个东西,虽然之间有关系

 在声明变量的时候最好给变量付一个null值,而不是变量声明了,却没有赋值,此时变量是undefined。

posted @ 2015-01-09 22:06  都市烟火  阅读(402)  评论(0编辑  收藏  举报