当前位置: 首页 > news >正文

js中如何判断引用值为数组(几种不同方式的详解)

回顾

  • 在JavaScript中,数据属于Object类型,也属于引用数据类型。我们可以通过typeof来判断该数据是否为引用类型,但无法判断其为数组。
  • 实验数据:
		var a = [];
        var b = {};

依据原型判断

  1. 通过原型上的构造器 constructor 判断
    说明: 每一个实例对象一个来自原型上的 constructor 属性,它指向构造函数,即存放着创建当前对象的构造函数
        console.log(a.constructor)  // ƒ Array() { [native code] }
        console.log(b.constructor)  // ƒ Object() { [native code] }
        console.log(a.constructor === Array)  // true
        console.log(b.constructor === Array)  // false
        console.log(a.constructor === Object)  // false
        console.log(b.constructor === Object)  // true
  1. 通过 instanceof 判断
    说明:instanceof 运算符可以用来判断某个构造函数的prototype属性所指向的对象是否存在于另外一个要检测对象的原型链上
    我们发现数组在进行 Array 和 Object 的判断时都为 true ,这是因为 Object 在原型链的上层,所以都会返回 true
		console.log(a instanceof Array)   // true
        console.log(b instanceof Array)   // false
        console.log(a instanceof Object)  // true
        console.log(b instanceof Object)  // true

        console.log([] instanceof Array)  // true
        console.log([] instanceof Object) // true
        console.log({} instanceof Array)  // false
        console.log({} instanceof Object) // true
  1. 通过 ——proto——
    说明:每一个对象都有__proto__属性,指向创建该对象的构造函数的原型,但在ES6后,该写法不被推荐使用,所以我们可以用 Object.getPrototypeOf() 方法返回指定对象的原型
		console.log(a.__proto__ === Array.prototype)  // true
        console.log(Object.getPrototypeOf(a) === Array.prototype) // true
  1. 通过 Array 的原型链
    说明:通过Array原型链上的isPrototypeOf 该方法用于测试一个对象是否在另一个对象的原型链上
 		console.log(Array.prototype.isPrototypeOf(a)) // true
        console.log(Array.prototype.isPrototypeOf(b)) // false

通过重写toString判断

说明:toString 是原型链顶端的一个方法,我们可以通过改变this指向a,重写toString方法,相当于如下

 		// Object.prototype = {
        //     toString: function() {
        //         a.toString();
        //     }
        // }

实现:

        var str = Object.prototype.toString.call(a);
        console.log(str);                   // [object Array]tips
        var tips = '[object Array]';        // 缓存优化
        if( str === tips ) {
            console.log('数组')
        }else {
            console.log('非数组')
        }                                   // 数组

        var str2 = Object.prototype.toString.call(b);
        console.log(str2);                  // [object Array]
        var tips = '[object Array]';        // 缓存优化
        if( str2 === tips ) {
            console.log('数组')
        }else {
            console.log('非数组')
        }                                   // 非数组

ES6新增方法isArray

		console.log(Array.isArray(a)) // true
        console.log(Array.isArray(b)) // false

相关文章:

  • 项目代码重用
  • js中数组去重的几种实现方式(区别)
  • java创建文件和目录
  • JS For循环中嵌套setTimeout()方法的理解
  • ubuntu下zabbix服务器监控工具部署
  • 前端性能优化-图片
  • MapString, String循环遍历的方法
  • 快速掌握js中闭包的理解与应用(面试中如何回答闭包)
  • inkspace 0.92 安装 总结
  • js中原型,原型链的理解
  • CSS水平、垂直居中问题.md
  • Vue3写法总结
  • [python] os.path说明
  • vue-cli3+ 打包至非根目录静态资源(图片,字体文件)路径加载错误,导致不显示,丢失
  • 讲座:Influence maximization on big social graph
  • Android 架构优化~MVP 架构改造
  • Docker 笔记(2):Dockerfile
  • eclipse(luna)创建web工程
  • HTML5新特性总结
  • Mybatis初体验
  • SegmentFault 2015 Top Rank
  • 电商搜索引擎的架构设计和性能优化
  • 基于遗传算法的优化问题求解
  • 前端知识点整理(待续)
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 微服务核心架构梳理
  • 智能合约Solidity教程-事件和日志(一)
  • 阿里云移动端播放器高级功能介绍
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​决定德拉瓦州地区版图的关键历史事件
  • #pragma multi_compile #pragma shader_feature
  • $NOIp2018$劝退记
  • (04)odoo视图操作
  • (1)(1.13) SiK无线电高级配置(六)
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二)windows配置JDK环境
  • (接口封装)
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (三)模仿学习-Action数据的模仿
  • (三分钟)速览传统边缘检测算子
  • (四)JPA - JQPL 实现增删改查
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • .net core 连接数据库,通过数据库生成Modell
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .Net 知识杂记
  • .netcore 获取appsettings
  • .net连接MySQL的方法
  • @synthesize和@dynamic分别有什么作用?
  • @Validated和@Valid校验参数区别
  • [ 第一章] JavaScript 简史
  • [22]. 括号生成
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)