一、js基本数据类型及区别
八种类型
js的基本数据类型有八种,分别是String、Number、Boolean、Null、Undefined、对象类型(包含object、数组、函数)、Symbol、BigInt 其中Symbol和BigInt是ES6新增数据类型:
- Symbol创建的数据,独一无二且不可变,主要解决可能出现的全局变量冲突问题,例:
let a = Symbol()
let b = Symbol()
// a === b 或者 a == b都是false
- BigInt表示任意大的整数,Number类型能表示最大的整数是2^53,详见:www.cnblogs.com/ajaemp/p/13…
类型的两种分类及存储
这些数据类型可以分为原始数据类型和引用数据类型(复杂数据类型),它们在内存中的存储形式不同:
- 栈:存放原始数据类型(Undefined、Null、Boolean、Number、String、Symbol、BigInt),存储的数据简单,大小固定,通常频繁被使用。
- 堆:存放引用数据类型(对象、数组和函数),存储的数据大小不固定,占据空间大,存储于栈中影响效率,故存储于堆中,栈中存储的是对堆中对象的引用,通过该引用找到堆中的实体。引用数据类型的便令赋值给新的变量,实质是将引用复制到新的变量中。
null和undefined的区别
- null代表空对象,主要用来赋值给一些可能返回对象的变量,进行初始化,typeof 为object
- undefined表示未定义,主要用来表示未定义的变量,typeof为undefined
null == undefined // true
null === undefined //false
数据类型检查方式
typeof
console.log(typeof 2); // number
console.log(typeof true); // boolean
console.log(typeof '222'); // string
console.log(typeof null); // object
console.log(typeof undefined); // undefined
console.log(typeof {}); // object
console.log(typeof function(){}); // function
console.log(typeof []); // object
总结,原始数据类型可以准确判断,引用数据类型函数会被判定为function,数组和对象以及null都会判定为object
instanceof
通过判断该变量是不是该构造函数的实例对象,来检查类型
console.log(2 instanceof Number); // false
console.log('222' instanceof String); // false
console.log(true instanceof Boolean); // false
console.log({} instanceof Object); // true
console.log([] instanceof Object); // true
console.log(function(){} instanceof Object); // true
console.log([] instanceof Array); // true
console.log(function(){} instanceof Function); // true
总结:instanceof只能用于判断引用数据类型,但是数组和函数也是Object的实例
constructor
利用实例对象通过constructor找到原型对象从而访问它的构造函数来实现
console.log(2..constructor === Number); // true
console.log('222'.constructor === String);// true
console.log(true.constructor === Boolean);// true
console.log([].constructor === Array); // true
console.log([].constructor === Object); // false
console.log(function(){}.constructor === Function); // true
console.log(function(){}.constructor === Object); // false
console.log({}.constructor === Object); // true
但是原型对象是可以修改的,故而判断的结果不一定准确
function Fn(){};
Fn.prototype = new Array();
var f = new Fn();
console.log(f.constructor===Fn); // false
console.log(f.constructor===Array); // true