Javascript | 青训营

56 阅读3分钟

JavaScript 有哪些数据类型

总共有八种数据类型 基本数据类型:Undefined Null Boolean Number String 引用数据类型:对象组件和函数

两种类型的区别在于储存位置不同

  • 基本数据类型直接存储的栈里,占据空间小,大小固定,属于频繁使用的数据,
  • 引用数据类型直接存储在堆中,占据空间大,大小不固定,如果存储在栈中讲影响运行的性能,引用数据类型在栈中存储了指针,该指针指向队中核实盒起始地址。当解释器寻找引用值时,会首先检测其在栈中的地址,取得地址后从堆中获得实体

检测数据类型的方式有哪些

  1. typeof
console.log(typeof 2); // number
console.log(typeof "2"); //string
console.log(typeof []); //object
console.log(typeof true); //boolean
console.log(typeof function () {}); //function
console.log(typeof undefined); //undefined
console.log(typeof null); //object
console.log(typeof {}); //object

其中 [] ,{}, function 都判断为 object类型

  1. 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({} instanceof Object); //true
console.log(function () {} instanceof Function); //true

instanceof 只能正确判断是不是对引用数据类型,其内部机制就是在其原型链中能够找到类型的原型

  1. constructor
//constructor
console.log((2).constructor == Number);
console.log(true.constructor == Boolean);
console.log("str".constructor == String);
console.info([].constructor == Array);
console.log({}.constructor == Object);
console.log(function () {}.constructor == Function);

constructor 有两个作用,一个判断数据的类型,二是实例对象那个通过constrcutor对象访问它的构造函数,需要注意,如果创建一个对象来改变它的原型,constructor就不能用来判断数据类型了

  1. Object.prototype.toString.call();

Object.prototype.toString.call() 使用Object对象的原型方法toStirng来判断数据类型:

 const a = Object.prototype.toString;
  console.log(a.call(2));
  console.log(a.call("stirng"));
  console.log(a.call(true));
  console.log(a.call(undefined));
  console.log(a.call([]));
  console.log(a.call({}));
  console.log(a.call(function () {}));
  console.log(a.call(null));
  /* 
[object Number]
[object String]
[object Boolean]
[object Undefined]
[object Array]
[object Object]
[object Function]
[object Null] 
  */

同样是检测对象,Obj调用toString方法, Obj.toString 和 Obj.prototype.toString.call();结果不一样

这是因为像 Array,Function 等类作为Object 的实例都重写了Object 的方法直接调用返回的结果就是重写之后的内容,

null和undefined的区别

首先Undefined 和Null 都是基本数据类型,这两个基本数据类型分别只有一个值,就是undefined 和Null

undefined 在JavaScript 中不是一个保留字,这意味着可以使用 undefined 来作为一个变量 名,但是这样的做法是非常危险的,它会影响对 undefined 值的判断。我们可以通过一些 方法获得安全的 undefined 值,比如说 void 0。

当对这两种类型使用进行判断时类型,Null类型化会返回“Object”,这是一个历史遗 留的问题.当使用双等号对两种类型的值进行比较时会返回true,使用二个等号时会返回 假的。

typeof null 结果是Object

在javascript第一个版本中所有制都储存在32位的单元中,每个单元包含一个小的类型标签(1-3bit) 以及当前要存储值得真实数据,类型标签存储在每个单元得低位中,共有五种数据类型

000:object
  1:int
010:double
100:string
110:boolean

如果最低为是一则类型标签标志位得长度只有1,如果最低为是0 ,则类型标签标志位得长度占三位,为存储其他四种数据类型提供二额外两个bit得长度

有两个特殊得数据类型:

  • undefined得值是(-2) 三十次方,
  • null的值是机器吗Null指针(null指针的值全是0);

那也就是说null的标签也是000 和Object 的类型标签一样,会被判定Object