前言

对于确定某个对象是不是数组,一直是数组的一个经典问题。本文专门将该问题择出来,介绍什么才是正确的javascript数组检测方式

typeof

首先,使用最常用的类型检测工具——typeof运算符

var arr = [1,2,3];
console.log(typeof arr);//'object'

数组的本质是一种特殊的对象,所以返回'object'。typeof运算符只能用来区分原始类型和对象类型,对于更具体的对象类型是无法鉴别出来的

instanceof

instanceof运算符用来判断一个对象是否是特定构造函数的实例

var arr = [1,2,3];
console.log(arr instanceof Array);//true var str = '123';
console.log(str instanceof Array);//false

看上去很实用。但,这时就引出了数组检测的经典场景——网页中包含多个框架

【1】先创建一个父网页box.html和子网页in.html,其中父网页通过iframe包含子网页

//子网页为空
//父网页
<iframe name="child" src="in.html"></iframe>

【2】测试父网页和子网页的通信,注意一定要在服务器环境下测试

//子网页
var arr = [1,2,3]; //父网页
window.onload = function(){
console.log(child.window.arr);// [1,2,3]
}

【3】测试成功,这时进行数组检测

//子网页
var arr = [1,2,3]; //父网页
function test(arr){
return arr instanceof Array;
}
window.onload = function(){
console.log(child.window.arr);// [1,2,3]
console.log(test(child.window.arr));//false
}

测试后发现,数组检测的结果是false。这是因为网页中包含多个框架,那实际上就存在多个不同的全局环境,从而存在不同版本的Array构造函数。如果从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数

toString

typeof操作符在这里帮不上忙,而instanceof操作符只能用于简单的情形,这时就需要祭出大杀器——toString(),通过引用Object的toString()方法来检查对象的类属性,对数组而言该属性的值总是"Array"

var arr = [1,2,3];
console.log(Object.prototype.toString.call(arr) === '[object Array]');//true

或者

function type(obj){
return Object.prototype.toString.call(obj).slice(8,-1).toLowerCase();
}
var arr = [1,2,3];
console.log(type(arr));//'array'

在多框架环境中测试,同样返回'array'

//子网页
var arr = [1,2,3]; //父网页
function test(arr){
return arr instanceof Array;
}
function type(obj){
return Object.prototype.toString.call(obj).slice(8,-1).toLowerCase();
}
window.onload = function(){
console.log(child.window.arr);// [1,2,3]
console.log(test(child.window.arr));//false
console.log(type(child.window.arr));//'array'
}

isArray

为了让数组检测更方便,ECMAScript5新增了Array.isArray()方法。该方法的目的是最终确定某个值到底是不是数组,而不管它在哪个全局环境中创建的

var arr = [1,2,3];
console.log(Array.isArray([]));//true
console.log(Array.isArray({}));//false
console.log(Array.isArray(arr));//true

[注意]在多框架环境中测试,同样返回true

JavaScript数据类型检测 数组(Array)检测方式的更多相关文章

  1. js常用数据类型(Number,String,undefined,boolean) 引用类型( function,object,null ),其他数据类型( 数组Array,时间Date,正则RegExp ),数组与对象的使用

    js常用数据类型 数字类型 | 字符串类型 | 未定义类型 | 布尔类型 typeof()函数查看变量类型 数字类型  Number var a1 = 10; var a2 = 3.66; conso ...

  2. Javascript基础系列之(四)数据类型 (数组 array)

    字符串,数值,布尔值都属于离散值(scalar),如果某个变量是离散的,那么任何时候它只有一个值. 如果想使用变量存储一组值,就需要使用数组(array). 数组是由多个名称相同的树值构成的集合,集合 ...

  3. JavaScript中的数组Array

    抄自:https://www.jianshu.com/p/7e160067a06c js中数组的方法种类众多,有ES5之前版本中存在的,ES5新增,ES6新增等:并且数组的方法还有原型方法和从obje ...

  4. JavaScript权威指南--数组Array

    什么是数组 数组是值的有序集合.每一个值叫做元素,每一个元素在数组中有一个位置,用数字表示,称为索引.js数组是无类型的.动态的,也可能是稀疏的.每个数组都有length属性.数组最大能容纳42949 ...

  5. Javascript 学习之数组 Array

    数组在Javascript中占有很重要的地位.任何控件开发离不开数组的使用. 构造函数 new Array( ) new Array(size) new Array(element0, element ...

  6. JavaScript中的数组Array方法

    push(),pop()方法 push(),pop()方法也叫栈方法,push()可以理解成,向末尾推入,而pop()恰好相反,可以理解成从末尾移除(取得). var nums=[1,2,3,4]; ...

  7. javascript类型系统——数组array

    × 目录 [1]创建 [2]本质 [3]稀疏[4]长度[5]遍历[6]类数组 前面的话 除了对象之外,数组Array类型可能是javascript中最常用的类型了.而且,javascript中的数组与 ...

  8. JS数组array常用方法

    JS数组array常用方法 1.检测数组 1)检测对象是否为数组,使用instanceof 操作符 if(value instanceof Array) { //对数组执行某些操作 } 2)获取对象的 ...

  9. 高程(三)----数组Array

      一.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上 ...

随机推荐

  1. lua_local变量在new时不会被清空

    前言 我的运行环境 Lua5.3 按照我们以往的Java或C#编程经验,如果一个class被new,那么这个class中所有成员变量的值都是默值或是构造函数中赋的值,但在Lua中的local变量却并不 ...

  2. <input>内容居中、去框、不可编辑等

    <input class="i" type="text" value="Sin(x)" readonly="readonly ...

  3. Azure存储账户的日志分析方法

    1.首先确认日志功能是否开启(日志文件根据存储账户的类型,按使用量收费 . 2.在存储账户-Usage(classic)-Metrics中查看突出流量的时间: 3.在Explorer中下载对应时间点的 ...

  4. [十二省联考2019]D2T2春节十二响

    嘟嘟嘟 这题真没想到这么简单-- 首先有60分大礼:\(O(n ^ 2logn)\)贪心.(我也不知道为啥就是对的) 然后又送15分链:维护两个堆,每次去堆顶的最大值. 这时候得到75分已经很开心了, ...

  5. FB商务管理平台(Business Manager) (2)

    Business Manager 商务管理平台(以下简称BM)API 一站式管理广告帐户.主页及相关的工作人员. BM功能结构(其中:账户下的节点属于市场营销API) API / SDK FB提供了多 ...

  6. BigDecimal比较大小,BigDecimal判断是否为0

    原文:https://blog.csdn.net/qq_34926773/article/details/83419004 BigDecimal类型的数据,需要比较大小:声明BigDescimal: ...

  7. Graphic

    画圆操作 package demo1; import java.awt.Graphics; import javax.swing.*; import javax.swing.JPanel; publi ...

  8. VS2010动态链接库的生成及调用(C++)

    一.动态链接库的生成 首先利用VS2010新建一个空的工程或者win32工程 2.在工程中添加头文件和源文件 3.工程属性配置 3.1 可以在解决方案目录下新建以下几个文件夹 bin (用于存放Rel ...

  9. centos 6.8 配置 Redis3.2.5

    配置Redis3.2.5 与 php-redis 一.配置Redis 1.下载Redis3.2.5安装包 [root@zhangsan /] wget http://download.redis.io ...

  10. python3.6新特性

    print(f'{6:^30}') print('\n'.join([' '.join([f'{i}*{j}={i*j:2d}' for j in range(1,i+1)]) for i in ra ...