美文网首页
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数据结构和类型检测

    编程语言都具有内建的数据结构,JavaScript 也不例外。JavaScript 是一种弱类型或者说动态语言。它...

  • Js类型相关总结

    Js的基本数据类型 复杂数据类型 类型检测 typeof 检测检测原理是根据变量存储时低位 instanceof检...

  • js类型检测

    比较常见的类型检测 typeof 注意返回的是字符串instantOf 而实际开发的过程中比较好用的是 Objec...

  • JS类型检测

    一、js类型分类 js中数据类型可分为两大类: 原始类型:Number、String、Boolean、Null、U...

  • 【JS】类型检测

    前言 js 中的类型检测也是很重要的一部分,所以说这篇文章我们就来讲一下怎么对 JavaScript 中的基本数据...

  • js类型检测

    常见的检测方法 1、typeof value typeof返回数据类型的字符串例如:"number"、"strin...

  • js 类型检测

    1. instanceof 通常 instanceof 就是用来判断某个实例是否属于某种类型 但是还有一种情况...

  • js类型检测

    检测数据类型: typeof 不安全,检测正则会返回函数作用域 检测是否是某个对象的实例: instanceo...

  • JS 检测类型

    typeof : 检测基本数据类型 typeof是确定一个变量是字符串、数值、布尔值还是undefined的最佳工...

  • JS类型检测

    es5中有5种基本数据类型(undefined null boolean number string),和1中复杂...

网友评论

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

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