怎么判断一个数组是数组呢?

其实这个也是一个常考的题目。依稀记得我为数不多的面试经过中都被问道过。

方案一: instanceof

variable instanceof Array

解决思路:

使用类型判断所给的方法 instanceof  进行判断。

此方法返回一个布尔值,能够精确判断一个对象的类型。

方案二:原型prototype + toString  call

Object.prototype.toString.call(variable).indexOf('Array') !== -1;

因为用了toString方法, 返回值是一个字符串,还需要第二层判断,看字符串中是否有‘Array’这个关键字:

这个字符串中有Array关键字的返回了数字8(就是Array这个字符在整个"[object Array]"中出现的下标数)。

如果变量对象不是一个纯数组,那么返回的数字就是-1。因为indexOf方法在字符串中找不到指定字符就会返回-1.

所以最后还需要通过比对数值是否等于-1就能判断是否是数组类型:

true就是了。

这里可能难以理解的是call方法,毕竟前边toString他们都各司其职。

做个试验:

用toString获取每个对象的类型:

字符串:

数字:

boolean

数组:

函数:

对象:

首先我们打印出来对象原型上的toString方法返回什么:

这里涉及到Object.prototype.toString()的原理。由于我还学的不深入,就不做总结了,

具体可以看这篇总结的不错:【传送门

大致意思有:

调用toString时会将this对象的[[class]]属性值拿到,而这个属性值就是该对象的真实类型。

[[class]]:一个内部属性,字符串值,表示对象的类型。只有toString这一个方法可以拿到。

而在es5中,toString获取[[class]]值时需要经过这几个比较特殊的步骤:

总结:

调用toString时会将this对象的[[class]]属性值拿到,而这个属性值就是该对象的真实类型。

又因为call能够显示的修改this指针的对象,所以用call将Object内部的this对象指向我们要检测的变量自身。

从而再通过toString拿到变量的[[class]]值。

方案三:原型prototype + isPrototypeOf()方法

Array.prototype.isPrototypeOf(variable) 

isPrototypeOf() 函数 : 用于指示对象是否存在于一个对象的原型链中。如果存在返回true,反之返回false。该方法属Object对象,由于所有的对象都继承了Object的对象实例,因此几乎所有的实例对象都可以使用该方法。

所以在上边代码公式中,如果variable的原型链中存在Array对象,就会返回true,也就说明variable是数组类型。

isPrototypeOf的字面意思也就是a是不是b的原型。

看上图就知道了,Array就是变量m的原型。所以用这个方法就能判断出来。

对比一个类型为“纯”Object的变量打印出来的信息:

就更加一目了然为什么用这个方法就可以判断出来了吧!

方案四:构造函数 constructor

variable.constructor.toString().indexOf("Array") !== -1

这个一图胜千言:

对比变量a的打印信息,可以看出来,一个数组类型的实例,其原型__proto__.constructor右边是Array关键字。

所以我们可以用这个关键点拿到也给字符串:

然后用方案二的原理差不多的,我们查找字符串中Array关键字的位置是否等于-1。即能得出变量是否为数组类型得了。

方案五:数组方法 isArray()

Array.isArray(variable);

思路:

js的一个方法,专门用来测试对象是否是Array类型

在方案一、二、三的基础上,可以总结整理这个isArray的内部原理

然后把方案1234自己封装成isArray()函数。(待做)

2018-11-19  21:06:57

