1、判斷一個值是不是NaN
function isActualNaN(value) {
return value !== value;
}
2、怎么判斷一個函數(shù)是function、generator function、async function
var toStr = Object.prototype.toString;
var a=function(){};
var b=function *(){};
var c=async function(){};
console.log(toStr.call(a))
//[object Function]
console.log(toStr.call(b))
//[object GeneratorFunction]
console.log(toStr.call(c))
//[object AsyncFunction]
當(dāng)時在看這段代碼的時候,我就在想為什么要用Object原型上的toString(),而不使用a.toString()?后來我在控制臺打印了一下內(nèi)容是function(){},也就是a方法的代碼,上MDN查了一下,發(fā)現(xiàn)Function.prototype上也有一 個toString函數(shù),這個函數(shù)會返回當(dāng)前函數(shù)源代碼的字符串。
依據(jù)js對象查找屬性的原則,首先會在對象本身查找這個屬性,如果找不到沿著原型鏈一直往上找,直到找到Object.prototype為止。
以a函數(shù)為例,它本身沒有toString方法,于是上原型鏈上去找,結(jié)果在Function.prototype上找到的這個方法,最后執(zhí)行的代碼實際上是
Function.prototype.toString.call(a)。
Object.prototype.toString()返回一個表示對象的字符串,因此得手動調(diào)用才能獲取到一個對象真正的類型。
到這里我們還可以再擴展一下,用Object.prototype.toString()做對象的類型檢測
console.log(toStr.call("eee"));
//[object String]
console.log(toStr.call(1));
//[object Number]
console.log(toStr.call(Math));
//[object Math]
console.log(toStr.call([1,2,3]));
//[object Array]
console.log(toStr.call(null));
//[object Null]
console.log(toStr.call(undefined));
//[object Undefined]
3、void 0 是什么?為什么要用void 0
console.log(void 0 ===undefined);
//true
打印的結(jié)果是true,說明undefined和void 0是一樣的,所以當(dāng)我們想要使用undefined的,完全可以裝逼寫個void 0 ,然而事實并不是這樣!
事實上undefined并不是一個關(guān)鍵字,它是一個全局變量,這個變量的值是可以修改的,請看下面的代碼
console.log(void 0 === undefined);
//true
var undefined = 1;
console.log(void 0 === undefined);
//false
undefined被賦值了,我們無法再用if(value === undefined)去判斷一個值是不是zhenzheng的undefined,所以為了安全起見,我們可以使用void 0,在void運算符中,不能被javascript重寫并且始終返回沒有被賦值的undefined