JS 基础|搞懂 typeof 和 instanceof

栏目: JavaScript · 发布时间: 5年前

内容简介:最近在做 Code Review 的时候,发现了一些小问题,查出结果之后发现竟然是因为 typeof 和 instanceof 引发的。这属于为了巩固基础,我会通过实例来详细说明,让我们一起搞懂 typeof 和 instanceof。

最近在做 Code Review 的时候,发现了一些小问题,查出结果之后发现竟然是因为 typeof 和 instanceof 引发的。

这属于 JS 的基础知识,正是由于太基础了,所以很容易被忽略,导致项目中随处可见的滥用。

为了巩固基础,我会通过实例来详细说明,让我们一起搞懂 typeof 和 instanceof。

一、typeof

typeof 其实就是判断参数是什么类型的实例,就一个参数,用例: typeof A
返回值:

"number"、"string"、"boolean"、"object"、"function" 和 "undefined"

我们先来验证几个基本类型:

typeof 123; // number
typeof 'jartto'; // string
typeof !!’0’; // boolean
typeof new Function(); // function
typeof name; // undefined

这里可以扩展一下,假如我们要判断某个变量是否存在:

if(!a) { console.log('error')}

这时候,控制台会报错:

Uncaught ReferenceError: a is not defined

所以我们可以使用 typeof 来判断:

if(typeof a === 'undefined') { 
  console.log('error');
}

这样,就能避免代码异常,是一种比较严谨的处理方式。

需要注意:

ES6letconst 会形成「暂时性死区」也意味着 typeof 不再是一个百分之百安全的操作。

typeof x; // ReferenceError
let x;

上面代码中,变量 x 使用 let 命令声明,所以在声明之前,都属于 x 的「死区」,只要用到该变量就会报错。因此, typeof 运行时就会抛出一个 ReferenceError

如果用 typeof 来判断引用类型,会有怎样的结果?

let arr = [1,2,3];
let obj = {name: 'jartto'};
let obj1 = null;

typeof arr; // object
typeof obj; // object
typeof obj1; // object

如上所示,引用类型的数据,都返回了 object ,我们无法做到精确判断。我们来总结一下:

1.对于基本类型,除 null 以外,均可以返回正确的结果。

2.对于引用类型,除 function 以外,一律返回 object 类型。

3.对于 null ,返回 object 类型。

4.对于 function 返回 function 类型。

这就需要用到 instanceof 来检测某个对象是不是另一个对象的实例。

二、instanceof

instanceof 是用来判断 A 是否为 B 的实例,表达式为: A instanceof B ,如果 AB 的实例,则返回 true ,否则返回 false

// 示例来自于:https://blog.csdn.net/liwenfei123/article/details/77978027
instanceof (A,B) = {
    var L = A.__proto__;
    var R = B.prototype;
    if(L === R) {
        //A的内部属性__proto__指向B的原型对象
        return true;
    }
    return false;
}

从上述过程可以看出,当 A__proto__ 指向 Bprototype 时,就认为 A 就是 B 的实例,我们来看几个例子:

[] instanceof Array; //true
{} instanceof Object;//true
new Date() instanceof Date;//true

JS 中万物皆对象的思想:

[] instanceof Object //true

function Person(){};
new Person() instanceof Person; // true
new Person instanceof Object; // true

再举个例子,我们通过一个简单的继承来说明:

function Parent(){};
function Child(){};
function Other(){};

Child.prototype = new Parent();
let child = new Child();

child instanceof Child; // true
child instanceof Parent; // true
child instanceof Object; // true
child instanceof Other; // false

很简单,我们只需要理解下面这行代码就可以了:

Parent.prototype.__proto__ === Object.prototype

三、扩展

我们来分析一下 []ArrayObject 三者之间的关系:

instanceof 能够判断出 [].proto 指向 Array.prototype ,而 Array.prototype.proto 又指向了 Object.prototype ,最终 Object.prototype.proto 指向了 null ,标志着原型链的结束。

因此, []ArrayObject 就在内部形成了一条原型链:

JS 基础|搞懂 typeof 和 instanceof

依次类推,类似的 new Date()new Parent() 也会形成一条对应的原型链 。

instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。

四、巩固知识

Question 1:下面如何输出

function fun(){}
console.log(typeof fun);
console.log(fun instanceof Function);
console.log(fun instanceof Object);

答: function , true , true

Question2:如何判断一个变量是否为数组?

// 不要用 typeof 判断
typeof []; // object

// 这是es3的规定,但是这必须假定只有一个全局执行环境
[] instanceof Array; // true

// ES5的标准
Array.isArray([]); // true

答:通过 instanceof 判断,或者 isArray 来判断。

Question3:下面函数输出结果是什么?

var name = 'World!';
(function (){
    if (typeof name === 'undefined') {
        var name = 'Jartto';
        console.log('Hi~ ' + name);
    } else {
        console.log('Hello ' + name);
    }
})();

答:这里需要注意变量声明提升,所以上面代码等效于:

var name = 'World!';
(function (){
    var name;
    if (typeof name === 'undefined') {
        var name = 'Jartto';
        console.log('Hi~ ' + name);
    } else {
        console.log('Hello ' + name);
    }
})();

这时候, typeof name 就等于 undefined ,所以输出结果为 Hi~Jartto

五、总结

突然发现我们总是忙碌于写业务,却忽略了基础的重要性。所以在不断写 Bug 和解决 Bug 的路上越走越远,却徒劳无获。

既然如此,那么我们就从当下开始,打好根基。我会陆续更新更多 JS 基础相关知识,大家共同学习。


以上所述就是小编给大家介绍的《JS 基础|搞懂 typeof 和 instanceof》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

操作系统

操作系统

William Stallings / 陈向群、陈渝 / 机械工业出版社 / 2010.9 / 69.00元

本书不仅全面地讲述了操作系统的基本概念、原理和方法,还清楚地展现了当代操作系统的本质和特点。作者针对近几年操作系统领域的最新变化,对操作系统的设计原理进行深入的阐述,同时将其对操作系统整个领域全面而深入的理解呈现给读者。 本书特色 ·选择Windows Vista、UNIX和Linux三个操作系统作为示例,以帮助读者熟悉当代操作系统的设计原理和实现问题。 ·新增嵌入式操作系统一章......一起来看看 《操作系统》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试