分析三种判断数组的方法

1. obj instanceof Array

我们都知道instanceof是用来判断对象的类型的,并且所有的对象 instanceof Object结果都是true

  • 内部机制是通过判断对象的原型链中是否能找到同类型的prototype
  • 其原理是一层一层查找__proto__,如果和constructor.prototype的值相等则返回true,否则返回false

根据这一点可得,如果想判断一个对象是否是数组,需要判断这个对象的原型链上是否存在Array的原型:

console.log([] instanceof Array)  // true
console.log([] instanceof Object)  // true

很容易可以发现这个方法有个问题是无法判断对象是属于Object还是Array。

2. Array.isArray( obj )

obj是待检测的对象,如果结果返回Array则整体返回true,否则该表达式返回false。

  • ES5新增的方法
  • Array.isArray()优于instanceof的地方在于:Array.isArray()可以检测iframes

3. Object.prototype.toString.call( obj )

obj是待检测的对象,这种方法能检测出所有的基本数据类型!

QUESTION:为什么要用到call()呢?

每个继承Object的对象都有toString()方法,在toString没有被重写的情况下,执行Object.prototype.toString会返回[object type],其中type是对象的类型。

  • 如果是个基本数据类型调用toString()方法,比如字符串或者是一个数字,那么toString()会直接返回内容的字符串
  • 如果直接调用Object.prototype.toString()的话,默认是指向Object,因此我们这里要调用call()或者apply()来改变toString的指向
        var str = ‘hello‘;
        console.log(str.toString())  // hello
        console.log(Object.prototype.toString(str))  // [object Object]
        console.log(Object.prototype.toString.call(str))  // [object String]

原文地址:https://www.cnblogs.com/ningyn0712/p/11827198.html

时间: 2024-10-11 21:30:24

分析三种判断数组的方法的相关文章

三种收起键盘的方法

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UITextField *textField=[[UITextField alloc]initWithFrame:CGRectMake(10, 100, 200, 200)]; textField.backgroundColor=[UIColor redColor];

窗体间传递数据(跨控件跨类),三种情况与处理方法

环境:Qt5.5 MCVS2013 IDE:QtCreator 范例代码下载地址:http://download.csdn.net/detail/shihoongbo/9134859 发现很多Qt的初学者,经常会在“窗体间如何传递数据”的问题上卡住,而网上通常只是简单描述为使用信号与槽(signal& slot)机制来传递 虽然信号与槽的传递方式确实没错,但是却不一定能适用到全部的情况. 所以,总结了窗体间传递数据的三种情况和对应方法: 模型描述:  已知三个窗体,A为B C的父控件,B与C互为

iOS-开发技巧-三种收起键盘的方法

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UITextField *textField=[[UITextField alloc]initWithFrame:CGRectMake(10, 100, 200, 200)]; textField.backgroundColor=[UIColor redColor];

【转】python 三种遍历list的方法

[转]python 三种遍历list的方法 #!/usr/bin/env python # -*- coding: utf-8 -*- if __name__ == '__main__': list = ['html', 'js', 'css', 'python'] # 方法1 print '遍历列表方法1:' for i in list: print ("序号:%s 值:%s" % (list.index(i) + 1, i)) print '\n遍历列表方法2:' # 方法2 fo

VMware虚拟化三种备份和恢复方法的对比分析

服务器虚拟化,尤其是VMware形式的服务器虚拟化使IT人员获益良多,这么说一点也不为过.据我们所见,服务器虚拟化能解决服务器扩张.资源消耗.服务器扩张.能源消耗.高可用性等相关问题.服务器虚拟化也使我们有更多的时间解决其它的迫切问题,如企业资源预案升级.存储项目再三迁移或者为什么我的青蛙总不回家的问题.尽管VMware提供封装技术和抽象技术,使我们受益匪浅,但数据保护领域发生的基本变革也带来了各项挑战.即使出现了VMware虚拟化,备份人员依然是牢骚最多的IT人员.最大的挑战在于保证数据的一致

三种javascript数组搜索的效率对比

1.背景 在写js的时候经常有查询一个字符串数组中是否存在某个值的需求,可以用for in或者for i++或者直接arr.join(',').indexOf()三种方式..最后一种代码最少因此用的最多,但是效率如何自己也没有把握..所以今天就特地拿来测试一下. 2.测试代码 //构造一个数组 var arr=[]; for(var i=0;i<=1000000;i++){ arr.push('abcdefghigk'+i); } var v='abcdefghigk1000000';//需要比

分布式缓存中三种负载均衡的方法

本文主要是比较三种分布缓存负载均衡的方法,第一种是最简单的将 key的hash值对机器数取模算法,第二种是一致性哈希算法,第三种是淘宝开源的缓存解决方案tair的均衡算法.下面来分析下这三种算法的优缺点. 第一种:传统的数据分布方法,将key的hash值对机器数取模 这个算法的实现非常简单,计算hash(key)/n,n为机器数,得到的值就是该key需要路由到的服务器编号了. 优点:实现简单 缺点:在服务器数量发生变化的时候,缓存会大量失效. 第二种:一致性hash 试想下如果使用传统取模算法.

python里三种等待元素的方法

在做web或app的自动化测试经过会出现找不到元素而报错的情况,很多时候是因为元素 还没有被加载出来,查找的代码就已经被执行了,自然就找不到元素了.那么我可以用等待 元素加载完成后再执行查找元素的code. Python里有三种等待的方式:一. 强制等待 Sleep(54) 这个方法在time模块,使用时通过from time import sleep导入比如: Sleep(10) #表示强行等待10s再执行下一句代码 Driver.find_element_by_xpath("xxxxxx&q

Java Web开发Tomcat中三种部署项目的方法

一般情况下,开发模式下需要配置虚拟主机,自动监听,服务端口,列出目录文件,管理多个站点等功能 准备工作: 软件包:apache-tomcat-6.0.20.rar 将软件包解压至硬盘一分区,进入%TOMCAT_HOME%/conf目录 一:server.xml 配置 1.配置端口,修改server.xml. <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000"