在ECMAScript规范中,共定义了7种数据类型,分为基本数据类型和引用类型两大类,如下所示:
基本类型:Number、String、Boolean、Null、Undefined、Symbol(ES6)、BigInt(ES10)
引用类型:Obeject、Array、Date等等
- 基本类型也称为简单类型,存储在栈中,可以按值访问
- 引用类型也称为复杂类型,变量名和内存地址(指针)保存在栈中,属性和值存储在堆内存中
什么是原始值
原始值是固定而简单的值,是存放在栈中的简单数据段,也就是说,它们的值直接存储在变量访问的位置
它有以下类型:Undefined,Null,Boolean,Number,String,Symbol,BigInt
具体内容可以去看看MDN,这里不做详细介绍
那么都有什么方法可以判断他们的类型呢?下面让我们分别来聊聊吧!
先来聊聊几种常用的判断方法:
typeof
只能区分基本类型(number、string、boolean、undefined、function、object
)
如果数据类型为 null、array、object
,使用typeof
判断都会统一返回 object
字符串
typeof undefined; // undefined
typeof null; // object
typeof true; // boolean
typeof 1; // number
typeof '123'; // string
typeof Symbol('foo'); // symbol
typeof 1n; // bigint
typeof BigInt(1); // bigint
typeof function(){}; // function
typeof {a:1}; // object
typeof []; // object
typeof window; // object
typeof new Date(); // object
typeof /\s/; // object
typeof Math.sign; // function
typeof Math.PI; // number
在这其中要注意的是:
- 其中
null
返回了object
是因为JavaScript
语言设计遗留的问题 - 对于引用类型,除
function
以外,一律返回object
类型 - 对于
function
返回function
instanceof
instanceof
运算符用于检测构造函数的 prototype
属性是否出现在某个实例对象的原型链上
原理:从当前引用的
proto
属性一层一层顺着原型链往上找,找到对应的prototype
就返回true
,否则返回false
- 判断一个数据是否为某个对象的实例
function Father() {}
let son = new Father()
console.log(son instanceof Father) //true
- 判断一个数据是否为某个引用类型
console.log(function() {} instanceof Function) //true
console.log([1,2,3] instanceof Array) //true
console.log({a: 'b'} instanceof Object) //true
要注意的是原始值使用instanceof
都会返回false
[]、Array、Object 三者之间的关系
从 instanceof
能够判断出[ ].__proto__
指向 Array.prototype
而 Array.prototype.__proto__
又指向了Object.prototype
最终 Object.prototype.__proto__
指向了null
,标志着原型链的结束
值得一提的是
const h3 = null;
console.log(h3 instanceof Object); // false
null
是空对象指针,因此typeof null === 'object'
,然而null
又不是object
的引用类型的实例,因此使用instanceof
会显示false
另一个场景:
// a.html