一.js里有哪些数据类型?它们分别存放在哪
js的数据类型分为基本数据类型和引用数据类型,基本数据类型包括:Number、String、Null、Undefined、Boolean、Symbol,引用数据类型包括:Object、Array、Function、Date、Regexp。而基本数据类型存储在栈中(基本数据类型的数据直接存储在栈中),引用数据类型存储在堆中(引用数据类型的数据存储在堆中,在栈中保存数据的引用地址)
这里贴上一段代码,能很清楚地看懂引用数据类型保存的是引用地址
let a = [123,12,1]
let b = a
console.log('b='+b); //b=123,12,1
b[0] = 321
console.log(`a=${a},b=${b}`); //a=321,12,1,b=321,12,1
let c = a
console.log(`c=${c}`); //c=321,12,1
c = [10]
console.log(`c=${c},a=${a}`); //c=10,a=321,12,1
而基本数据则是把数据直接保存在栈中,下图的d并没有因为e的改变而改变,说明d赋值给e的是值而不是引用地址(说的有点绕)
let d = 123
let e = d
console.log(e); //e=123
e=321
console.log(d); //d=123
并且堆存放的数据占用的内存不会自动释放,需要手动释放
二.判断数据类型的方法有哪些?
1.typeof
不过...
let a = null
console.log(typeof(a)); //object
2.instanceof
判断是否是对象里的实例,可以用于判断是否属于某种数据类型(一般人也不会用这个吧)
let b = new Number(3)
console.log(b instanceof Number); //true
let c = 123
console.log(c instanceof Number); //false
3.constructor.name
let date = new Date()
console.log(date.constructor.name); //Date
4.Object.prototype.toString.call()
三.==和===的区别
两者都会去比较数据类型和值,不过===比==更为全面,例如:
console.log(1=='1'); //true
console.log(1==='1'); //false
console.log(true==1); //true
console.log(true===1); //false
console.log(null==undefined); //true
console.log(null===undefined); //false