繁体   English   中英

Javascript切换与if / else

[英]Javascript switch versus if/else

我正在阅读Codecademy的Javascript - Intro to Objects课程,目前我正在“回顾:到目前为止的故事......”课程中挂上“4.我必须庆祝你的宝贝”练习

练习是:

这个练习有很多电影和评论要输入。你可能会想,“这是教学编码还是打字?!”

但有一个原因可以解决这么多案件。 我们想表明,如果我们使用if - else语句,那将是低效的。 我们可以使用条件课程的其他选择吗?

想象一下,你有一个电影收藏,你想写一些代码,将评论分配给每个人。 显然,每个评论都会因电影而异。 以下是电影和您的评论。 使用前一课中学到的结构编写以下信息的代码:

  • “矩阵” - “出行”
  • “公主新娘” - “令人敬畏的约会之夜电影”
  • “欢迎来到美国” - “Amjad的最爱”
  • “记住泰坦” - “热爱运动”
  • “为什么我看起来像我12岁?” - “瑞恩和扎克的故事”
  • “在野外战斗袋鼠” - “令人印象深刻的澳大利亚电影”

getReview应该是一个获取电影名称并根据上述信息return其评论的函数。 如果没有找到电影名称,则返回"I don't know!"

我的理解是将数据与逻辑分开很重要。 所以,我最初的解决方案是:

var getReview = function (movie) {
    for (var i = 0; i < movieReviews.length; i++) {
        if (movie === movieReviews[i].name) {
            return(movieReviews[i].review);
        }
    }
    return("I don't know!");
};

var movieReviews = [{name: "Matrix", review:"good trip out"},
    {name: "Princess Bride", review:"awesome date night movie"},
    {name: "Welcome to America", review:"Amjad's favorite"},
    {name: "Remember the Titans", review:"love the sports"},
    {name: "Why do I look like I'm 12?", review:"The Ryan and Zach story"},
    {name: "Fighting Kangaroos in the wild", review:"Token Australian movie for Leng"}];

console.log(getReview("Matrix"));

我确信有很多方法可以对此进行优化,但总的来说,我认为添加,编辑,修改等电影复制数组比编写switch语句更容易。

换句话说,我没有看到为什么switch语句与if-else语句相比效率低下。 我错过了什么?

编辑:问题的帮助文本是:

可以使用if,else if和else语句,但效率很低。 在您有许多不同场景和不同场景的情况下,请尝试使用switch语句!

因为我们正在定义一个函数,所以我们可以使用return关键字!

确保您返回的内容与评论文本的大小写相符

真的,现在的问题是有缺陷的。 您正在学习的课程是对象简介 ,那么为什么两个数组都没有关联? 只是:

movieReviews = { 
  "matrix": "a good trip"
}
// These are now both valid for accessing "a good trip"
movieReviews["matrix"];
movieReviews.matrix

每部电影都有一个独特的名字,这使它成为一把钥匙的完美候选者。 此外,用于搜索评论的功能应该是评论对象的方法 对于它的价值(并且希望它是某种东西, 即使现在不是 ),这就是我实现解决方案的方式。

MovieReviews = function() {
  /* Private data. */
  var data = {
    "matrix": "good trip out",
    "Princess Bride": "awesome date night movie",
    "Welcome to America": "Amjad's favorite"
  }
  /* Get a review for a movie by name, or notify that we don't know */
  this.getReview = function(movie) {
    if(data.hasOwnProperty(movie)) { return data[movie]; }
    return "I don't know!";
  }
  /* Add a review by movie name, and review string. */
  this.addReview = function(movie, review) {
    data[movie] = review;
  }
}

现在实例化一个新的MovieReview对象,添加一个新的电影评论,并打印一些测试。

var reviews = new MovieReviews();
reviews.addReview("Remember the Titans", "love the sports");

console.log(reviews.getReview("matrix")); // 'good trip out'
console.log(reviews.getReview("Remember the Titans")); // 'love the sports'
console.log(reviews.getReview("A Scanner Darkly")); // 'I don't know!'

这样访问每部电影的评论是微不足道的,根本不需要迭代。 您还在对象中包含数据,提供封装并强制用户使用您的接口。

至于你原来的问题,我很难说是否if-elseswitch语句在没有执行一些定时测试的情况下会更有效率(也许你可以做的事情让我们知道!)。 但根据这里写的,

“如果多个案例与提供的值匹配,则选择匹配的第一个案例......”

无论如何,这似乎只是在迭代案例。 如何使用当前的JS引擎转换JavaScript控件结构可能会优化您的switch语句,我敢打赌它在if-else上使用大量选项表现更好。

除了性能之外,与if-else相比,阅读具有许多元素的switch语句非常好。 此外,通常有时间可以更改其他因素,例如对象类型( 数组 - >示例中的对象 ),以便更好地解决问题。

不要陷入过早优化代码的陷阱,否则你永远不会完成任何事情,维护你工作的人会永远恨你,永远。

您将所有内容存储在一个数组中,当您可以使用case / switch时运行循环。 您可以通过多种不同方式完成此任务,但如果使用大小写/开关而不是大量条件,则可以使用较少的字符。

function movieReviews(movie) {
var x = "No review.";
switch (movie)
{
case 'Matrix':
  x="good trip out";
  break;
case 'Princess Bride':
  x="awesome date night movie";
  break;
case 'Remember the Titans':
  x="love the sports";
  break;
case 'Welcome to America':
  x="Amjad's favorite";
  break;
default:
  x="No movie selected.";
}
document.write("Movie: " + movie + " Review: " + x);
}

它也使代码更清晰。

请尝试以下方法:

var getReview = function (movie) {
    switch (movie) {
        case 'Matrix': return "good trip out";
        break;
        case 'Princess Bride': return "awesome date night movie";
        break;
        case 'Welcome to America': return "Amjad's favorite";
        break;
        case 'Remember the Titans': return "love the sports";
        break;
        case 'Why do I look like I\'m 12?': return "The Ryan and Zach Story";
        break;
        case "Fighting Kangaroos in the wild": return "TOken Australian movie for Leng";
        break;
        default: return "I don't know!"
        break;
    }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM