使用object literal替换switch
提问:
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的更多相关文章
- JavaScript Patterns 3.1 Object Literal
Basic concept Values can be properties: primitives or other objects methods: functions User-defined ...
- C#中一种替换switch语句更优雅的写法
今天在项目中遇到了使用switch语句判断条件,但问题是条件比较多,大概有几十个条件,满屏幕的case判断,是否有更优雅的写法替代switch语句呢? 假设有这样的一个场景:商场经常会根据情况采取不同 ...
- 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 ...
- object literal对象字面量
<JavaScript高级程序设计(第3版)>有个陌生的新词:对象字面量,无法理解.看了一下英文原版,英文是object literal ,还是不太理解.后来想明白了,主要是literal ...
- 用Dictionary替换switch case
用switch case处理一个很长的判断,例如56个民族01代表汉族,02代表藏族,03代表壮族...,当传入数字想获取民族名称时就得写56个case,当传入民族获取背后的数字时,又得再写56个ca ...
- 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 ...
- input 等替换元素的baseline问题
行内标签和设置为block:inline;形式的标签与input并排放置时,为何会错位?例如下面的. 因为在同一行中,所有行内元素默认 baseline 对齐.但是,input(还有textarea. ...
- html元素两种分类。替换元素和不可替换元素;块级元素和行内元素
根据元素本身特点来分类: 替换元素替换元素根据其标签和属性来决定元素的具体显示内容.有<img><input><textarea><select>< ...
- JVM Object Query Language (OQL) 查询语言
Object Query Language (OQL) OQL is SQL-like query language to query Java heap. OQL allows to filter/ ...
随机推荐
- Hadoop Balancer源代码解读
前言 近期在做一些Hadoop运维的相关工作,发现了一个有趣的问题,我们公司的Hadoop集群磁盘占比数值參差不齐,高的接近80%.低的接近40%.并没有充分利用好上面的资源,可是balance的操作 ...
- larave框架的安装
(1)中文官网:http://www.golaravel.com/ (2)composer下载与安装 1:composer网址:getcomposer.org 2:windows下载Composer- ...
- Java获取yahoo天气预报
学习闲暇之余,写了个获取yahoo天气预报的java小程序,仅供娱乐. 首先我们需要获取您需要查询城市对应的代号,我们可以用HashMap来查询,代码如下: publicstatic HashMap& ...
- e647. 处理鼠标移动事件
component.addMouseMotionListener(new MyMouseMotionListener()); public class MyMouseMotionListener ex ...
- java---final、finally、finalize的区别
Java finalize方法使用 标签: javaappletobjectwizardjvm工作 2011-08-21 11:37 48403人阅读 评论(5) 收藏 举报 分类: Java(96 ...
- 调用ffmpeg库编译时出现common.h:175:47: error: 'UINT64_C' was not declared in this scope
解决办法 出现错误:jni/ffmpeg/libavutil/common.h:175:47: error: 'UINT64_C' was not declared in this scope 解决: ...
- (转)x264重要结构体详细说明(1): x264_param_t
结构体x264_param_t是x264中最重要的结构体之一,主要用于初始化编码器.以下给出了几乎每一个参数的含义,对这些参数的注释有的是参考了网上的资料,有的是自己的理解,还有的是对源代码的翻译,由 ...
- Codeforces Round #Pi (Div. 2) —— D One-Dimensional Battle Ships
题目的意思是: 如今有一个长度为n,宽为1的方格,在上面能够放大小为1*a船,然后输入为n,k,a.分别为平地的大小,船的数量,船的长度. 一个叫alice的人已经在地图上摆好了船的位置. 然后bob ...
- 二分求幂,快速求解a的b次幂
一个引子 如何求得a的b次幂呢,那还不简单,一个for循环就可以实现! void main(void) { int a, b; ; cin >> a >> b; ; i < ...
- ANSI 转 UTF-8
ANSI和UTF-8格式都不太了解,各自好像都有好几种,下载了一个库,文件基本都是ANSI格式,linux显示乱码,原来都是在虚拟机一个个的“另存为“完成的,这次文件有点多,因此需要用命令完成. 以下 ...