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。