一、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
下图演示了基本类型的赋值过程:
- 引用类型数据存放在堆对内中,每个堆内存中有一个引用地址,该引用地址存放在栈中,变量之间的赋值,只是把引用地址复制一份给了另一个变量,指向还是同一个堆内存中的数据,所以修改一个变量的属性值会影响另一个变量产生影响
let obj1 = {
name:'张三',
age:20
}
let obj2 = obj1;
obj.name = "李四"
console.log(obj1) //{name:'李四',age:20}
console.log(obj2) //{name:'李四',age:20}
下图演示了引用类型的赋值过程:
三、怎么判断JavaScript数据类型
- 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
- 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
- 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
- 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]
今天就到这里了,总结这些东西主要是加深印象,帮助自己更好的学习和理解,同时也希望对你们有所帮助。谢谢!