typeof 与 instanceof 运算符

丶灬走出姿态 提交于 2019-12-01 07:00:22

相信很多伙伴们在刚刚入门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); // trueconsole.log(foo instanceof Fn);  // trueFoo.prototype = {};var foo2 = new Foo();console.log(foo2 instanceof Foo); // trueconsole.log(foo instanceof Foo); // false  ---------Foo.prototype指向了一个空对象,                                                     这个空对象不在foo的原型链上。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!