确定Javascript变量是否为数组但没有其他用户定义属性的最佳方法是什么? 'instanceof Array'不会这样做。
e.g。
var var1 = [10,11];
var1['key1'] = 'extraProperty';
var1 instanceof Array; //returns true
答案 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.