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

如何判断一个对象是数组还是对象

一、typeof判断数据类型(判断数组跟对象都返回object)

console.log(typeof null); // "object"
console.log(typeof function () {
  return 1;
}); // "function"
console.log(typeof 1); // "number"
console.log(typeof a); // "undefined"
console.log(typeof undefined); // "undefined"
console.log(typeof []); // "object" 
console.log(typeof NaN); // "number" 
console.log(typeof {}); // "object" 

二、instanceof判断对象的原型链是否是指向构造函数的prototype

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

三、对象的constructor属性

var arr = [1,2,3,1];
  console.log(arr.constructor === Array)//true

四、Object.prototype.toString.call(arr) 利用对象的toString可以准确判断是什么类型,call()改变this指向,这里是借用Object的方法,然后有人可能会问为什么不直接用arr.toString而要借用Object的方法,

console.log(Object.prototype.toString.call(“jerry”));//[object String]
console.log(Object.prototype.toString.call(12));//[object Number]
console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call({name: “jerry”}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(new Date));//[object Date]
console.log(Object.prototype.toString.call(/\d/));//[object RegExp]
console.log(Object.prototype.toString.call(new Person));//[object Object]

直接用toString
console.log(“jerry”.toString());//jerry
console.log((1).toString());//1
console.log([1,2].toString());//1,2
console.log(new Date().toString());
console.log(function(){}.toString());//function (){}
console.log(null.toString());//error
console.log(undefined.toString());//error
  因为toString为Object原型上的方法,而Array、Function都是Object的实例,实例重新改写了原型上的toString方法,不同的对象调用toString方法,调用的是改写之后的方法
  (转成各种类型的字符串),而不会调用Object原型上的toString()方法,因此直接调用不能判断对象类型

var arr=[1,2,3];
console.log(Array.prototype.hasOwnProperty(“toString”));//true
console.log(arr.toString());//1,2,3
delete Array.prototype.toString;//delete操作符可以删除实例属性
console.log(Array.prototype.hasOwnProperty(“toString”));//false
console.log(arr.toString());//"[object Array]"
  我们可以看到,删除实例上的toString方法后调用的是Object原型上的toString()方法,返回对象类型

五、es6的方法——Array.isArray()也是推荐的方法

Array.isArray([]) //true

相关文章:

  • 性能测试相关(TPS/RT/PV等)
  • 文字排版--删除线(text-decoration:line-through)
  • 前端浏览器的兼容性
  • Android Fragment问题汇总
  • Scala中List、Map、Set各类型操作汇总
  • hash模式 和 history模式之间的区别
  • 镜像源的相关知识
  • javascript(四) var关键字/注释/noscript
  • 新手来学TS+Vue吧,我也是搞了好多。第一次执行vscode编译ts可能会报错,有解决办法。
  • Java8新特性 1——利用流和Lambda表达式操作集合
  • VUE2.0 创建项目步骤
  • 用 Swift 编写面向协议的视图
  • 当你vue创建项目创建不成功,报错Failed to get response from htttps://registry.npm.taobao.org/vue-cli-version-m,解决办法
  • iptables基础原理
  • 冲刺第二阶段第十天
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【Leetcode】104. 二叉树的最大深度
  • Angular 响应式表单 基础例子
  • classpath对获取配置文件的影响
  • CSS盒模型深入
  • golang 发送GET和POST示例
  • HTTP请求重发
  • JAVA 学习IO流
  • JS 面试题总结
  • miaov-React 最佳入门
  • Phpstorm怎样批量删除空行?
  • React16时代,该用什么姿势写 React ?
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • STAR法则
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 关于 Cirru Editor 存储格式
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 追踪解析 FutureTask 源码
  • hi-nginx-1.3.4编译安装
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​ArcGIS Pro 如何批量删除字段
  • ​iOS实时查看App运行日志
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • $NOIp2018$劝退记
  • (NSDate) 时间 (time )比较
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (力扣)循环队列的实现与详解(C语言)
  • (三)elasticsearch 源码之启动流程分析
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (四)Android布局类型(线性布局LinearLayout)
  • .NET 5种线程安全集合
  • .net core使用ef 6
  • .NET 依赖注入和配置系统
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET序列化 serializable,反序列化
  • .考试倒计时43天!来提分啦!
  • /run/containerd/containerd.sock connect: connection refused
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题