typeof
console.log(typeof('yayu'))//string
console.log(typeof 'yayu')//string
typeof 是一元操作符祈远,放在其單個操作數(shù)的前面凑阶,操作數(shù)可以是任意類型灌砖。返回值為表示操作數(shù)類型的一個字符串错负。
那我們都知道玩敏,在 ES6 前师抄,JavaScript 共六種數(shù)據(jù)類型二拐,分別是:
Undefined、Null混蔼、Boolean、Number珊燎、String惭嚣、Object
然而當我們使用 typeof 對這些數(shù)據(jù)類型的值進行操作的時候,返回的結果卻不是一一對應悔政,分別是:
undefined晚吞、object、boolean谋国、number槽地、string、object
注意以上都是小寫的字符串。Null 和 Object 類型都返回了 object 字符串捌蚊。
盡管不能一一對應集畅,但是 typeof 卻能檢測出函數(shù)類型:
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 吶,這可怎么區(qū)分~ 所以有沒有更好的方法呢句占?
Object.prototype.toString();
當 toString 方法被調用的時候沪摄,下面的步驟會被執(zhí)行:
如果 this 值是 undefined,就返回 [object Undefined]
如果 this 的值是 null纱烘,就返回 [object Null]
讓 O 成為 ToObject(this) 的結果
讓 class 成為 O 的內部屬性 [[Class]] 的值
最后返回由 "[object " 和 class 和 "]" 三個部分組成的字符串
通過規(guī)范杨拐,我們至少知道了調用 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 個资锰。