javascript数据类型

101 阅读3分钟

一、JavaScript数据类型:

最新的ECMAScript 标准定义了8种数据类型,并将其分成两类:基本类型复杂类型

  • 基本类型:Number String Boolean Undefined Null Symbol BigInt
  • 复杂类型(引用类型):Object

二、基本类型和引用类型的区别

  • 基本类型的值存储在栈内存中,如果一个函数中定义了一个基本类型的变量值,当函数执行结束之后,这个变量会自动销毁
  • 引用类型的变量名存储在栈内存,变量值存储在堆内存中,引用类型的值不会自动销毁,当没有变量引用它时,系统的垃圾回收机制会回收它
  • 赋值方式:基本类型的值存储在栈内存中,定义两个变量a和b,把a的值赋值给b,虽然两个变量的值相等,但是两个变量保存了两个不同的内存地址,修改a的值并不会影响b
let a = 10;
let b = a;
b = 20;
console.log(a)  //10
console.log(b); //20

下图演示了基本类型的赋值过程:

image.png

  • 引用类型数据存放在堆对内中,每个堆内存中有一个引用地址,该引用地址存放在栈中,变量之间的赋值,只是把引用地址复制一份给了另一个变量,指向还是同一个堆内存中的数据,所以修改一个变量的属性值会影响另一个变量产生影响
let obj1 = {
  name:'张三',
  age:20
}
let obj2 = obj1;
obj.name = "李四"
console.log(obj1)    //{name:'李四',age:20}
console.log(obj2)   //{name:'李四',age:20}

下图演示了引用类型的赋值过程:

image.png

三、怎么判断JavaScript数据类型

  1. typeof 命令可以判断所有 javascript 中的基本数据类型(Null, Undefined, Boolean, String, Number)
let obj = {}
let arr = []
let fn = () => {}
let s1 = Symbol('111111');
console.log(typeof 1);    //number
console.log(typeof NaN);  //number
console.log(typeof Infinity);  //number
console.log(typeof 'aaaa'); //string
console.log(typeof false);  //boolean
console.log(typeof s1)  //symbol
console.log(typeof undefined);  //undefined
console.log(typeof null); //object
console.log(typeof obj);  //object
console.log(typeof arr);  //object
console.log(typeof fn); //function

从以上示例中我们可以看到得到:

  • typeof可以判断JavaScript中所有的基本数据类型
  • typeof会把NaN和Infinity识别为number
  • typeof无法识别引用类型的值,null、数组、对象会识别为object
  1. instanceof方法,对于引用类型的值可以通过instanceof来进行判断,但是检测null和undefined会返回false
let obj = {}
let arr = []
let fn = () => {}

console.log(obj instanceof Object)  //true
console.log(arr instanceof Array) //true
console.log(fn instanceof Function) //true
console.log(undefined instanceof Object)  //false
console.log(null instanceof Object) //false
  1. constructor方法,除了 undefined 和 null 之外,其他类型都可以通过 constructor 属性来判断它的类型。
let obj = {}
let arr = []
let fn = () => {}
let s1 = Symbol('111111');
let num = 20;
let str = "aaaaaaaa"
let bool = false;

console.log(arr.constructor === Array);    //true
console.log(obj.constructor === Object);  //true
console.log(fn.constructor === Function);  //true
console.log(s1.constructor === Symbol); //true
console.log(num.constructor === Number);  //true
console.log(str.constructor === String);  //true
console.log(bool.constructor === Boolean);  //true
  1. Object.prototype.toString.call 使用 Object.prototype.toString,call方法, 可以获取到变量的准确的类型
let obj = {}
let arr = []
let fn = () => {}
let s1 = Symbol('111111');
let num = 20;
let str = "aaaaaaaa"
let bool = false;
let error = new Error()
let date = new Date() 

console.log(Object.prototype.toString.call(num));    //[object Number]
console.log(Object.prototype.toString.call(str));  //[object String]
console.log(Object.prototype.toString.call(bool));  //[object Boolean]
console.log(Object.prototype.toString.call(s1)); //[object Symbol]
console.log(Object.prototype.toString.call(undefined));  //[object Undefined]
console.log(Object.prototype.toString.call(null));  //[object Null]
console.log(Object.prototype.toString.call(obj));  //[object Object]
console.log(Object.prototype.toString.call(arr));  //[object Array]
console.log(Object.prototype.toString.call(fn));  //[object Function]
console.log(Object.prototype.toString.call(error));  //[object Error]
console.log(Object.prototype.toString.call(date));  //[object Date]

今天就到这里了,总结这些东西主要是加深印象,帮助自己更好的学习和理解,同时也希望对你们有所帮助。谢谢!

参考:# js底层知识汇总,大厂必备 # Javascript 中的数据类型判断