如何判断javascript变量是否为Array且只是一个Array

时间:2011-07-17 19:55:07

标签: javascript arrays

确定Javascript变量是否为数组但没有其他用户定义属性的最佳方法是什么? 'instanceof Array'不会这样做。

e.g。

var var1 = [10,11];
var1['key1'] = 'extraProperty';

var1 instanceof Array;    //returns true

3 个答案:

答案 0 :(得分:5)

var isOnlyArray = function(o) {
    if (! (Object.prototype.toString.call(o) === "[object Array]")) {
        return false;
    }
    for (property in o) { 
        if (o.hasOwnProperty(property)) {
            var asInt = parseInt(property, 10);
            if (!(0 <= asInt && asInt < o.length)
                || String(asInt) !== property) {
                return false;
            }
        }
    }

    return true;
}

此函数确认它是Array,并且对象上的每个已定义属性都是一个整数索引,它在.length指定的范围内。

var a = [1, 2];
console.log(isOnlyArray(a)); // true
a[2] = 4;
console.log(isOnlyArray(a)); // true
a["foo"] = 5;
console.log(isOnlyArray(a)); // false

答案 1 :(得分:0)

我认为您无法验证作为Array对象创建的内容的完整性。 Javascript不会禁止您向此类对象添加属性。

可以遍历对象的属性并返回false如果你看到一个你认为不应该在Array中的属性,但是仍然无法保证正常的属性没有损坏它们的值。

只是不要向Array添加属性,那么你就不会遇到这个问题。你问这种暗示你在代码中的其他地方做了一些非常错误的事情。

答案 2 :(得分:0)

通常,您无法区分数组和对象。对象可以用作数组,反之亦然。例如:

var fancyObj = {
    favoriteFood: "pizza",
    add: function(a, b){
        return a + b;
    }
};
fancyObj.add(2,3); // returns 5
fancyObj['add'](2,3); // ditto.