1、数据类型有哪些?
在学习怎么判断数据类型之前,我们先来认识一下数据类型都有哪些?
javaScript的八种数据类型 :分别是 Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。 这里将复杂数据类型 :Object 、Array、Function归为一类为Object。
其中Symbol和BigInt是ES6中新增的数据类型:
Symbol代表创建后独一无二且不可变的数据类型,它主要是为了解决可出现的全局变量冲突的问题。
Biglnt是一种数字类型的数据,它可以表示任意精度格式的整数,使用Biglnt可以安全地存储和操作大整数,即使这个数已经超出了Number能够表示的安全整数范围。
这些数据可以分为基本数据类型和引用数据类型,
基本数据类型:Undefined、Null、Boolean、Number、String
引用数据类型:对象,数组,函数
这两种类型的区别在于存储位置的不同:
原始数据类型直接存储在栈中的简单数据段,占据空间小,大小固定
引用数据类型存储在堆中的对象,占据空间大,大小不固定。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。
2、判断数据类型的方法?
总的来说,一共有四种方法,分别是typeof、 instanceof 、constructor、Object.prototype.toString.call()。下面就来详细展开说说:
1)、typeof
console.log(typeof 2); //number
console.log(typeof true); //boolean
console.log(typeof 'str'); //string
console.log(typeof []); //object
console.log(typeof function(){}); //function
console.log(typeof {}); //object
console.log(typeof undefined); //undefined
console.log(typeof null); //object
2)、instanceof
instanceof可以正确的判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型。
console.log(2 instanceof Number); //false
console.log(true instanceof Boolean); //false
console.log('str' instanceof String); //false
console.log([] instanceof Array); //true
console.log(function(){} instanceof Function); //true
console.log({} instanceof Object); //true
instanceof只能正确判断引用数据类型,而不能判断基本数据类型。instanceof运算符可以用来测试一个对象在其原型链上是否存在一个构造函数的prototype属性。
3)、constructor
console.log((2).constructor === Number); //true
console.log((true).constructor === Boolean); //true
console.log(('str').constructor === String); //true
console.log(([]).constructor === Array); //true
console.log((function(){}).constructor === Function); //true
console.log(({}).constructor === Object); //true
constructor有两个作用:
1、判断数据的类型
2、对象实例通过constructor对象访问他的构造函数。需要注意,如果创建一个对象来改变它的原型,constructor就不能用来判断数据类型了。
举个例子
function Fn(){};
Fn.prototype = new Array();
const f = new Fn();
console.log(f.constructor === Fn); //false
console.log(f.constructor === Array); //true
4)、Object.prototype.toString.call()
const val = Object.prototype.toString;
console.log(val.call(2)); //[object Number]
console.log(val.call(true)); //[object Boolean]
console.log(val.call('str')); //[object String]
console.log(val.call([])); //[object Array]
console.log(val.call(function(){})); //[object Function]
console.log(val.call({})); //[object Object]
console.log(val.call(undefined)); //[object Undefined]
console.log(val.call(null)); //[object Null]