开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
前言
之前面试的时候,总是被问如何判断javascript数据类型,当我回答用typeof和instanceof时,总是被问:还有嘛? 其实这两种就是工作中比较常用的,但是回去之后想了想,应该比较有比较常而全的答案。故记录
数据类型
基本类型
- String---字符串
- Boolean---布尔类型
- Number---数字类型
- Null
- undefined
- ES6新增:Symbol---用于创建一个独一无二的值
- ES10新增:BigInt---表示比较大的数值
复杂类型
Object(无序键对值):包括Array,Function,Date3种常用的引用类型
存储类型
- 基本类型存储在栈中,占据空间小,大小固定,频繁使用
- 复杂类型存储同时存储在堆和栈中,值存储在堆中,指针存储在栈中,指针存储着值在堆的地址,赋值给其他对象时复制的是指针,指向同一个内存地址,占据空间大,大小不固定,可修改长度
null和undefined的异同
- 区别:Null和Undefined都只用一个值,就是null和undefined,null表示空值,不占存储空间,undefined表示未定义的值,存储在栈中
- 数据类型判别
判断类型的方法
typeof
- 判断Null时会是object,其他都正常
2. 判断Function会是function,其他都是object
instanceof
instanceof可以精准判断类型,主要原理是判断构造函数的prototype属性是否在该实例的原型链上
constructor
主要用于判断函数,当一个函数被定义时,会创建一个prototype属性,在该属性下会添加一个consturctor属性,指向构造函数 结构类型
- fn
- prototype
- constructor 判断结果
- prototype
注意
- null和undefined是无效对象,不存在constructor属性
- peototype属性很容易被改写,故constructor属性很容易丢失,丢失后会指向Object(Object是所以引用类型的父类)
function F(){}
F.prototype = {}
let f = new F()
f.constructor === F // false
console.log(f.constructor) //function Object(){..}
apply或call
apply和call的功能是改变this指向
apply使用方法类似