JavaScript中的数据类型以及typeof 和 instanceof
在JavaScript中,把数据类型分为简单数据类型和复杂数据类型两类,简单数据类型有7种类型,分别为string、number、boolean、undefined、null、symbol和bigint;复杂数据类型有function、array和object等等,那么我们怎么准确判断数据是什么类型呢?
关于判断数据类型,JavaScript中给我们提供了两个关键字,那就是typeof和instanceof,那么两者又有什么区分呢,什么时候用typeof,什么时候用instanceof呢?
typeof:用来检测数据的数据类型,能判断数据属于什么类型,但是一般只能准确地判断出一些简单的数据类型,如果碰上复杂数据类型可能会有一些偏差,但是碰上null也会返回object;
例:
const str = 'Jack'
console.log(typeof str) //string
const num = 123
console.log(typeof num) //number
const bol = true
console.log(typeof bol) //boolean
const unde = undefined
console.log(typeof unde) //undefined
const sym = Symbol('Jack')
console.log(typeof sym) //symbol
const bigint = BigInt(555)
console.log(typeof bigint) //bigint
const not = null
console.log(typeof not) //object
function isfunction(){
console.log(typeof isfunction) //function
}
isfunction()
但是在null这块有点出乎意料了,他为什么没有返回null而是返回object呢,如果这样的话那么null为什么被归为简单数据类型呢 ,其实在这一块我也是有点不理解的,其实我用instanceof也做过判断,null也不属于Object,这里先把这个问题放在这里,我们继续说instanceof
instanceof:见名知意,判断前者是不是后者的实例,也可以用来检测数据类型,但是他可以检测复杂数据类型,却检测不了简单数据类型。
我们在上文也说到过,复杂数据类型分为array,function和object,其实在JavaScript中常常流行一句话:万物皆对象。
那么instanceof是怎么使用的呢?他和typeof的使用方法倒是有一点区别,instanceof使用的时候需要写成 (a instanceof b),即 a 是不是 b 的实例,如果是就返回true,不是就返回false
例:
function isfunction(){
console.log(isfunction instanceof Function) //true
}
isfunction()
const arr = [ 1, 2, 3, 4, 5, 6 ]
console.log(arr instanceof Array) //true
const obj = { name:'Jack' }
console.log(obj instanceof Object) //true
const string = 'Bob'
console.log('132' instanceof String) //false
其实上述中isfunction和arr也是Object的实例
这些说完了,那我们再回到上面null的那个问题,为什么typeof null 会返回object
console.log(null instanceof Object) //false
如上,返回是false,那么说明null不是Object的实例,那为什么typeof null会返回object呢,我也查阅了一些资料以及问了一些朋友,他们说这个是JavaScript遗留的问题,当初设计null的本意是用来存储一个空对象的指针,进行一个初始化的操作,那到了这里估计还有人会说,那你怎么证明null这个类型是存在的,看你上面的描述,他既不像简单数据类型,又不是复杂数据类型
const nullValue = null
console.log(nullValue === null) //true
console.log(Object.prototype.toString.call(nullValue)) //[object Null]
上述代码证明null类型是存在的,但是关于他为什么是简单数据类型我也不能证明
好了,这篇文章到这就结束了,我也只是一个刚刚学习JavaScript没多久的小白,如果各位大佬有什么不同的见解,还希望指出,不要喷我,谢谢
上一篇: Spring AOP面向切面编程
下一篇: C#经典排序算法的图文代码详解(上)
推荐阅读
-
JavaScript中的split()、substr()、substring()以及slice()和splice()的用法区别
-
基于javascript中的typeof和类型判断(详解)
-
JavaScript中数据类型的判断——typeof,instanceof,constructor,Object.prototype.toString.call()
-
JS中的数据类型的判断(typeof,instanceof,constructor)
-
JS中数据类型的判断( typeof,instanceof,constructor,Object.prototype.toString.call() )
-
如何判断js中的数据类型:typeof、instanceof、 constructor、 prototype方法比较
-
详解JavaScript中的数据类型,以及检测数据类型的方法
-
JavaScript中的call和apply的用途以及区别
-
javascript中对象的定义、使用以及对象和原型链操作小结
-
对javascript中浅拷贝和深拷贝以及赋值的理解