js -【 数组】判断一个变量是数组类型的几种方法的更多相关文章

  1. 如何判断一个变量是数组Array类型

    在很多时候,我们都需要对一个变量进行数组类型的判断.JavaScript中如何判断一个变量是数组Array类型呢?我最近研究了一下,并分享给大家,希望能对大家有所帮助. JavaScript中检测对象 ...

  2. Java判断一个字符是否是数字的几种方法的代码

    在工作期间,将写内容过程经常用到的一些内容段做个记录,下面内容是关于Java判断一个字符是否是数字的几种方法的内容,希望能对码农们有好处. public class Test{ public stat ...

  3. Javascript如何判断一个变量是数字类型?

    isNaN()不能判断一个变量是否为数字类型,isNaN(123)值为false,isNaN('123')值也为false.isNaN() 的实际作用跟它的名字isNaN并不一致,isNaN(NaN) ...

  4. js判断一个变量是数组还是对象

    判断变量是数组还是对象,使用Object.prototype.toString.call(),兼容性好,切勿使用typeof来判断对象或者数组,因为typeof得到的都是object: functio ...

  5. JavaScript中判断对象是否属于Array类型的4种方法及其背后的原理与局限性

    前言 毫无疑问,Array.isArray是现如今JavaScript中判断对象是否属于Array类型的首选,但是我认为了解本文其余的方法及其背后的原理与局限性也是很有必要的,因为在JavaScrip ...

  6. js如何判断一个变量是否是数组?

    //方法一 var arr = [1,2,3]; var obj = {'name': 'xiaoming','age': 19}; if(arr.constructor == Array){ ale ...

  7. js如何判断一个值是不是Array类型

    本来判断一个对象类型用typeof是最好的,不过对于Array类型是不适用的可以使用 instanceof操作符var arrayStr=new Array("1","2 ...

  8. 判断一个字符是否为数字的两种方法(C/C++)

    在平时,我们经常遇见判断字符是否为数字这种题目,虽然感觉还是很简单,不过我是个更喜欢用函数的人,因为我觉得这样更便捷,所以我更推荐第二种方式. 1.直接判断 #include <stdio.h& ...

  9. 用javascript判断一个html元素是否存在的五种方法:

    1. 判断表单元素是否存在(一) if("periodPerMonth" in document.theForm){ return true; }else{ return fals ...

随机推荐

  1. Revit API创建标注NewTag

    start ;             )                 {                     eId = item;                 }            ...

  2. 常见爬虫/BOT 对抗技术简介(二)

    上一篇文章分别从网络协议,Robots文件,JS渲染,行为分析等多方面讲了些“反爬虫”,“反-反爬虫”技术. 点击查看:<常见爬虫/BOT 对抗技术简介(一)> 本文将主要介绍各种IP地址 ...

  3. LINUX 修改SSH默认22端口的方法

    首先修改配置文件 vi /etc/ssh/sshd_config 找到#Port 22一段,这里是标识默认使用22端口,修改为如下: Port 22 Port 50000 然后保存退出 执行/etc/ ...

  4. Python中多进程的使用

    进程:程序的一次执行(程序载入内存,系统分配资源运行).每个进程有自己的内存空间,数据栈等,进程之间可以进行通讯,但是不能共享信息. 线程:所有的线程运行在同一个进程中,共享相同的运行环境.每个独立的 ...

  5. 卡尔曼滤波(Kalman Filter) ZZ

    一.引言 以下我们引用文献[1]中的一段话作为本文的開始: 想象你在黄昏时分看着一仅仅小鸟飞行穿过浓密的丛林.你仅仅能隐隐约约.断断续续地瞥见小鸟运动的闪现.你试图努力地猜測小鸟在哪里以及下一时刻它会 ...

  6. 版本控制-GitHub

    前面几篇文章,我们介绍了Git的基本用法及Git服务器的搭建,本篇文章来学习一下如何使用GitHub.GitHub是开源的代码库以及版本控制库,是目前使用网络上使用最为广泛的服务,GitHub可以托管 ...

  7. 解决IDEA授权报错

    今天打开电脑,猛然发现IDEA授权失效,然后重新用账号密码登陆,发现被拒绝,各种百度百思不得其解,抱着试试的态度,点击了重置密码 https://account.jetbrains.com/forgo ...

  8. python emoji 表情过滤

    http://my.oschina.net/jiemachina/blog/189460 注意替换的这些emoji是标准的表情字符,每个表情本来是2个字节,替换成字符串后,每个表情就变成12个字符了, ...

  9. 疯狂Java学习笔记(75)-----------NIO.2第一篇

    Java 7引入了NIO.2.NIO.2是继承自NIO框架,并添加了新的功能(比如:处理软链接和硬链接的功能).这篇帖子包含三个部分,我将使用NIO.2的一些演示样例.由此向大家演示NIO.2的基本用 ...

  10. android makefile文件批量拷贝文件的方法

    该方法是shell 和makefile组合使用 wallpapers := $(shell ls packages/apps/hyst_apps/NewBingoLauncher_C/default_ ...