-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
面试官:typeof 与 instanceof 区别 #65
Comments
能详细讲讲为什么bject.prototype.toString.call 要加个call |
你不加call,那不就成了Object.prototype.toString() 结果全是[Object Object] |
这句用法有误,toString方法是没有入参的,所以楼1有那样的疑惑。 为何要用Object.prototype.toString.call是因为这样执行的就是目标对象在Object原型上的toString方法,回避了有些目标对象自己覆盖的toString方法。 |
这个才是正解,因为 Object 的 toString 才能返回构造函数名称,其它类型的 toString 都有各自的定义,不是干这个事的 |
Object.prototype.toString 是一个函数,使用 call 方法来改变函数的执行上下文,将参数传递给 toString 方法 |
一、typeof
typeof
操作符返回一个字符串,表示未经计算的操作数的类型使用方法如下:
operand
表示对象或原始值的表达式,其类型将被返回举个例子
从上面例子,前6个都是基础数据类型。虽然
typeof null
为object
,但这只是JavaScript
存在的一个悠久Bug
,不代表null
就是引用数据类型,并且null
本身也不是对象所以,
null
在typeof
之后返回的是有问题的结果,不能作为判断null
的方法。如果你需要在if
语句中判断是否为null
,直接通过===null
来判断就好同时,可以发现引用类型数据,用
typeof
来判断的话,除了function
会被识别出来之外,其余的都输出object
如果我们想要判断一个变量是否存在,可以使用
typeof
:(不能使用if(a)
, 若a
未声明,则报错)二、instanceof
instanceof
运算符用于检测构造函数的prototype
属性是否出现在某个实例对象的原型链上使用如下:
object
为实例对象,constructor
为构造函数构造函数通过
new
可以实例对象,instanceof
能判断这个对象是否是之前那个构造函数生成的对象关于
instanceof
的实现原理,可以参考下面:也就是顺着原型链去找,直到找到相同的原型对象,返回
true
,否则为false
三、区别
typeof
与instanceof
都是判断数据类型的方法,区别如下:typeof
会返回一个变量的基本类型,instanceof
返回的是一个布尔值instanceof
可以准确地判断复杂引用数据类型,但是不能正确判断基础数据类型而
typeof
也存在弊端,它虽然可以判断基础数据类型(null
除外),但是引用数据类型中,除了function
类型以外,其他的也无法判断可以看到,上述两种方法都有弊端,并不能满足所有场景的需求
如果需要通用检测数据类型,可以采用
Object.prototype.toString
,调用该方法,统一返回格式“[object Xxx]”
的字符串如下
了解了
toString
的基本用法,下面就实现一个全局通用的数据类型判断方法使用如下
The text was updated successfully, but these errors were encountered: