最新的 ECMAScript 标准定义了 9 种数据类型:

  • 6 种原始类型,使用typeof运算符检查:
    • undefinedtypeof instance === "undefined"
    • Booleantypeof instance === "boolean"
    • Numbertypeof instance === "number"
    • Stringtypeof instance === "string
    • BigInttypeof instance === "bigint"
    • Symboltypeof instance === "symbol"
  • nulltypeof instance === "object"
  • Objecttypeof instance === "object"。任何 constructed 对象实例的特殊非数据结构类型,也用做数据结构:new Object,new Array,new Map,new Set,new WeakMap,new WeakSet,new Date,和几乎所有通过 new keyword 创建的东西。
  • Function:非数据结构,尽管 typeof 操作的结果是:typeof instance === "function"。这个结果是为 Function 的一个特殊缩写,尽管每个 Function 构造器都由 Object 构造器派生。

    1、基本数据类型

    Boolean、Number、Symbol、String、Null、Undefined、(bigInt)
    ( bigInt。是指安全存储、操作大整数。(但是很多人不把这个做为一个类型))
    (Symbol 本质上是一种唯一标识符,可用作对象的唯一属性名,这样其他人就不会改写或覆盖你设置的属性值。)

2、引用类型

Object

Object 包含( function、Array、Date)

3、类型判断

(1)typeof

typeof运算符的返回类型为字符串,值包括如下几种:
1. ‘undefined’ —未定义的变量或值 console.log(typeof a); console.log(typeof undefined);
2. ‘boolean’ —布尔类型的变量或值 console.log(typeof(true));
3. ‘string’ —字符串类型的变量或值 console.log(typeof ‘123’);
4. ‘number’ —数字类型的变量或值 console.log(typeof 123)
5. ‘object’ —对象类型的变量或值,或者null(这个是js历史遗留问题,将null作为object类型处理)
6. ‘function’ —函数类型的变量或值 var fn = function(){}; console.log(typeof(fn))

特殊的:
typeof 23423n; // bigint
let a = Symbol();
typeof a; // symbol

(2)instanceof

instanceof操作符判断左操作数对象的原型链上是否有右边这个构造函数的prototype属性,也就是说指定对象是否是某个构造函数的实例,最后返回布尔值。

  1. instanceof (A,B) = {
  2. var L = A.__proto__;
  3. var R = B.prototype;
  4. if(L === R) {
  5. //A的内部属性__proto__指向B的原型对象
  6. return true;
  7. }
  8. return false;
  9. }
  1. [] instanceof Array; //true
  2. [] instanceof Object; //true
  3. new Date() instanceof Date;//true
  4. new Date() instanceof Object;//true
  5. function Person(){};
  6. new Person() instanceof Person;//true
  7. new Person() instanceof Object;//true

注意:instanceof运算符只能用于对象,不适用原始类型的值。

//

  1. 'hello' instanceof String // false
  2. null instanceof Object // false
  3. undefined instanceof Object // false

null 不是对象

(3)constructor

  1. 得知某个实例对象 到底是由那个构造函数产生<br />但是 constructor 属性易变,不可信赖,这个主要体现在自定义对象上,当开发者重写prototype后,原有的constructor会丢失<br />不推荐使用

(4)Object.prototype.toString

  1. Object.prototype.toString.call('') ; // [object String]
  2. Object.prototype.toString.call(1) ; // [object Number]
  3. Object.prototype.toString.call(true) ; // [object Boolean]
  4. Object.prototype.toString.call(undefined) ; // [object Undefined]
  5. Object.prototype.toString.call(null) ; // [object Null]
  6. Object.prototype.toString.call(new Function()) ; // [object Function]
  7. Object.prototype.toString.call(new Date()) ; // [object Date]
  8. Object.prototype.toString.call([]) ; // [object Array]
  9. Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
  10. Object.prototype.toString.call(new Error()) ; // [object Error]
  11. Object.prototype.toString.call(document) ; // [object HTMLDocument]
  12. Object.prototype.toString.call(window) ; //[object Window]

较为复杂不推荐使用