• Js 类型方面的神坑


    你有没有遇见过本来好好的一个数组结果 typeof 出来是个 object 的情况,你有没有遇到过非要写个 typeof x === "undefined" 判断未赋值的情况...

    人生呀,就是这么丰富多彩,喜怒无常!

    (在此暂不探究 instanceof 判断类型 de 这种方法,因为博主是傻逼...觉得我写得不好可以看看 此文,关于 js 类型)

    先来看几个好玩的

    typeof new String("x");   // object
    "x" == new String("x");   // true
    

    明明一个是 object 一个是 string,怎么就 true 了。(一脸懵逼 ರ_ರ)

    当然 === 的时候就是 false 了,所以周遭才会推荐使用 === 而不是 == 的说

    [] == new Array();    // false
    {} == new Object();   // false
    

    等等,结果和类型都一样,怎么和上面的栗子又不一样了呢,(二脸懵逼 ರ_ರ)

    神奇的 undefined 要来了...

    var x;                       // undefined
    typeof x;                    // "undefined"
    x == null;                   // true
    y; y == undefined; y == null // 报错
    typeof y;                    // "undefined"
    var a = undefined;
    typeof a;                    // "undefined"
    

    基本可以总结为,1. typeof 出来的是个字符串; 2. 未赋值的变量是可以 == null 的(当然 === 不行); 3. 未定义的变量会报错,但 typeof 该变量显示 "undefined"。

    这样来看,那就很模糊了,特别是在我需要知道它是未定义(那就 var 一个),还是未赋值(如果 var 了那就麻烦大了)。所以咱还是先把所有变量提前定义好吧,别无它法。

    还有一个神奇的 null...

    var x = null;
    x == undefined;            // true
    typeof x;                  // "object"
    

    同样的,null == undefined 可以(=== 不行);typeof null 却是个 "object"。(百脸懵逼 ರ_ರ)

    ------------------------------------------------------------------------------------------------------------------------  分割线

    骚年,你渴望力量吗,来试下公司老大哥写的这种方法吧

    function TypeOf(obj) {
        if (obj == undefined) { return "undefined"; }
        var r = ["Object","Array","Function","String","Number","Boolean","RegExp","Date","Error"];
        for(var i in r) {
            if (!(obj.constructor.toString().indexOf(r[i]) < 0)) return r[i].toLowerCase();
        }
    }
    

    虽然不能区分 null 和 undefined,但这样我已经知足了,毕竟真要区分了其实反而麻烦了,

    倒是可以在 obj == "undefined" 的判断中再加上一条 obj === void 0 来确定这是 undefined 而不是 null。

    上述程序的具体使用,你试试就知道了。

    此外,插播一个我没搞懂的问题

    function typeOf(obj) {
        if (obj == undefined) {return "undefined";}
        if (!(obj.constructor.toString().indexOf("Object") < 0)) {
            return "object";
        } else if (!(obj.constructor.toString().indexOf("Array") < 0)) {
            return "array";
        } else if (!(obj.constructor.toString().indexOf("Function") < 0)) {
            return "function";
        } else if (!(obj.constructor.toString().indexOf("String") < 0)) {
            return "string";
        } else if (!(obj.constructor.toString().indexOf("Number") < 0)) {
            return "number";
        } else if (!(obj.constructor.toString().indexOf("Boolean") < 0)) {
            return "boolean";
        } else if (!(obj.constructor.toString().indexOf("RegExp") < 0)) {
            return "regexp";
        } else if (!(obj.constructor.toString().indexOf("Date") < 0)) {
            return "date";
        } else if (!(obj.constructor.toString().indexOf("Function") < 0)) {
            return "function";
        }
    }
    

    测试性能发现,后者比前者还要慢很多,表示不太明白,理论上前者比后者还多一个循环呀,还请各位大神指教

  • 相关阅读:
    页面返回劫持js代码
    js向input赋值
    JavaScript中统计Textarea字数并提示还能输入的字符
    dedecms 列表页调用文章列表时对有无缩略图进行判断调用
    常用mate标签-常用mate标签
    dedecms修改arc.listview.class.php实现列表页支持mip
    extend简单用法
    splice从数组中删除指定定数据
    递归【输入一个日期】返回【前12个月每月最后一天】
    三步把asp.net core 3.1应用部署到centos7
  • 原文地址:https://www.cnblogs.com/foreverZ/p/5889725.html
Copyright © 2020-2023  润新知