JavaScript中包含五种基本数据类型(原始数据类型),分别是:undefined, null, number, boolean, string; 和一种引用类型 Object,引用类型中包含特殊的一类:Function类型。number, boolean, string三种基本类型对于有包装类型 Number,Boolean,String,这三种包装类型是对象类型。
针对这些类型,下面分别解释:
1. typeof 操作符
可以通过此操作符获取变量的类型,操作返回值为字符串,如下7种:"number", "string", "boolean", "null", "undefined", "function", "object".
2. 基本类型
undefined 类型:只有一个值 undefined,在使用 var 声明变量但未对其进行初始化时,此变量的值即为 undefined
var sum; // 声明后未初始化默认值为undefined alert(sum) // "undefined" alert(age) // 未声明变量,报错 alert(sum == undefined) // true alert(typeof sum) // "undefined" alert(typeof age) // "undefined" 此处对未声明的变量进行typeof也会返回 "undefined",有其逻辑上的合理性,表示无法操作此变量
null 类型:也是只有一个值的数据类型,值为 null,从逻辑角度来看,null表示一个空对象指针。
var title = null; alert(typeof title); // "object" // 由于对赋值null的变量执行 typeof 操作会返回 object, // 所以如果变量未来准备存放对象,最好将其赋值为 null, // 这样只需要检测其是否为 null,即可知道其是否已保存了一个对象的引用 if (title == null) { // do something }
number, boolean, string类型及其包装类型:
var num = 5; var NUM = new Number(5); // 此处创建一个Number对象 alert(typeof num); // "number" alert(typeof NUM); // "object" var numf = Number(5); alert(typeof Number); // "function" 此处Number是一个包装函数 alert(typeof numf); // "number" // boolean 和 string类型与 number相似 var bool = false; var BOOL = new Boolean(false); alert(typeof bool); alert(typeof BOOL); var str = ‘hello‘; var STR = new String(‘hello‘); alert(typeof str); alert(typeof Str);
3. NaN : 是一个特殊的数值,用于表示应该返回数值而未返回数值的情况,例如: 除0, Number("a")等
// 1.任何涉及 NaN 的操作都会返回 NaN alert(1+NaN) // NaN alert(NaN/10) // NaN // 2.NaN与任何值都不等 alert(NaN == NaN) // false alert(2 == NaN) // false alert("abc" == NaN) // false // 3. isNaN()函数:不能被转换为数值的值都会返回true alert(isNaN(5)) // false alert(isNaN(true)) // false alert(isNaN("a")) // true
4. 引用类型:一组数据和功能的集合。对象是引用类型的一个实例。
[[Class]]是一个内部属性,可以用来给对象分类,它的值有:
"Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", RegExp", “String"
Javascript只能通过toString()方法(Object.prototype.toString())获取这个内部属性
Object.prototype.toString.call(undefined) //"[object Undefined]" Object.prototype.toString.call(null) //"[object Null]" Object.prototype.toString.call(function(){}) //"[object Function]" Object.prototype.toString.call(Math) //"[object Math]" Object.prototype.toString.call(Array) //"[object Function]" Object.prototype.toString.call([]) //"[object Array]" Object.prototype.toString.call({}) //"[object Object]" //基础类型转化为包装类型按照对应的规则处理 Object.prototype.toString.call("abc") //"[object String]" Object.prototype.toString.call(200) //"[object Number]" Object.prototype.toString.call(true) // "[object Boolean]"
可以通过如下的函数获取对象类型:
function getClass(x) { var str = Object.prototype.toString.call(x); return /^\[object (.*)\]$/.exec(str)[1]; } getClass(null); // "Null" getClass({}) //"Object" getClass([]) //"Array" getClass(JSON) //"JSON" getClass(function(){})//"Function" function Foo() {} getClass(new Foo()) //"Object"