在JavaScript中,使用typeof()区分数组和哈希表。

12

可能是重复问题:
在JavaScript中,我们如何确定一个对象是哈希表还是数组?


在JavaScript中

typeof([])
并且
typeof({})

如何可靠地在Javascript中区分数组和关联数组?

我考虑过通过测试对象是否具有"length"属性(表明它将是一个数组)来进行区分,但是接下来的内容也将被视为数组:

both return "object".

{length:5}
3个回答

16

现代的浏览器内置 Array.isArray 方法。

对于较老的浏览器,你可以测试该函数是否存在并在必要时添加它。

if( typeof Array.isArray !== 'function' ) {
    Array.isArray = function( arr ) {
        return Object.prototype.toString.call( arr ) === '[object Array]';
    };
}

alert( Array.isArray( [] ) );

编辑:

Array.isArray 是 ECMAScript 5 的一部分

15.4.3.2 Array.isArray ( arg )

isArray 函数接受一个参数 arg,并返回布尔值 true,如果该参数是一个其类内部属性为“Array”的对象;否则返回 false。执行以下步骤:

  1. 如果 Type(arg) 不是 Object,则返回 false。
  2. 如果 arg 的 [[Class]] 内部属性的值为“Array”,则返回 true。
  3. 返回 false。

5

一个好的方法是检查内部的[[CClass]]值。为了做到这一点,您需要调用Object.prototype.toString

var toStr = Object.prototype.toString;

toStr.call([]);  // === [object Array]
toStr.call({});  // === [object Object]

0

5
嗯,我认为你颠倒了。在JavaScript中,普通的对象是关联数组,而真正的数组在JavaScript中不存在。JS中的数组实际上是一个带有简写语法的对象(其中最显著的是长度属性,它返回存储在该对象中的最高数字字段加1)。 - beldaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接