1、判断一个值是不是NaN
function isActualNaN(value) {
return value !== value;
}
2、怎么判断一个函数是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]
当时在看这段代码的时候,我就在想为什么要用Object原型上的toString(),而不使用a.toString()
?后来我在控制台打印了一下内容是function(){}
,也就是a方法的代码,上MDN查了一下,发现Function.prototype上也有一 个toString
函数,这个函数会返回当前函数源代码的字符串。
依据js对象查找属性的原则,首先会在对象本身查找这个属性,如果找不到沿着原型链一直往上找,直到找到Object.prototype为止。
以a函数为例,它本身没有toString方法
,于是上原型链上去找,结果在Function.prototype
上找到的这个方法,最后执行的代码实际上是
Function.prototype.toString.call(a)
。
Object.prototype.toString()
返回一个表示对象的字符串,因此得手动调用才能获取到一个对象真正的类型。
到这里我们还可以再扩展一下,用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
打印的结果是true,说明undefined和void 0是一样的,所以当我们想要使用undefined的,完全可以装逼写个void 0 ,然而事实并不是这样!
事实上undefined
并不是一个关键字,它是一个全局变量,这个变量的值是可以修改的,请看下面的代码
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