js中有7种基本数据类型,当然现在多了个 BigInt(ES10),其中有:undefined、null、boolean、string、number、symbol(ES6)、object、bigint。在js中判断数据类型可以使用 typeof,代码如下
console.log(typeof 'hello world')//string
console.log(typeof 250)//number
console.log(typeof true)//boolean
console.log(typeof casontan)//undefined
console.log(typeof Symbol('cason'))//symbol
console.log(typeof 1n)//bigint
console.log(typeof function(){})//function
console.log(typeof null)//object
console.log(typeof [1,2,3])//object
console.log(typeof {"name":'cason',"age":18})//object
这里主要有两个比较特殊的,一个是 null,一个是 function。这里比较神奇的是 null 属于基本数据类型,存储在栈区,而 object 是引用数据类型,存储在堆内存中,这两者相等十分不合理。
查阅资料后发现这是个经典的bug,在 javascript
的最初版本中,使用的 32
位系统,js
为了性能优化,使用低位来存储变量的类型信息,object的机器码标识为000,而null的机器码标识全是0。所以才会出现这个bug。那么问题来了,这个bug存在这么多年了为什么不修复它?原因就是影响太大,可能修复这个bug之后,很多项目,很多程序受到影响,从而产生更多的bug需要修复,所以这个bug也许将会一直存在。
那么function为什么不是object呢,function 也是 object ,但是由于function十分重要所以它有特权,直接显示,设计者偏爱?🤷
根据上面的代码,我们发现数组类型的判断也显示object,但是现实生产过程中我们经常需要更加详细的类型判断而不是笼统的用object 比较,有没有能够直接判断它是否为数组类型的?有!
instanceof
做类型判断,返回boolean类型的结果
console.log([1,23] instanceof Object);//true
console.log([1,23] instanceof Array);//true
还可以用来做继承类型的判断,instanceof
的判断是根据原型链进行搜寻,在对象A的原型链上如果存在另一个对象B的原型属性,那么表达式(A instanceof B
)返回值为true;否则返回false
//继承关系
function Person(){};
function Teacher(){};
Teacher.prototype = new Person();
let teacher = new Teacher();
let person = new Person();
console.log(teacher instanceof Teacher)//true
console.log(teacher instanceof Person)//true
console.log(person instanceof Teacher)//false
console.log(person instanceof Object)//true
拓展一下
Object.prototype.toString.call()
console.log(Object.prototype.toString.call([])); // "[object Array]"
封装一下
function getType(data){
let result = Object.prototype.toString.call(data);
return result.replace(/\[|\]|(object )|\]/g,'').toLowerCase();
}
//使用
console.log(getType({"name":'cason',"age":18}));//object
console.log(getType([1,2,3]));//array