提问:

1.为什么要使用switch方法  ==> (替换冗长的if和else判断)

2.什么场景下使用 ==> (在判断布尔值的)

3.switch有什么优点 ==> (简化了代码,语法更清晰)

4.switch有什么缺点 ==> (太多的case和break关键字,出现bug时难于调试)

5.还有什么更好的替换方法吗  ==> (使用对象字面量)

6.object literal有什么优点 ==> (可扩展性,可维护性,和更好的调试);

1.switch语法(替换冗长的if和else判断)

(function(){
var type = "coke";
var drink;
switch(type){
case "coke" :
drink = "coke";
break;
case "pepsi":
drink = "pepsi";
break;
default :
drink = "unknown drink"
}
console.log(drink);
}());

2.if和else做太多判断,语句太冗长

(function(){
var type = "coke";
if(type === "coke"){
type = "coke";
}else if(type === "pepsi"){
type = "pepsi";
}else{
type = "Unknown drink";
}
}());

3.使用对象字面量

(function(){
function getDrink(type){
var drinks = {
"coke" : "Coke",
"pepsi" : "Pepsi",
"lemoande" : "Lemonade",
"default" : "Default item"
};
return "The drink i chose was " + (drinks[type] || drinks["default"]);
}
var drink = getDrink("pepsi"); //有选择参数
var drink2 = getDrink(); //默认
console.log(drink);
console.log(drink2);
}());

4.返回函数调用

(function(){
var type = "coke";
var drinks = {
coke : function(){
return "Coke";
},
pepsi : function(){
return "Pepsi";
},
lemoande : function(){
return "Lemoande";
}
}
console.log(drinks[type]());
}());

5.返回有“默认值”函数调用

(function(){
function getDrink(type){
var fn;
var drinks = {
coke : function(){
return "Coke";
},
pepsi : function(){
return "Pepsi";
},
lemoande : function(){
return "Lemoande";
},
default : function(){
return "Default item";
}
};
if(drinks[type]){
fn = drinks[type];
}else{
fn = drinks["default"];
}
return fn();
}
var drink = getDrink("lemoande");
var drink2 = getDrink();
console.log(drink); //Lemoande
console.log(drink2); //Default item
}());

6.使用||表达式来返回“默认值”函数调用

(function(){
function getDrink(type){
var drinks = {
coke : function(){
return "Coke";
},
pepsi : function(){
return "Pepsi";
},
lemoande : function(){
return "Lemoande";
},
default : function(){
return "Default item";
}
};
return (drinks[type] || drinks["default"])();
}
var drink = getDrink("lemoande");
var drink2 = getDrink();
console.log(drink); //Lemoande
console.log(drink2); //Default item
}());

7.有其他返回值的时候

(function(){
function getDrink(type){
var item;
var drinks = {
coke : function(){
item = "Coke";
},
pepsi : function(){
item = "Pepsi";
},
lemoande : function(){
item = "Lemoande";
},
default : function(){
item = "Default item";
}
}; //invoke it
(drinks[type] || drinks["default"])(); //return something
return 'The drink I chose was ' + item;
} var drink = getDrink("lemoande");
var drink2 = getDrink();
console.log(drink); //Lemoande
console.log(drink2); //Default item
}());

8.当有多个case同一个条件的switch

(function(){
var type = "coke";
var snack;
switch(type){
case "coke" :
case "pepsi" :
snack = "Drink";
break;
case "cookies" :
case "crisps" :
snack = "Food";
break;
default :
snack = "Unknown type!";
}
console.log(snack);
}());

9.使用对象直接量替换switch

(function(){
function getSnack(type){
var snack;
function isDrink(){
return snack = "Drink";
}
function isFood(){
return snack = "Food";
}
var snacks = {
"coke" : isDrink,
"pepsi" : isDrink,
"cookies" : isFood,
"crisps" : isFood
};
return snacks[type]();
}
var drink = getSnack("coke");
console.log(drink);
}());

10.总结

1.switch有太多case和break关键字,且太散乱,出现bug时难于调试。

2.对象字面量有更多的可扩展性,可维护性,和更好的调试,可以包含函数和任何其他对象类型,非常有灵活性,且可以产生闭包,返回闭包。

PS:原文参考:https://toddmotto.com/deprecating-the-switch-statement-for-object-literals/

