变量声明和赋值的几种状态
- 未声明
- 已声明,未赋值
- 未声明,却赋值 (不正常,会成为全局变量。严格模式下抛出ReferenceError错误)
- 已声明,再赋值 (正常)
数据类型的分类
- 基本数据类型
- Boolean
- Number
- String
- Undefined
- Null - 复杂数据类型
- Object(本质上是由一组无序的名值对组成,引用类型)
typeof和数据类型
- "undefined"表示这个值未定义
- "boolean"表示这个值是布尔值
- "string"表示这个值是字符串
- "number"表示这个值是数值
- "object"表示这个值是对象或者null
- "function"表示这个值是函数
小结:typeof null
返回 "object",可以认为null是空对象;函数在ECMAScript中是对象,不是一种数据类型,但也是一种特殊存在,可以通过typeof进行区分
未声明和未赋值状态下的undefined值
var message; // 这个变量声明后默认取得 undefined 值
// 下面这个变量没有声明
// var age;
alert(message); // "undefined"
alert(age); // 产生错误
小结: 对于未声明的变量执行alert会报错(因为对于未声明的变量,只能执行typeof检测数据类型这一项操作。当然delete也行,但没有意义,而且严格模式也报错)
var message; // 这个变量声明后默认取得 undefined 值
// 下面这个变量没有声明
// var age;
alert(typeof message); // "undefined"
alert(typeof age); // "undefined"
小结: 对于未声明的变量 和 未赋值的变量 执行 typeof 操作都返回undefined值
判断数据类型的几种方式
typeof
- 可以判断的类型: number、boolean、symbol、string、object、undefined、function
- 优点: 可以区分function和object
- 缺点:
- type null 返回 object,可以理解为空对象,但其实我们想要的是Null
- 数组(Array),日期(Date),正则(RegExp)都会返回object,但其实我们想要更加详细的区分
instanceof
- 功能: 用于判断两个对象是否属于实例关系(可以借此判断数据类型)
- 缺点: 无法判断某一对象具体属于哪种类型
[] instanceof Array; // 返回true
[] instanceof Object;// 返回true
constructor
- 功能: constructor是原型prototype的一个属性,可以通过一个对象的constructor属性比对对象的数据类型
- 缺点: null 和 undefined 没有constructor
false.constructor == Boolean; // true
"123".constructor == String; // true
new Number(123).constructor == Number; // true
[].constructor == Array; // true
new Function().constructor == Function; // true
new Date().constructor == Date; // true
document.constructor == HTMLDocument; // true
window.constructor == Window; // true
new Error().constructor == Error; // true
Object.prototype.toString.call()
- 功能: toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]]
Object.prototype.toString.call('123') ; // [object String]
Object.prototype.toString.call(123) ; // [object Number]
Object.prototype.toString.call(false) ; // [object Boolean]