typeof 与 instanceof 运算符

Posted edwardwzw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了typeof 与 instanceof 运算符相关的知识,希望对你有一定的参考价值。

相信很多伙伴们在刚刚入门js的时候,都会遇到 typeof 与 instanceof 在用法上的一些个困惑,今天小编就要和大家聊一聊它们各自的用法以及一些区别,

您先别急,咱下面就来分别讲解:

 

js是一门弱语言,它在声明变量时无需确定变量的类型,js在运行时会自动判断。

 

typeof 

用来检测一个变量的类型,  返回值是一个字符串

使用方式:typeof(表达式)和 typeof 变量名

运算符返回值:字符串,有七种可能:"undefined" ,"number" ,"string","boolean" ,"object" ,"function" ,"symbol"

 

typeof  undefined // "undefined"

typeof 1 // "number"

typeof "1" // "string"

typeof false // "boolean"

typeof {} // "object"

typeof [] // "object"

typeof null // "object"

typeof function () {} // "function"

typeof Symbol(1) // "symbol"

 

(注意:对象、数组、null的typeof返回值都是”object”)

如果我们想判断一个变量类型是否是数组,建议使用:Array.isArray([]) // true 来判断

 

instanceof

用来检测一个对象在其原型链中是否存在一个构造函数的 prototype 属性

语法:[对象] instanceof [构造函数]

 (注意:左侧必须是对象,如果不是,则直接返回 false)

let num = 1
num instanceof Number // false

num = new Number(1)
num instanceof Number // true

看到这里,有人可能要问,明明都是num 且都是1,为什么返回的结果却不同呢?

其实,第一个不是对象,而是基本类型,而第二个是封装成对象,所以为true。同理:

var a = new Array();
console.log(a instanceof Array); // true
console.log(a instanceof Object); // true   -----------因为 Array 是 Object 的子类

function test(){}; var a = new test(); console.log(a instanceof test) // true

 

此外,instanceof 可以在继承关系中用来判断一个实例是否属于它的父类型。如:

function Fn() {};  
function Foo() {};
Foo.prototype = new Fn();
var foo = new Foo();
console.log(foo instanceof Foo); // true
console.log(foo instanceof Fn);  // true

Foo.prototype = {};
var foo2 = new Foo();
console.log(foo2 instanceof Foo); // true
console.log(foo instanceof Foo); // false  ---------Foo.prototype指向了一个空对象,这个空对象不在foo的原型链上。

以上是关于typeof 与 instanceof 运算符的主要内容,如果未能解决你的问题,请参考以下文章

typeof 与 instanceof 运算符

instanceof

instanceof 与typeof的用法

JS中typeof与instanceof的区别

关于JavaScript中的typeof与instanceof

JS中typeof与instanceof的区别