[英]Associative array without toString, etc
我想创建一个关联数组:
var aa = {} // Equivalent to Object(), new Object(), etc...
而且我想确保我访问的任何密钥都将是一个数字:
aa['hey'] = 4.3;
aa['btar'] = 43.1;
我知道 JavaScript 没有输入,所以我不能自动检查这个,但我可以在我自己的代码中确保我只为这个aa
分配字符串。
现在我从用户那里拿走了钥匙。 我想显示该键的值。 然而,如果用户给我类似“toString”的东西,用户会得到一个函数,而不是一个整数! 有没有办法确保用户给我的任何字符串都是我定义的?
唯一的解决方案是这样的吗?
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];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.