美文网首页
JS数据结构和类型检测

JS数据结构和类型检测

作者: 胡小胖_ | 来源:发表于2017-07-27 20:58 被阅读0次

    编程语言都具有内建的数据结构,JavaScript 也不例外。JavaScript 是一种弱类型或者说动态语言。它不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。这点事非常关键的,可以说JS 灵活,没有这么多限制,但是,这常常是BUG出现的原因所在。
    因此,JS 变量的数据类型检测就是十分重要的。
    在最新的 ECMAScript 标准中定义了 7 种数据类型:

    • 6 种基本数据类型:Boolean、 Null、 Undefined、 Number、 String、 Symbol(ECMAScript 6 新定义)
    • 1 种复杂数据类型:Object

    先来看 6 种基本数据类型:

    • Undefined
      Undefined 类型只有一个值,就是特殊的 Undefined。一个没有被赋值的变量会有个默认值 undefined。
    var message;
    typeof message; // "undefined"
    
    • Null
      Null 类型是第一个只有只一个值得数据类型,这是特殊值就是null。null值表示一个空对象指针。
    var message = null;
    typeof message; // "object"
    
    • Boolean
      Boolean 表示一个逻辑实体,可以有两个值:true 和 false。
    var found = true;
    var lost = false;
    typeof found; // "boolean"
    typeof lost; // "boolean"
    
    • Number
      根据 ECMAScript 标准,JavaScript 中只有一种数字类型:基于 IEEE 754 标准的双精度 64 位二进制格式的值(-(263 -1) 到 263 -1)。它并没有为整数给出一种特定的类型。除了能够表示浮点数外,还有一些带符号的值:+Infinity,-Infinity 和 NaN (非数值,Not-a-Number)。
    var num1 = 5;
    var num2 = NaN;
    var num3 = +Infinity;
    typeof num1; // "number"
    typeof num2; // "number"
    typeof num3; // "number"
    
    • String
      String 类型用于表示由零或多个 16 位 Unicode 字符组成的字符序列,即字符串。
    var name = "jack"
    typeof name; // "string"
    
    • Symbol
      符号(Symbols)是ECMAScript 第6版新定义的。符号类型是唯一的并且是不可修改的, 并且也可以用来作为Object的key的值。
    var sym = Symbol("foo");
    typeof sym; // "symbol"
    

    复杂数据类型:
    ECMAScript 中的对象就是一组数据和功能的集合。

    var arr = [1, 2, 3];
    var o = new Object();
    var reg = /\d/g;
    var a = {};
    typeof arr; // "object"
    typeof o; // "object"
    typeof reg; // "object"
    typeof a; // "object"
    

    因此,可以看出,我们在判断基本数据类型时,可以用 typeof 检测出来的,但是对于复杂的数据类型 typeof 就有其局限性了,它对于复杂数据类型总是返回 “object”。
    在对复杂数据类型的检测中,我们就应该用其他方法来判断,这就是 instanceof/constructor
    使用 instanceof/constructor 可以检测数组和正则表达式。

    var arr = [1, 2, 3];
    var reg = /\d/g;
    arr instanceof Array; // true;
    reg instanceof RegExp; // true;
    arr.constructor == Array; // true;
    reg.constructor == RegExp; // true;
    

    严谨的判断方法:

    function isArray(object){
    return object && typeof object==='object' &&
    Array == object.constructor;
    }
    

    但是,instanceof/constructor 也有其局限性:
    被判断的 Array 必须在当前页面声明!
    而在父页面框架中引用子页面,然后在子页面中声明一个 array,并赋值给父页面变量,这时检测返回值就是false。
    因此,还需要更好的方法来进行检测,查阅书籍和网上资料,还用两种方法:

    function isArray(object){
    return object && typeof object==='object' &&
    typeof object.length==='number' &&
    typeof object.splice==='function' &&
    //判断length属性是否是可枚举的 对于数组 将得false 
    !(object.propertyIsEnumerable('length'));
    }
    
    function isArray(o) {
    return Object.prototype.toString.call(o) === '[object Array]';
    }
    

    参考资料
    《JavaScript 高级程序设计》(第三版)
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures

    相关文章

      网友评论

          本文标题:JS数据结构和类型检测

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