1.typeof
typeof 可用于判断变量的类型,会有6种值返回,我们都知道,在es6之前,数据类型可分为6种,原始类型有string,number,boolean,特殊类型有null和undefined,符合类型object可细分为array,function,object。
值得提醒的是,typeof返回的字符串都是小写字母
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
typeof undefined // "undefined"
typeof {} // "object"
typeof [] // "object"
上面的代码块可以看到,基本类型的返回值都是类型小写字母,无特别之处,使用的时候也很好记忆。
而下面的null 和 函数 是两个特别的例子
typeof null // "object"
function f() {}
typeof f // "function"
null虽然是特殊类型,但是使用typeof返回的却是object,而函数虽然属于object下的子类型,但是直接返回了function
null的返回值原因可追溯到JavaScript 的设计者 Brendan Eich设计null的时候,当时null表示“无”,但是在Number类型转换的时候,null却可以转换为0,设计者觉得这样不合适,便设计出了undefined。
两者区别在于null表示一个空的对象,Number类型转换为0;而undefined此处无定义的原始值,Number类型转换为NaN
所以,我们使用typeof进行类型判断的时候,最好只是用判断原始类型和undefined,function函数这五个的判断,对于特殊的null和对象,数组是不能判断出来的,可能会造成意料之外的异常判断。
2. instanceof
instanceof 运算符可以区分数组和对象
var o = {};
var a = [];
o instanceof Object // true
a instanceof Array // true
值得注意的是,下面的方式会有所不同,会发生报错(提示:优先级)
[相关原因答案链接]({} instanceof Object - 简书 (jianshu.com))
[] instanceof Array
true
{} instanceof Object
VM923:1 Uncaught SyntaxError: Unexpected token 'instanceof'
另外,补充一个之前没注意到的地方,就是使用字面量创建的变量,例如字符串,数值,布尔值,创建出来的变量,都是变一个primitive值(原生值),一个primitive值不会拥有自己的属性与方法。instanceof方法判断变量是否是这个类的实例,primitive值并不是实例,就会永远返回为false。
[可以在这里找到两者的区别](Javascript中字符串直接量与new String的区别 - 宇泽的博客 (xiaoyuze88.github.io))
"1" instanceof String // false
String(1) instanceof String // false
new String(1) instanceof String // true
"1" == String(1) // true
"1" === String(1) // true
"1" == new String(1) // true
"1" === new String(1) // false
3.Object.prototype.toString
prototype 原型链
Object.prototype.toString.call() call()改变this的指向,对象直接使用原型上的方法
Object.prototype.toString.call(undefined) '[object Undefined]'
Object.prototype.toString.call(null) '[object Null]'
Object.prototype.toString.call(1) '[object Number]'
Object.prototype.toString.call("1") '[object String]'
Object.prototype.toString.call(true) '[object Boolean]'
Object.prototype.toString.call({}) '[object Object]'
Object.prototype.toString.call([]) '[object Array]'
Object.prototype.toString.call(function f(){}) '[object Function]'
Object.prototype.toString.call(function f(){}).split(" ")[1].replace("]","") 可以找到后面的类型进行匹配,然后得到想到的结果