如何检查一个对象是不是一个数组?
所以我有一个函数需要检查一个参数是否是一个对象,但是这个失败是因为:
typeof [] // returns 'object'
这是一个经典的JavaScript陷阱,但我不记得该怎么做才能真正接受对象,但不是数组。
尝试这样的事情:
obj.constructor.toString().indexOf("Array") != -1
或者(甚至更好)
obj instanceof Array
所有这些答案都表明,如果某个对象是“Array”类(即由“Array”构造)的实例,则检查是否真的不是安全的解决方案。 他们有时可能会工作,也许大部分时间都在工作,但所有主要框架已经从这种方法中移开。 它的主要问题之一是当多个窗口(通常是父窗口和一个或多个框架或iframe窗口)之间存在交互时。 如果将在一个窗口中创建的数组对象传递到驻留在另一个窗口中的API,则所有这些测试都将失败。 为什么? 因为你测试的是对象是否是本地窗口上下文中的“Array”类的实例。 换句话说,当你引用“Array”时
if (myobject instanceof Array) { ... }
当然,你所引用的是window.Array
。 那么,在另一个窗口中构造的数组不会成为窗口中Array类的实例!
检查构造函数名可能会更安全一些,但它仍然有风险。 在我看来,你最好采用鸭子打字的方式。 也就是说,不是问,“这是一个数组吗?” 反而问,“这个对象似乎是否支持我在这种情况下需要的一些特定的数组API?” 例如,“该对象是否具有length
属性?” Javascript是一个非常“软”的语言,几乎所有的东西都是可变的。 因此,即使你确实发现了一些由“Array”构造的东西,你仍然不确定你可以用它做什么或对它做什么。
感谢您的链接,@Lachlan - 这是对这些问题的非常明确的描述:http://juhukinners.com/2009/01/11/typeof-considered-useless-or-how-to-write-robust-型的检查/
为了确定给定的对象是否为数组,ECMAScript 5引入了Array.isArray()方法,该方法当前在所有现代浏览器中均受支持。 请参阅此ECMAScript兼容性表。
要确定特定对象的类,可以使用Object.prototype.toString()方法。
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call([]); // "[object Array]"
链接地址: http://www.djcxy.com/p/19309.html