typeof
console.log(typeof('yayu'))//string
console.log(typeof 'yayu')//string
typeof 是一元操作符,放在其单个操作数的前面,操作数可以是任意类型。返回值为表示操作数类型的一个字符串。
那我们都知道,在 ES6 前,JavaScript 共六种数据类型,分别是:
Undefined、Null、Boolean、Number、String、Object
然而当我们使用 typeof 对这些数据类型的值进行操作的时候,返回的结果却不是一一对应,分别是:
undefined、object、boolean、number、string、object
注意以上都是小写的字符串。Null 和 Object 类型都返回了 object 字符串。
尽管不能一一对应,但是 typeof 却能检测出函数类型:
functiona() {}console.log(typeof a);//function
所以 typeof 能检测出六种类型的值,但是,除此之外 Object 下还有很多细分的类型呐,如 Array、Function、Date、RegExp、Error 等。
如果用 typeof 去检测这些类型,举个例子:
vardate=newDate();varerror=newError();console.log(typeofdate);//objectconsole.log(typeoferror);//object
返回的都是 object 呐,这可怎么区分~ 所以有没有更好的方法呢?
Object.prototype.toString();
当 toString 方法被调用的时候,下面的步骤会被执行:
如果 this 值是 undefined,就返回 [object Undefined]
如果 this 的值是 null,就返回 [object Null]
让 O 成为 ToObject(this) 的结果
让 class 成为 O 的内部属性 [[Class]] 的值
最后返回由 "[object " 和 class 和 "]" 三个部分组成的字符串
通过规范,我们至少知道了调用 Object.prototype.toString 会返回一个由 "[object " 和 class 和 "]" 组成的字符串,而 class 是要判断的对象的内部属性。
让我们写个 demo:
console.log(Object.prototype.toString.call(undefined));//[object undefined]
console.log(Object.prototype.toString.call(null));//[object null]
var date=new Date();
console.log(Object.prototype.toString.call(date)); //[object Date]
正是因为这种特性,我们可以用 Object.prototype.toString 方法识别出更多类型!
那到底能识别多少种类型呢?
至少 12 种!
var number=1;//[object Number]
var string='123';//[object String]
var boolean=true;//[object Boolean]
var und=undefined;//[object Undefined]
var nul=null;//[object Null]
var obj={a:1}//[object Object]
var array=[1,2,3];//[object Array]
var date=new Date();//[object Date]
var error=new Error();//[object Error]
var reg=/a/g;//[object RegExp]
var func=function a(){};//[object Function]
function checkType() {
for(vari=0; i<arguments.length;i++){
console.log(Object.prototype.toString.call(arguments[i]))
}
}
checkType(number,string,boolean,und,nul,obj,array,date,error,reg,func)
除了以上 11 种之外,还有:
console.log(Object.prototype.toString.call(Math));//[object Math]
console.log(Object.prototype.toString.call(JSON));//[object JSON]
除了以上 13 种之外,还有:
functiona() {console.log(Object.prototype.toString.call(arguments));//[object Arguments]}a();
所以我们可以识别至少 14 种类型,当然我们也可以算出来,[[class]] 属性至少有 12 个。
网友评论