likes
comments
collection
share

JavaScript类型判断,typeof和instanceof

作者站长头像
站长
· 阅读数 24

今天来讲讲JavaScript中的类型判断

typeof

用于输出变量的类型

function add(a, b) {
  if (typeof a == "number" && typeof b == "number") {
    return a + b;
  }
  console.log("参数不对");
}
add("1", 2);

可以看到这段代码的打印结果为

JavaScript类型判断,typeof和instanceof

我们知道在JavaScript中,在es6之前的基本数据类型为

let s = '123'   // string
let n = 123    // number
let f = true   // boolean
let u = undefined   // undefined
let nu = null    // null

想进一步了解可以移步到我的另一篇文章

es6之后新增加

let sy = Symbol(123)   // Symbol
let big = 1234n    // BigInt

还有一种数据类型为引用类型

let obj = {}
let arr = []
let fn = function () { }
let date = new Date()

接下来我们去使用typeof给这些数据类型做判断

let s = '123'   // string
let n = 123    // number
let f = true   // boolean
let u = undefined   // undefined
let nu = null    // null
let sy = Symbol(123)   // Symbol
let big = 1234n    // BigInt


let obj = {}
let arr = []
let fn = function () { }
let date = new Date()

console.log(typeof s,"string");
console.log(typeof n, "number");
console.log(typeof f, "boolean");
console.log(typeof u, "undefined");
console.log(typeof nu, "null");
console.log(typeof sy, "symbol");
console.log(typeof big, "bigint");

console.log(typeof obj, "object");
console.log(typeof arr, "array");
console.log(typeof fn, "function");
console.log(typeof date, "date");

执行结果为

JavaScript类型判断,typeof和instanceof

可以看到一个比较奇怪的是,在判断null时居然是object类型的?在判断function是类型是function?

这是为什么呢????

在判断null时居然是object类型的?简单来说这就是一个bug,这是 JavaScript 语言中存在的一个历史遗留问题

可以移步到这篇文章,这里深入的讲解了这其中的原理

在判断function是类型是function?

在 JavaScript 中,function 是对象的一种特殊类型

typeof 操作符返回的结果是基于 JavaScript 中数据类型的定义。虽然函数本质上是对象,但 JavaScript 将函数单独作为一种类型进行返回,即 function

为了突出函数在 JavaScript 中的重要性和特殊性质

所以我们如果希望写一个方法能够判断是不是对象就需要而外去判断null

// 我希望我传的如果是一个对象 打印true,如果不是对象打印false
function isObject(obj) {
    if (typeof obj == 'object' && obj != null) {
        return true;
    }
    return false;
}
let res = isObject({ a: 1 });
console.log(res);

如果我想具体判断这个对象到底是什么类型的,我们就需要用到instanceof了

instanceof

instanceof 操作符用于检测构造函数的 prototype 属性是否出现在某个对象的原型链上

所以我可以知道instanceof只能用于引用类型的判断

let s = '123'   // string
let n = 123    // number
let f = true   // boolean
let u = undefined   // undefined
let nu = null    // null
let sy = Symbol(123)   // Symbol
let big = 1234n    // BigInt


let obj = {}
let arr = []
let fn = function () { }
let date = new Date()

// 基本数据类型
console.log(s instanceof String, "string");
console.log(n instanceof Number, "number");
console.log(f instanceof Boolean, "boolean");
// console.log(u instanceof undefined, "undefined"); 报错
// console.log(nu instanceof null, "null"); 报错
console.log(sy instanceof Symbol, "symbol");
console.log(big instanceof BigInt, "bigint");

// 引用数据类型
console.log(obj instanceof Object, "object");
console.log(fn instanceof Function, "function");
console.log(date instanceof Date, "date");
console.log(arr instanceof Array, "array");

console.log(arr instanceof Object, "array");

JavaScript类型判断,typeof和instanceof

可以看到基本类型的判断都是false,因为instanceof只能用于引用类型的判断

这里有个细节就是

console.log(arr instanceof Array, "array");
console.log(arr instanceof Object, "array");

这两段底代码都为true

这是由于他们在原型上是有关系的

// arr.__proto__ = Array.prototype
// Array.prototype.__proto__ = Object.prototype

这里不做过多讲解,后面将带大家手撕instanceof

总结

本文讲解了JavaScript类型判断时,typeof和instanceof的使用差别和具体使用细节

希望本文能够对你有所帮助!!!!

转载自:https://juejin.cn/post/7392654657774731291
评论
请登录