使用object literal替换switch的更多相关文章

  1. JavaScript Patterns 3.1 Object Literal

    Basic concept Values can be properties: primitives or other objects methods: functions User-defined ...

  2. C#中一种替换switch语句更优雅的写法

    今天在项目中遇到了使用switch语句判断条件,但问题是条件比较多,大概有几十个条件,满屏幕的case判断,是否有更优雅的写法替代switch语句呢? 假设有这样的一个场景:商场经常会根据情况采取不同 ...

  3. initialize myObject by calling a function that returns an object literal

    w作用域控制变量的可见范围. JavaScript: The Good Parts Instead of initializing myObject with an object literal, w ...

  4. object literal对象字面量

    <JavaScript高级程序设计(第3版)>有个陌生的新词:对象字面量,无法理解.看了一下英文原版,英文是object literal ,还是不太理解.后来想明白了,主要是literal ...

  5. 用Dictionary替换switch case

    用switch case处理一个很长的判断,例如56个民族01代表汉族,02代表藏族,03代表壮族...,当传入数字想获取民族名称时就得写56个case,当传入民族获取背后的数字时,又得再写56个ca ...

  6. Nuxt / Vue.js in TypeScript: Object literal may only specify known properties, but 'components' does not exist in type 'VueClass'

    项目背景, Nuxt(vue), TypeScript 生成完项目框架, 添加测试demo页面. 在生成的模板代码中添加layout配置如下: <script lang="ts&quo ...

  7. input 等替换元素的baseline问题

    行内标签和设置为block:inline;形式的标签与input并排放置时,为何会错位?例如下面的. 因为在同一行中,所有行内元素默认 baseline 对齐.但是,input(还有textarea. ...

  8. html元素两种分类。替换元素和不可替换元素;块级元素和行内元素

    根据元素本身特点来分类: 替换元素替换元素根据其标签和属性来决定元素的具体显示内容.有<img><input><textarea><select>< ...

  9. JVM Object Query Language (OQL) 查询语言

    Object Query Language (OQL) OQL is SQL-like query language to query Java heap. OQL allows to filter/ ...

随机推荐

  1. 【3C认证】安防产品3C认证

    安防产品3C认证作为3C认证的一部分.安防产品即:防范的手段达到或实现安全的目的的设备或器材. 依据<中华人民共和国产品质量法>.<中华人民共和国标准化法>.<中华人民共 ...

  2. CentOS6 配置FTP服务器

    编辑 删除 1.先检查有没有安装   rpm -q vsftpd 如果没有安装   yum install vsftpd 2.先关闭防火墙进行调试. service iptables stop 或者一 ...

  3. java-el+jstl+jsbc综合示例

    项目结构: 项目展示: 数据库: /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.5.53 : Database - product ************ ...

  4. ionic2 生命周期

    在 Ionic 2 的版本中生命周期命名的改变,以及各个事件的解释. 官方文档地址在 这里 . 事件名称 事件说明 ionViewLoaded 页面加载完毕触发.该事件发生在页面被创建成 DOM 的时 ...

  5. 百万级PHP网站架构工具箱

    在了解过世界最大的PHP站点,Facebook的后台技术后,今天我们来了解一个百万级PHP站点的网站架构:Poppen.de.Poppen.de是德国的一个社交网站,相对Facebook.Flickr ...

  6. r画饼图

    原始图样: library(ggplot2) dt = data.frame(A = c(2, 7, 4, 10, 1), B = c('B','A','C','D','E')) p = ggplot ...

  7. 关于Cocos2d-x中使用完Blink动作后精灵突然消失的问题的解决

    精灵使用Blink 执行完动作之后,消失不见了,原因是闪烁的过程中精灵刚好到空纹理(透明)的那部分,这时候用户通过某种操作中断闪烁动作,导致下个状态的时候,精灵依然停留在空纹理的状态.所以最好在精灵执 ...

  8. spring只是一个框架

    想跟着 spring in action 4 系统的研究下spring,结果发现忘了怎么建一个spring项目. 关键是,不知道该建一个什么项目,Java项目?Maven项目(Java项目?Web项目 ...

  9. 同一页面中引入多个JS库产生的冲突解决方案(转)

    发生JS库冲突的主要原因:与jQuery库一样,许多JS库都使用‘$’符号作为其代号.因此在一个页面中引入多个JS库,并且使用‘$’作为代号时,程序不能识别其代表哪个库(这个是我自己的解释,但更深的原 ...

  10. 类加载器详解 (转至http://blog.csdn.net/jiangwei0910410003/article/details/17733153)

    首先来了解一下字节码和class文件的区别: 我们知道,新建一个java对象的时候,JVM要将这个对象对应的字节码加载到内存中,这个字节码的原始信息存放在classpath(就是我们新建Java工程的 ...