一.JS的数据类型
基础数据类型: string number boolean undefined null Symbol
基础数据类型数据存在 栈中,也就是当前作用域中,随着当前作用域的消失而消失
引用数据类型:object
引用数据类型数据 存在 堆中,当没有引用的时候,不同浏览器不同的垃圾回收机制,回收。
chrome:定期查看有没有引用,没有就回收;ie:统计引用的数量,数量为0回收(因为统计这个数量会有误,所以会导致内存溢出)
二:判断变量的类型及区别 参考了 全栈然叔 (https://juejin.cn/post/7049383966700208165)的文章
判断变量类型的4中方法:typeof instanceof constructor Object.prototype.toString
typeof :
语法:typeof target
返回操作值的数据类型
注:typeof null 返回object;判断引用类型时,除了function->返回function,其他的引用类型 都返回object
instanceof :
语法:target instanceof constructor
检测构造函数的 prototype 属性是否出现在target的原型链上(两者是否属于原型链的关系)
注:基本类型数据不是构造函数的实例,没有原型链,此方法不能判断基本数据类型
引用类型的原型链上都会有object.pototype,所以 引用数据类型 instanceof Object 都会返回true
原型链可以被修改,所以结果不准
constructor:
语法:target.constructor === constructor
判断target是否是指定构造函数的实例,
注:除了null 和 undefined之外,所有的数据类型都可以判断,但是constructor 属性可以被修改,所以结果值不准
Object.prototype.toString
语法:Object.prototype.toString.call(target)
返回对象的类型字符串
把然叔总结的图拿过来,就是:
| typeof | instanceof | constructor | Object.prototype.toString | |
|---|---|---|---|---|
| number | ✅ | ❌ | ✅ | ✅ |
| string | ✅ | ❌ | ✅ | ✅ |
| boolean | ✅ | ❌ | ✅ | ✅ |
| symbol | ✅ | ❌ | ✅ | ✅ |
| [] | ❌ | ✅ | ✅ | ✅ |
| {} | ❌ | ✅ | ✅ | ✅ |
| function() {} | ❌ | ✅ | ✅ | ✅ |
| undefined | ❌ | ✅ | ❌ | ✅ |
| null | ❌ | ✅ | ❌ | ✅ |
| new Date() | ❌ | ✅ | ✅ | ✅ |
| /\d/g | ❌ | ✅ | ✅ | ✅ |
| new Error() | ❌ | ✅ | ✅ | ✅ |