可能是重复问题:
在JavaScript中,我们如何确定一个对象是哈希表还是数组?
在JavaScript中
typeof([])
并且typeof({})
如何可靠地在Javascript中区分数组和关联数组?
我考虑过通过测试对象是否具有"length"属性(表明它将是一个数组)来进行区分,但是接下来的内容也将被视为数组:
both return "object".
{length:5}
可能是重复问题:
在JavaScript中,我们如何确定一个对象是哈希表还是数组?
在JavaScript中
typeof([])
并且typeof({})
如何可靠地在Javascript中区分数组和关联数组?
我考虑过通过测试对象是否具有"length"属性(表明它将是一个数组)来进行区分,但是接下来的内容也将被视为数组:
both return "object".
{length:5}
现代的浏览器内置 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。执行以下步骤:
- 如果 Type(arg) 不是 Object,则返回 false。
- 如果 arg 的 [[Class]] 内部属性的值为“Array”,则返回 true。
- 返回 false。
一个好的方法是检查内部的[[CClass]]
值。为了做到这一点,您需要调用Object.prototype.toString
:
var toStr = Object.prototype.toString;
toStr.call([]); // === [object Array]
toStr.call({}); // === [object Object]
在Javascript中不存在关联数组。
一个数组只能有数字键。如果您访问字符串键,则实际上使用的是快捷方式,这与对象表示法完全等效。
http://www.quirksmode.org/js/associative.html
http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/