typeof与instanceof的区别

最近又用到了对一个类型进行类型判断,这里对两种判断方法进行一个总结

相同点:

typeof与instanceof都是判断数据类型的方法

区别:

typeof会返回一个变量的基本类型(特殊 typeof null 会为object 但这只是JavaScript 存在的一个悠久 Bug),除了function会被检测出来,其他对象类型都为object,基本类型会反回对应的类型。

下面是一个简单示范

console.log(typeof a);    //'undefined'

console.log(typeof(true));  //'boolean'

console.log(typeof '123');  //'string'

console.log(typeof 123);   //'number'

console.log(typeof NaN);   //'number'

console.log(typeof null);  //'object'    

var obj = new String();

console.log(typeof(obj)); //'object'

var  fn = function(){};

console.log(typeof(fn));  //'function'

typeof原理:js 在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息:

对象:000  浮点数:010  字符串:100  布尔:110  整数:1  null:全是0(因此会被误以为是对象类型)undefined:用 −2^30 整数来表示因此要避免用typeof 判断null

instanceof返回的是一个布尔值 可以准确的判断复杂的引用类型,但是不能判断基础数据类型

这是因为instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上

所以也可以用来判断一个实例对象是不是某个构造函数产生的

 var Person = function () {

    }
    var p1 = new Person();
    function isinstance(a, b) {
        while (a !== null) {
            if (a.__proto__ === b.prototype) {
                return true;
            } else {
                a = a.__proto__
            }
        }
        return false;
    }
    console.log(isinstance(p1, Object));//true
    console.log(isinstance(p1, Person));//true

如果需要通用检测数据类型,可以采用Object.prototype.tostring

console.log(Object.prototype.toString.call('aa'));//[object,string]

也可以用===

这里会涉及到原型、原型链部分的知识了,有兴趣可以看看我之前的博客

原型、原型链的关系?如何用自己的语言来叙述?_js 把方法挂到docment上_时雨.`的博客-CSDN博客

你可能感兴趣的:(javascript,开发语言,ecmascript)