我正在使用javascript创建混合移动应用程序。 为了支持多种语言,我创建了一个名为“exchange”的对象,其中包含变量的翻译,其中“exchange”包含200多个变量。 我的问题是,在性能的规模上,最好用的是什么:
对象内的1-变量如下:
var exchange = {
USERNAME_PASSWORD_UNMATCHED: "الاسم و كلمة المرور غير متطابقين",
NOT_APPROVED: " بانتظار تأكيد صلاحية الوصف",
ERROR_CONNECT: "فشل الاتصال بالخادم",
RE_LOGIN: "الرجاء اعادة الدخول",
INVALID_ACCESS_TOKEN: "رمز المرور غير صحيح",
.
.
.
};
或
像这样的函数内的2-变量
var exchange = {
get_variable:function(name){
switch(name){
case "USERNAME_PASSWORD_UNMATCHED": return "الاسم و كلمة المرور غير متطابقين"; break;
case "NOT_APPROVED":return " بانتظار تأكيد صلاحية الوصف";
case "ERROR_CONNECT":return "فشل الاتصال بالخادم";
case "RE_LOGIN":return "الرجاء اعادة الدخول";
case "INVALID_ACCESS_TOKEN":return "رمز المرور غير صحيح";
}
}
};
答案 0 :(得分:2)
我认为,对于像你提供的简单的js结构,两者之间的差异很小。虽然,我更喜欢解决方案#1而不是#2,因为它更简单(对我而言)并且易于访问。
我还用jsperf跟踪了两者的表现,实际上没有区别。
您可以在此处查看结果:jsperf-exchange-translation-perf
以下是用于测试的代码:
<强>制备强>
// Keys
var keys = [
"USERNAME_PASSWORD_UNMATCHED",
"NOT_APPROVED",
"ERROR_CONNECT",
"RE_LOGIN",
"INVALID_ACCESS_TOKEN"
];
// Random number between keys range
var getRandomKey = function() {
return Math.floor(Math.random() * ((keys.length - 1) - 0 + 1)) + 0;
};
测试案例#1:
var exchange = {
USERNAME_PASSWORD_UNMATCHED: "الاسم و كلمة المرور غير متطابقين",
NOT_APPROVED: " بانتظار تأكيد صلاحية الوصف",
ERROR_CONNECT: "فشل الاتصال بالخادم",
RE_LOGIN: "الرجاء اعادة الدخول",
INVALID_ACCESS_TOKEN: "رمز المرور غير صحيح"
};
for(var i = 0; i < 10000; i++) {
console.log(exchange[getRandomKey()]);
}
测试案例#2:
var exchange = {
get_variable:function(name){
switch(name){
case "USERNAME_PASSWORD_UNMATCHED": return "الاسم و كلمة المرور غير متطابقين"; break;
case "NOT_APPROVED":return " بانتظار تأكيد صلاحية الوصف"; break;
case "ERROR_CONNECT":return "فشل الاتصال بالخادم"; break;
case "RE_LOGIN":return "الرجاء اعادة الدخول"; break;
case "INVALID_ACCESS_TOKEN":return "رمز المرور غير صحيح";
}
}
};
for(var i = 0; i < 10000; i++) {
console.log(exchange.get_variable(getRandomKey()));
}
<强>结果:强>
测试案例#1:
2.51 ops/sec
测试案例#2:
2.46 ops/sec
特别说明:因为我使用了console.log
等。有可能jsperf将根据执行测试的CPU的流量返回不同的结果。多次运行测试表明存在很大的差异。
所以我最后会说,解决方案的 access 性能没有太大区别,但使用#1 解决方案#2 会有意义,因为后者只会使对象值的检索变得复杂,默认情况下使用exchange["USERNAME_PASSWORD_UNMATCHED"]