资讯专栏INFORMATION COLUMN

判断对象是否为一个数组

苏丹 / 591人阅读

摘要:判断一个对象是不是数组类型少部分人可能首先会想到可以看出是可以判断出基本数据类型的,函数也能判断出来,但是对象数组日期都会返回这样就根本无法判断一个对象是不是数组类型。

判断一个对象是不是数组类型 typeof

少部分人可能首先会想到 typeof

var n = 3,
  b = true,
  s = "Hello",
  x = null,
  y,
  obj1 = function() {},
  obj2 = {},
  obj3 = [],
  obj4 = new Date();
console.log(
  typeof n, //number
  typeof b, //boolean
  typeof s, //string
  typeof x, //object
  typeof y, //undefined
  typeof obj1, //function
  typeof obj2, //object
  typeof obj3, //object
  typeof obj4 //object
);

可以看出 typeof 是可以判断出基本数据类型的,函数也能判断出来,但是对象、数组、日期都会返回 object,这样就根本无法判断一个对象是不是数组类型。所以 typeof 宣告无能为力

判断其父级原型对象
var obj1 = {},
  obj2 = [1, 2, 3],
  obj3 = new Date();

console.log(obj1.__proto__ == Array.prototype); //false
console.log(obj2.__proto__ == Array.prototype); //true
console.log(obj3.__proto__ == Array.prototype); //false

但是 __proto__ 是内部属性,本不应该被访问到,我们可以用 Object.getPrototypeOf(obj) 方法来代替他,虽然这个方法其实内部原理也是他,但是还是有不同的。

console.log(Object.getPrototypeOf(obj1) == Array.prototype); //false
console.log(Object.getPrototypeOf(obj2) == Array.prototype); //true
console.log(Object.getPrototypeOf(obj3) == Array.prototype); //false
判断其构造函数

obj instanceof Array 判断 obj 是不是被构造函数 Array 创造出来的

console.log(obj1 instanceof Array); //false
console.log(obj2 instanceof Array); //true
console.log(obj3 instanceof Array);    //false

instanceof 不仅判断直接父类型,而是所有在原型链上的类型,都返回 true ,所以如果你创建一个对象但是把他的 __proto__ 指向 Array 的原型,然后判断其类型,也会返回 true

obj1.__proto__ = Array.prototype;
console.log(obj1 instanceof Array); //true
判断对象内部的 class 属性

每个对象内部,都有一个隐藏的 class 属性,记录该对象创建时的数据类型 class 属性不会随继承关系的改变而改变。(就相当于查人的 DNA 了吧,小样还想伪装。)

这里有一个问题:内置类型的原型对象中几乎都重写了新的 toString(),只有最顶层的 toString() 才能输出对象的 class 属性值,

因此我们可以用 call 来使用最牛皮的身份鉴别

console.log(
  Object.prototype.toString.call(obj1) == /*[object Object]*/ "[object Array]"
); //false
console.log(
  Object.prototype.toString.call(obj2) == /*[object Array]*/ "[object Array]"
); //true
console.log(
  Object.prototype.toString.call(obj3) == /*[object Date]*/ "[object Array]"
); //false
Array.isArray

Array.isArray 也可以弥补 typeof 的不足

Array.isArray(obj1); //false
Array.isArray(obj2); //true
Array.isArray(obj3); //false

更多文章来自我的 github ,求个 star 鼓励一下吧!

https://github.com/MLuminary/Blog/issues

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94849.html

相关文章

  • xe-utils 函数库,javascript 工具类

    摘要:最新版本见,点击查看历史版本提供一套实用的基础函数任意格式的日期转换函数,浏览器相关操作函数等全局参数设置默认全局参数基础函数判断是否非数值判断是否为有限数值判断判断是否数组判断是否小数判断是否整数判断是否对象判断是否对象判断是否对象判断是 最新版本见 Github,点击查看历史版本 XEUtils 提供一套实用的基础函数、任意格式的日期转换函数,浏览器相关操作函数等... API ...

    DrizzleX 评论0 收藏0
  • js基础(一):判断类型

    摘要:注意类继承时的问题继承自方法中对象直接继承和间接继承的都会报解决的问题通常是让对象的手动指向自己将自己的类赋值给对象的属性基类不会报了原博参考,,,,判断为 js基础(二):构造函数与原型 一、常见实例 判断是否为对象 let obj = {} // 1.Object.prototype.toString if (Object.prototype.toString.call(obj...

    hightopo 评论0 收藏0
  • 盘点Vue源码中用到的工具函数

    摘要:用做缓存的高阶函数用高阶函数的好处是无需暴露不同要求的缓存对象在外面,形成一个闭包。函数内部调用函数得到操作后的值,并缓存在对象中,如果再对同一个值进行操作时,则直接从缓存中取,无需再调用函数计算。 以下摘取的函数,在 shared 目录下公用的工具方法。文件在 util.js 中,githu地址。 提取了一些常用通用的函数进行剖析,主要包含以下内容: 创建一个被冻结的空对象 判断是...

    elarity 评论0 收藏0
  • javascript判断一个对象是否数组

    摘要:多个窗口意味着多个全局环境,不同的全局环境拥有不同的全局对象,从而拥有不同的内置类型构造函数。这可能会引发一些问题。上面我们提到使用原生的方法来判断值是否为数组的实例。这也意味着不是一个十分可靠的识别对象类型的方式。 在JavaScript中,可以通过typeof操作符来判断基本数据类型(Undefined、Null、Boolean、Number和String),同时相信大家也熟知ty...

    BearyChat 评论0 收藏0
  • 在JavaScript中,如何判断数组数组

    摘要:比如我们今天要讨论的,在当中如何判断一个数组是数组。在数组的原型链上也能找到构造函数由上面的几行代码可以看出,使用运算符可以分辨数组和对象,可以判断数组是数组。用判断实例化的数组拥有一个属性,这个属性指向生成这个数组的方法。 如果你没有注意过这个问题,那么这个标题应该会让你感到困惑,判断数据类型这么基础的问题能有什么坑呢? 少年,你不能太天真了,我们朝夕面对的这门语言,可是JavaSc...

    kohoh_ 评论0 收藏0
  • java十六大常用工具类

    摘要:一关闭一个流或者且不抛出异常。删除文件或文件夹且不会抛出异常。此外,还支持等十格式化参数,返回一个或者可用字符串把或者等转换为十一加密,返回位加密加密加密加密,返回位十二是否为空根据条件筛选集合元素根据指定方法处理集合元素,类似的。 一. org.apache.commons.io.IOUtils closeQuietly 关闭一个IO流、socket、或者selector且不...

    joyqi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<