js八股文

80 阅读2分钟

一、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

类型的两种分类及存储

这些数据类型可以分为原始数据类型引用数据类型(复杂数据类型),它们在内存中的存储形式不同:

  • 栈:存放原始数据类型(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

数组的判断方式有哪些