【发布时间】:2011-02-25 08:06:08
【问题描述】:
判断一个对象是否为数组的“正确”方法是什么?
函数 isArray(o) { ??? }
【问题讨论】:
-
您可能希望提供有关您的环境的更多详细信息,例如:纯 javascript?在浏览器中运行?原型或其他库可用吗?
标签: javascript
判断一个对象是否为数组的“正确”方法是什么?
函数 isArray(o) { ??? }
【问题讨论】:
标签: javascript
最好的办法:
function isArray(obj) {
return Object.prototype.toString.call(obj) == '[object Array]';
}
ECMAScript 5th Edition Specification 为此定义了一个方法,而some browsers,如 Firefox 3.7alpha、Chrome 5 Beta 和最新的 WebKit Nightly 版本已经提供了本机实现,因此如果不可用,您可能想要实现它:
if (typeof Array.isArray != 'function') {
Array.isArray = function (obj) {
return Object.prototype.toString.call(obj) == '[object Array]';
};
}
【讨论】:
return Object.prototype.toString.call(obj) === '[object Array]';,以避免任何可能的胁迫
Object.prototype.toString 方法在规范中是fully described,String 返回值是保证,我看不出有什么好处使用严格的等号运算符,当您知道您正在比较两个字符串值时...
Object.prototype.toString 总是比抱歉更安全。
Object.prototype.toString = function () {return "[object Array]"; }; 即使使用严格的等于 === 运算符,函数也会返回 @987654332 @ 总是。 Crockford 说:“始终使用===”,我说:了解类型强制以决定使用哪个运算符。
您应该可以使用instanceof 运算符:
var testArray = [];
if (testArray instanceof Array)
...
【讨论】:
instanceof 唯一的缺点是当您在多帧 DOM 环境中工作时,一帧的数组对象不是另一帧的 Array 构造函数的实例。有关详细信息,请参阅this article。
jQuery 解决了很多这样的问题:
jQuery.isArray(obj)
【讨论】:
这是我用的:
function is_array(obj) {
return (obj.constructor.toString().indexOf("Array") != -1)
}
【讨论】:
function typeOf(obj) {
if ( typeof(obj) == 'object' )
if (obj.length)
return 'array';
else
return 'object';
} else
return typeof(obj);
}
【讨论】: