美文网首页前端好文工作生活
JS中的 typeof 和instanceof(有待更新)

JS中的 typeof 和instanceof(有待更新)

作者: JiAyInNnNn | 来源:发表于2019-07-02 22:16 被阅读0次

    首先这篇文章借鉴了https://juejin.im/post/5b0b9b9051882515773ae714

    1.typeof
    使用 typeof 操作符来检测变量的数据类型。

    typeof "John"                // 返回 string 
    typeof 3.14                  // 返回 number
    typeof false                 // 返回 boolean
    typeof [1,2,3,4]             // 返回 object
    typeof {name:'John', age:34} // 返回 object
    typeof null                           // 返回object
    

    在JavaScript中,数组是一种特殊的对象类型。 因此 typeof [1,2,3,4] 返回 object。
    但是为撒null 返回的是object呢!如果想清空一个对象,给它赋值null就可以清空了。
    这里我就借鉴了上面的那个文章..

    来谈谈关于 typeof 的原理吧,我们可以先想一个很有意思的问题,js 在底层是怎么存储数据的类型信息呢?或者说,一个 js 的变量,在它的底层实现中,它的类型信息是怎么实现的呢?
    其实,js 在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息

    • 000:对象
    • 010:浮点数
    • 100:字符串
    • 110:布尔
    • 1:整数

    but, 对于 undefined 和 null 来说,这两个值的信息存储是有点特殊的。
    null:所有机器码均为0
    undefined:用 −2^30 整数来表示
    所以,typeof 在判断 null 的时候就出现问题了,由于 null 的所有机器码均为0,因此直接被当做了对象来看待。

    在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null的类型标签也成为了 0,typeof null就错误的返回了"object"

    ECMAScript提出了一个修复(通过opt-in),但被拒绝。这将导致typeof null === 'null'。

    2.instanceof

    object instanceof constructor
    

    object
    要检测的对象.
    constructor
    某个构造函数
    instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

    let person = function () {
    }
    let nicole = new person()
    nicole instanceof person // true
    

    (对不起大佬们,接下来我都看不懂了,JS的继承我不明白,所以就不搬运了,只写一些我感觉有用的东西)

    还有一个不错的判断类型的方法,就是Object.prototype.toString,我们可以利用这个方法来对一个变量的类型来进行比较准确的判断

    Object.prototype.toString.call(1) // "[object Number]"
    
    Object.prototype.toString.call('hi') // "[object String]"
    
    Object.prototype.toString.call({a:'hi'}) // "[object Object]"
    
    Object.prototype.toString.call([1,'a']) // "[object Array]"
    
    Object.prototype.toString.call(true) // "[object Boolean]"
    
    Object.prototype.toString.call(() => {}) // "[object Function]"
    
    Object.prototype.toString.call(null) // "[object Null]"
    
    Object.prototype.toString.call(undefined) // "[object Undefined]"
    
    Object.prototype.toString.call(Symbol(1)) // "[object Symbol]"
    
    作者:nicole_zhang
    链接:https://juejin.im/post/5b0b9b9051882515773ae714
    来源:掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    总结:
    简单来说,我们使用 typeof 来判断基本数据类型是 ok 的,不过需要注意当用 typeof 来判断 null 类型时的问题,如果想要判断一个对象的具体类型可以考虑用 instanceof,但是 instanceof 也可能判断不准确,比如一个数组,他可以被 instanceof 判断为 Object。所以我们要想比较准确的判断对象实例的类型时,可以采取 Object.prototype.toString.call 方法。

    相关文章

      网友评论

        本文标题:JS中的 typeof 和instanceof(有待更新)

        本文链接:https://www.haomeiwen.com/subject/fplxhctx.html