在前端面试中, 我们经常会被问道, 如何判断一个对象是不是数组类型, 下面就这一点展开详细的描述, 并总结一下共有几种方法.
1. 我们首先回顾一下 typeof 操作符的用法
操作符可以用来检测给定变量的数据类型, 返回的值有以下几种: undefined,boolean,string,number,object,function
2. 使用 typeof 来判断
我们惊喜的发现: 除了方法会返回 function 值之外,[]和 {} 都是返回的 object 值, 所以无法通过 typeof 来区分对象还是数组, 这种方法不可用.
3. 根据构造函数来判断
instanceof 操作符可以来表示实例是否属于某个构造函数创建的.
从上图来看, obj1 是构造函数 Array 的实例没问题, obj4 也是构造函数的实例类型, 显然 obj4 应该是对象数据类型, 为什么会产生这种情况, obj4.__proto__=obj1,obj4 改变了它的原型指向, 草图如下:
因为改变了 obj4 的原型指向导致使用 instanceof 字符判断出 obj4 也为数组类型了, 所以此方法也不可取.
3. 使用原型对象判断
发现结果和使用 instanceof 字符一样, 所以还是无法区 [] 是数组类型
4. 根据对象的 class 属性来判断
class: 每个对象的内部属性, 记录创建对象时使用的类型名, 一旦创建, 无法修改.
问题: 数组类型等内置类型, 重写了 toString 方法, 直接调用数组对象的方法, 不在返回 class
解决: 使用 call 替换 this 为指定对象调用 Object 原型上的 toString 方法即可.
5.Array.isArray 直接判断
Array.isArray() 用于确定传递的值是否是一个 Array. 如果对象是 Array, 则为 true; 否则为 false.
综上所述, 判断一个对象是不是数组类型最可靠的方法是这两种: Object. prototype. toString. call(obj)===[ object Array]和 Array. isArray(obj).
参考资料:
《JavaScript 高级程序设计》 MDN
来源: https://www.cnblogs.com/peerless1029/p/9950005.html