使用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/ ...
随机推荐
- C++ 递归实现汉诺塔
C++实现汉诺塔 #include <iostream> using namespace std; void move(int n,char x,char y,char z) { ) { ...
- ansible 变量传递到include
Task Include Files And Encouraging Reuse 假设您想在play或playbook中重复使用任务列表. 您可以使用include文件来执行此操作. 使用includ ...
- IS支持解析json
1. MIME设置:在IIS的站点属性的HTTP头设置里,选MIME 映射中点击”文件类型”-”新类型”,添加一个文件类型:关联扩展名:*.json内容类型(MIME):application/x-j ...
- 判断radiobutton是否被选中
<tr> <td class="label">是否显示:</td> <td> <?php if($cates_data[0][ ...
- table获取checkbox是否选中的几种方法
function test() { $(".table tbody tr").find("td:first input:checkbox").each(func ...
- EasyUI 搜索框
1.用法 (1).从标记创建.把 'easyui-searchbox' class 加入到 <input> 标记. <script type="text/javascrip ...
- [从jQuery看JavaScript]-匿名函数与闭包
jQuery片段: (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的第一眼,我 ...
- 最小顶点覆盖(Minimum Vertex Cover)与最大独立集(Maximum Independent Set)
问题描述:就是在图中找最小的点集,使得覆盖所有边. 和独立集等价:独立集问题:在图中找最大的点集,使得点集内的所有点互不相连. 引理:顶点覆盖集和独立集互补. 上面这个引理使得这两个问题可以相互规约, ...
- 第二百八十五节,MySQL数据库-MySQL函数
MySQL数据库-MySQL函数 1.MySQL内置函数 SELECT执行函数,后面跟要执行的函数 CHAR_LENGTH(str)函数:返回字符串的字符长度 -- CHAR_LENGTH(str)函 ...
- opencv实例二:缩放一张图片
1.知识补充 const char*, char const*, char*const的区别 事实上这个概念谁都有只是三种声明方式非常相似: Bjarne在他的The C++ Programming ...