开发者社区> 问答> 正文

typeof能正确判断类型吗?instanceof能正确判断对象的原理?

typeof能正确判断类型吗?instanceof能正确判断对象的原理?


【精品问答】前端面试手册

【精品问答】前端面试手册之JavaScript篇

展开
收起
前端问答 2019-11-24 19:48:01 1007 0
1 条回答
写回答
取消 提交回答
  • 前端问答小助手

    typeof对于原始类型来说,除了null都可以显示正确的类型。

    typeof 1 // 'number'
    typeof '1' // 'string'
    typeof undefined // 'undefined'
    typeof true // 'boolean'
    typeof Symbol() // 'symbol'
    

    typeof对于对象来说,除了函数都会显示object,所以说**typeof并不能准确判断变量到底是什么类型**。

    typeof [] // 'object'
    typeof {} // 'object'
    typeof console.log // 'function'
    

    如果我们想判断一个对象的正确类型,这时候可以考虑使用instanceof,因为内部机制是通过原型链来判断的。

    const Person = function() {}
    const p1 = new Person()
    p1 instanceof Person // true
    
    var str = 'hello world'
    str instanceof String // false
    
    var str1 = new String('hello world')
    str1 instanceof String // true
    

    对于原始类型来说,你想直接通过instanceof来判断类型是不行的,当然我们还是有办法让instanceof判断原始类型的:

    class PrimitiveString {
      static [Symbol.hasInstance](x) {
        return typeof x === 'string'
      }
    }
    console.log('hello world' instanceof PrimitiveString) // true
    

    你可能不知道Symbol.hasInstance是什么东西,其实就是一个能让我们自定义instanceof行为的东西,以上代码等同于typeof 'hello world' === 'string',所以结果自然是true了。这其实也侧面反映了一个问题,instanceof也不是百分之百可信的。

    2019-11-25 06:36:25
    赞同 1 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载