Javascript 不带toString的关联数组等

Javascript 不带toString的关联数组等,javascript,object,maps,associative-array,Javascript,Object,Maps,Associative Array,我要创建关联数组: var aa = {} // Equivalent to Object(), new Object(), etc... 我想确保我访问的任何密钥都是一个数字: aa['hey'] = 4.3; aa['btar'] = 43.1; 我知道JavaScript没有输入,所以我不能自动检查,但我可以在自己的代码中确保我只为这个aa分配字符串 现在我从用户那里获取密钥。我想显示该键的值。但是,如果用户给我类似于“toString”的东西,用户将返回一个函数,而不是int!有没有

我要创建关联数组:

var aa = {} // Equivalent to Object(), new Object(), etc...
我想确保我访问的任何密钥都是一个数字:

aa['hey'] = 4.3;
aa['btar'] = 43.1;
我知道JavaScript没有输入,所以我不能自动检查,但我可以在自己的代码中确保我只为这个
aa
分配字符串

现在我从用户那里获取密钥。我想显示该键的值。但是,如果用户给我类似于“toString”的东西,用户将返回一个函数,而不是int!有没有办法确保用户给我的任何字符串都是我定义的

唯一的解决方案是如下所示的吗

delete aa['toString'];
delete aa['hasOwnProperty'];

等等。

一种可能是使用hasOwnProperty检查密钥是否是显式添加到数组中的内容。因此,不是:

function findNumber(userEnteredKey) {
    return aa[userEnteredKey];
}
你会说:

function findNumber(userEnteredKey) {
    if (Object.prototype.hasOwnProperty.call(aa, userEnteredKey))
        return aa[userEnteredKey];
}
或者,您可以使用typeof在返回之前检查任何内容是否为数字。但我喜欢hasOwnProperty方法,因为它可以防止您返回您无意放入数组中的任何内容。

这可能对您有用:

function getValue(id){
  return (!isNaN(aa[id])) ? aa[id] : undefined;
}
或者,我推荐这种通用解决方案:

function getValue(hash,key) {
    return Object.prototype.hasOwnProperty.call(hash,key) ? hash[key] : undefined;
}
注意:键将在内部转换为字符串,因为键实际上是属性的名称

var test = {
  2: "Defined as numeric",
  "2": "Defined as string"
}

alert(test[2]); // Alerts "Defined as string"
如果尝试使用对象:

var test = {}, test2 = {};
test[test2] = "message"; // Using an object as a key.

alert(test[test2]); // Alerts "message". It looks like it works...

alert(test[test2.toString()]);
// If it really was an object this would not have worked,
// but it also alerts "message".
现在您知道它始终是一个字符串,让我们使用它:

var test = {};

var test2 = {
    toString:function(){return "some_unique_value";}
    // Note that the attribute name (toString) don't need quotes.
}

test[test2] = "message";
alert(test["some_unique_value"]); // Alerts "message".

创建新键时,请在其前面加上您自己的字符串常量:

var a = {};
var k = 'MYAPP.COLLECTIONFOO.KEY.';

function setkey(userstring)
{
  a[k + userstring] = 42;
}

function getkey(userstring)
{
  return a[k + userstring];
}

问题是,如果用户输入了键“hasOwnProperty”,它将失败。您将使用
Object.prototype.hasOwnProperty.call(aa,userEnteredKey)
@Moss:+1代表hasOwnProperty.Ooh,这就是我对JavaScript的不习惯。谢谢你的更正!是的,第二个会有用的-谢谢!第一个根本不会,我不认为=P。它必须是Object.prototype.hasOwnProperty.call(hash,key)。任何函数对象的call方法都允许我们调用hasOwnProperty方法,就好像它是hash的方法一样object@Claudio:第一个(带isNaN)有效,因为函数或未定义不是数字。因此,通过测试aa[id]是否是一个数字,您将得到该数字,否则将得到未定义的数字。我已经在firefox上测试过了,它在firefox上运行。@Claudio:你说你想要一个数字,对吗?;)但第二个更通用,适用于所有类型的值。请记住,内部的键是一个字符串。@some:啊,谢谢,我没听清楚。我的用例实际上更一般。钥匙是字符串吗?这不是你传递的东西的散列版本吗?或者它是字符串的哈希版本。如果是的话,那么你自己定义的OBJ是如何工作的呢?