← 返回首页
Javascript基础教程(四十三)
发表时间:2021-04-28 22:46:42
instanceof

1.typeof

typeof方法返回一个字符串,来表示数据的类型。 我们先看看各个数据类型对应typeof的值见下表: |数据类型|Type| |-|-| |Undefined|“undefined”| |Null|“object”| |布尔值|“boolean”| |数值|“number”| |字符串|“string”| |Symbol (ECMAScript 6 新增)|“symbol”| |函数对象|“function”| |任何其他对象|“object”|

实例:

<script>
    function Person(name,age){
        this.name = name;
        this.age = age;
    }
    let p = new Person('zhangsna',20);
    let d = new Date();
    let arr = new Array();
    let num = new Number(100);

    console.log(typeof(undefined));
    console.log(typeof(null));
    console.log(typeof(100));
    console.log(typeof(true));
    console.log(typeof("hello"));
    console.log(typeof({}));
    console.log(typeof(Person));
    console.log(typeof(p));
    console.log(typeof(d));
    console.log(typeof(arr));
    console.log(typeof(num));
</script>

运行结果:
undefined
object
number
boolean
string
object
function
object
object
object
object

在 JavaScript 中,判断一个变量的类型通常会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 “object”。这就需要用到instanceof来检测某个对象是不是另一个对象的实例。

2.instanceof

instanceof的简单理解可以用于判断一个对象是否是某个构造函数的实例。因此instanceof通常用来判断引用类型。

Javascript常见的引用类型见下表: |数据|引用类型| |-|-| |new String(“foo”)|String| |new Number(1.2)|Number| |new Boolean(true)|Boolean| |new Date()|Date| |new Error()|Error| |new Array(1, 2, 3)|Array| |new RegExp(“meow”)|RegExp| |new Object()|Object| |new Person()|Person(用户自定义类型)|

直接量不能使用instanceof的。instanceof的用途是判断一个对象是否在某个对象原型链上。或者说判断一个对象是某个对象的实例。

例如:


    let num = 100;
    console.log(num instanceof Number);
    num  = new Number(num);
    console.log(num instanceof Number);

运行结果:
false
true

例如:

    let p1 = {
        name : 'zhangsan',
        age : 18
    }

    function Person(name,age){
        this.name = name;
        this.age = age;
    }
    let p2 = new Person('lisi',18);

    console.log(p1 instanceof Object);
    console.log(p1 instanceof Person);
    console.log(p2 instanceof Object);
    console.log(p2 instanceof Person);

运行结果:
true
false
true
true

但是instanceof更准确的解释是:判断一个构造函数的prototype属性所指向的对象是否在另一个被检测对象的原型链上。

上例改写如下:

    let p1 = {
        name : 'zhangsan',
        age : 18
    }

    function Person(name,age){
        this.name = name;
        this.age = age;
    }
    let p2 = new Person('lisi',18);

    Person.prototype = p1;

    console.log(p1 instanceof Object);
    console.log(p1 instanceof Person);
    console.log(p2 instanceof Object);
    console.log(p2 instanceof Person);

运行结果:
true
false
true
false

3.typeof与instanceof区别

1). typeof会返回一个变量的基本类型(字符串),instanceof返回的是一个布尔值。 2). instanceof 可以准确地判断复杂引用数据类型,但是不能正确判断基础数据类型。 3). typeof也存在弊端,它虽然可以判断基础数据类型(null 除外),但是引用数据类型中,除了function 类型以外,其他的也无法判断。

可以看出,上述两种方法都有弊端,并不能满足所有场景的需求。