美文网首页
javascript冷门小知识

javascript冷门小知识

作者: 花式开心 | 来源:发表于2018-07-28 15:52 被阅读18次

    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

    相关文章

      网友评论

          本文标题:javascript冷门小知识

          本文链接:https://www.haomeiwen.com/subject/keuomftx.html