Javascript “替代方案”;开关";陈述
我不想在我的代码中使用Switch,所以我正在寻找一些替代方法 开关示例:Javascript “替代方案”;开关";陈述,javascript,switch-statement,Javascript,Switch Statement,我不想在我的代码中使用Switch,所以我正在寻找一些替代方法 开关示例: function write(what) { switch(what) { case 'Blue': alert ('Blue'); break; ... case 'Red': alert ('Red'); break; } } colors = []; colors['Blue'] = function() { alert('Bl
function write(what) {
switch(what) {
case 'Blue':
alert ('Blue');
break;
...
case 'Red':
alert ('Red');
break;
}
}
colors = [];
colors['Blue'] = function() { alert('Blue'); };
colors['Red'] = function() { alert('Red'); };
function write(what) {
colors[what]();
}
不带开关的示例:
function write(what) {
switch(what) {
case 'Blue':
alert ('Blue');
break;
...
case 'Red':
alert ('Red');
break;
}
}
colors = [];
colors['Blue'] = function() { alert('Blue'); };
colors['Red'] = function() { alert('Red'); };
function write(what) {
colors[what]();
}
我的问题是:
function write(what) {
switch(what) {
case 'Blue':
alert ('Blue');
break;
...
case 'Red':
alert ('Red');
break;
}
}
colors = [];
colors['Blue'] = function() { alert('Blue'); };
colors['Red'] = function() { alert('Red'); };
function write(what) {
colors[what]();
}
另一种方法是使用
write
方法定义一个类,并重写子类Red
和Blue
中的方法,以执行正确的操作
这是否比您提出的解决方案更好,取决于您的具体情况。您已经基本做到了这一点。如果可能,您可能希望添加一个帮助器函数,以使设置更容易。例如:
function setup(what)
{
colors[what] = function() { alert(what); };
}
编辑:如果您想为每个选项执行的操作更为复杂,那么这显然是行不通的。正如@roe在评论中所提到的,这使用了经常被人不屑一顾的全局颜色。问题2:
通常,如果您可以用字典查找来替换自定义控件结构,您就完全可以了。这本书很容易阅读,而且非常优雅——坚持下去。正如我所说,它很棒。我能添加到您的解决方案中的唯一一件事是,将
颜色本地化可能更好
function write(what) {
var colors = [];
colors['Blue'] = function() { alert('Blue'); };
colors['Red'] = function() { alert('Red'); };
colors[what]();
}
关于第二种方法,即存储非数字索引(在其他语言中称为关联数组),我只有一个注释
你应该使用一个简单的对象
此外,您可能希望检查传递给write
函数的what
参数是否作为colors
对象的属性存在,并查看它是否是函数,以便在没有运行时错误的情况下调用它:
var colors = {};
colors['Blue'] = function() { alert('Blue'); };
colors['Red'] = function() { alert('Red'); };
function write(what) {
if (typeof colors[what] == 'function') {
colors[what]();
return;
}
// not a function, default case
// ...
}
您可以使用对象文字,并尝试捕获默认值:
function write(what) {
var colors = {
'Blue': function(){ alert('Light-Blue'); },
'Red': function(){ alert('Deep-Red'); },
'Green': function(){ alert('Deep-Green'); }
}
try {colors[what]();}
catch(err) {colors['Green']();}//default behaviour
}
write('Pink');
我今天使用了这样的结构:
var chosenColor = 'red';
var colorString = {
'red': 'The color is red.',
'green': 'The color is green.',
'blue': 'The color is blue.',
}[chosenColor] || 'The color is unknown.';
我喜欢根据选择来选择字符串的代码量非常小
您还可以将其传递给函数:
alert({
'red': 'The color is red.',
'green': 'The color is green.',
'blue': 'The color is blue.',
}[chosenColor] || 'The color is unknown.');
我必须对列表中的一组对象道具进行比较,不想对所有可能性进行切换/案例,因此我首先将一组对象分配到一个数字等级,因此案例变成了一个简单的比较。这仅是4种可能性,但您了解了如何将其扩展到开关/机箱变得无法管理的情况:
函数mySort2(item1,item2){
var矩阵={
"修复":4,,
“r/r”:3,
"部分":二,,
“杂项”:1
};
(矩阵[item1.category]<矩阵[item2.category])?返回+1:返回-1;
//如果可能的话,需要先检查坏数据吗
i1=matrix[item1.category] || null;
i2=matrix[item2.category] || null;
if (i1==null){
// handle bad data in item 1
return +1; // put it after 2
}
if (i2==null){
// ditto
return -1; //put 1 first
}
if (i1<i2)
return +1;
else
return -1;
i1=矩阵[item1.category]| |空;
i2=矩阵[item2.类别]| |空;
如果(i1==null){
//处理项目1中的错误数据
return+1;//放在2后面
}
如果(i2==null){
//同上
return-1;//将1放在第一位
}
如果(i1It’s great.Left it.yes,这是一个更好的解决方案,代码更少:)它也更干净,更容易阅读,可能会删除重复代码。这只适用于这个特定的例子,可能它们在现实中没有太多共同点。而且颜色在这里是全局的,这很少是一件好事。恕我直言,我认为你链接的文章错了。相反,不应该使用..in来迭代array@machine:那篇文章还谈到了for…in
语句,以及当Array
和Object
等内置构造函数的原型成员被扩展时会出现的问题,但这篇文章的底线是JavaScript数组是数字的,它们通常用于存储任意值键/值对这是一种糟糕的做法…底线?在数组上使用expando属性并不能改变这一事实。将最通用的对象之一转换为最不通用的对象是没有任何好处的。我不知道你为什么说“这篇文章也说明了问题”…我的理解是,这篇文章的重点是“更好地”支持for..in与array.short和simple的结合使用,就像它一样。+1只要chosenColor存在于colorString中,这就很酷。例如,如果chosenColor是“orange”,您将得到一个类型错误。事实上,您可以轻松地使用({'red':'color is red'}[chosenColor]| |'default'
谢谢@superzamp,我已经编辑了我的代码以添加默认选项。在2021年使用?
而不是| |
。这是一个答案:使用开关/案例的替代方法。您还可以使用[]的[]来获得实际的值矩阵。