js 判断数据类型,以及undefined和null的理解

变量声明和赋值的几种状态

  • 未声明
  • 已声明,未赋值
  • 未声明,却赋值 (不正常,会成为全局变量。严格模式下抛出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]
posted @ 2020-12-30 22:37  南歌子  阅读(890)  评论(0编辑  收藏  举报