typeof
typeof操作符可以安全准确的判断出Boolean、Number、undefined、String、Symbol这5种基本类型。但是对与引用类型和null来说,返回的都是object。
在现代浏览器中,
typeof可以准确的判断出一个变量是不是一个函数,如果是函数就返回字符串function
instanceof
instanceof弥补了typeof的不足,可以用来判断引用类型的数据类型。但有的时候并不能保证准确性,比如在不同作用域中,修改了原始的构造函数。
const global = new Array()
function foo () {
class Array {} // 在foo函数作用域内重写Array
console.log(global instanceof Array) // 猜打印出的是false还是true
}
foo() // 打印出的是false
复制代码通过上面的例子可以看出,使用
instanceof操作符不总是准确安全的
最安全的做法
大家都知道每个引用类型都包含一个toString的原型方法,有的构造函数会修改自己原型对象上的toString方法,我们可以通过Object.prototype.toString来调用最原始的toString方法。该方法会返回类似于[object Object]的字符串,Array的实例会返回[object Array]这样的,其它类型类似。会发现不同类型的实例返回的字符串和自己的构造函数的名字相同,于是我们就可以利用这一点来准确的判断数据的类型。
// 还是上面的例子,这次我们改用Object.prototype.toString来判断
const global = new Array()
const toSting = Object.prototype.toString
function foo () {
class Array {}
console.log(toString.call(global) === '[object Array]')
}
foo() // 你会惊奇的发现打印出来的是true,完美判断出来global的类型...
复制代码没错,就是这么强大。

被折叠的 条评论
为什么被折叠?



