优雅干净写JS系列1:常用小技巧整理

写JS代码一开始仅仅停留在实现上,经常会写一些初级又长的代码。后面开始慢慢转移到简洁代码的追求上。现在开始想慢慢整理一些优雅干净的JS写法,今天先小小整理一篇常用的小技巧使用:

1、处理多重条件

function test(a) {
  if (a === 'apple' || b === 'orange' || c === 'strawbery') {
    console.log('lalalala')
  }
}

在想要匹配更多数据的情况下,一直使用||来扩展,明显很冗长。使用数组的includes方法来重写:

function test(a) {
  let fruits = ['apple', 'orange', 'strawbery']
  if (fruits.includes(a)) {
     console.log('lalalala')
  }
}

2、少写嵌套,尽早返回

以下函数实现:如果没有提供水果,返回错误。
如果水果颜色为红色,打印出颜色。如果水果为红色且数量大于10,就打印出“good”

function test (fruit, quantity) {
  const redfruits = ['apple', 'orange', 'strawbery']
  if (fruit) {
     if (redfruits.includes(fruit)) {
         console.log('red')
         if (quantity > 10) {
            console.log('good')
          }
      }
  } else {
    throw new Error ('No fruit') 
  }
}

以上这种写法if嵌套很多层,我们可以确定一个原则就是,一但发现无效条件,就尽早返回,不要太多嵌套,还要找半天else在哪

function test (fruit, quantity) {
  const redfruits = ['apple', 'orange', 'strawbery']
  if (!fruit) throw new Error ('No fruit') 
  if (!redfruits.includes(fruit)) return
  console.log('red')
  if (quantity > 10) {
     console.log('good')
  }
}

可以优化如上写法,尽早返回,设置条件反转,即当某个条件不满足时就不再执行后续逻辑。当然也不是要始终都追求最少嵌套,太精简对阅读代码的人会增加思考时间。
以上可以再写一个可读性更好的:

function test (fruit, quantity) {
  const redfruits = ['apple', 'orange', 'strawbery']
  if (!fruit) throw new Error ('No fruit') 
  if (redfruits.includes(fruit)) {
     console.log('red')
     if (quantity > 10) {
       console.log('good')
     }
  }
}

3、使用数组every/some方法来处理全部/部分满足条件逻辑

例子:检查所有的水果是否都是红色,不是就返回

const fruits = [
    { name: 'apple', color: 'red' },
    { name: 'banana', color: 'yellow' },
    { name: 'grape', color: 'purple' }
  ]
function test () {
  let isAllRed = true
  for (let f of fruits) {
     if (!isAllRed) break
     isAllRed = (f.color === 'red')
  }
  console.log(isAllRed)  // false
}

以上写法可以改写:

const fruits = [
    { name: 'apple', color: 'red' },
    { name: 'banana', color: 'yellow' },
    { name: 'grape', color: 'purple' }
  ]
function test () {
  const isAllRed = fruits.every(f => f.color === 'red')
  console.log(isAllRed)  // false
}

如果想检查至少有一个水果是满足红色的,就使用some方法:

const fruits = [
    { name: 'apple', color: 'red' },
    { name: 'banana', color: 'yellow' },
    { name: 'grape', color: 'purple' }
  ]
function test () {
  const isAllRed = fruits.some(f => f.color === 'red')
  console.log(isAllRed)  // false
}

4、筛选不同颜色的水果

下面会用四种写法来实现,可以直观比较写法的简洁程度:
switch写法:

function test (color) {
  switch (color) {
    case 'red':
      return ['apple', 'strawberry']
    case 'yellow':
      return ['banana', 'pineapple']
    case 'purple':
      return ['grape', 'plum']
    default:
      return []
  }
}

对象方法:

const fruitColor = {
  red: ['apple', 'strawberry']
  yellow: ['banana', 'pineapple']
  purple: ['grape', 'plum']
}
function test (color) {
  return fruitColor[color] || []
}

使用Map方法:

const fruitColor = new Map()
.set('red', ['apple', 'strawberry'])
.set('yellow', ['banana', 'pineapple'])
.set('purple', ['grape', 'plum'])
function test (color) {
  return fruitColor.get(color) || []
}

使用数组的filter方法:

const fruits = [
    { name: 'apple', color: 'red' }, 
    { name: 'strawberry', color: 'red' }, 
    { name: 'banana', color: 'yellow' }, 
    { name: 'pineapple', color: 'yellow' }, 
    { name: 'grape', color: 'purple' }, 
    { name: 'plum', color: 'purple' }
]
function test (color) {
  return fruits.filter(f => f.color === color)
}

5 、使用函数的默认参数来赋予默认值

function test (fruit, quantity) {
 if (!fruit) return
 const q = quantity || 1
 console.log(`we have ${q}${fruit}`)
}
test('banana')  // we have 1 banana
test('apple', 2)  // we have 2 apple

以下我们可以通过改写,去除对q的定义,可以通过默认参数,不用特意写||来实现如果没有传quantity就取1

function test (fruit, quantity =  1) {
 if(!fruit) return
 console.log(`we have ${quantity}${fruit}`)
}
test('banana')
test('apple', 2)

同理,fruit也可以定义默认值:function test(fruit = 'unknown', test=1)

6、if(fruit & fruit.name)的替换写法

if(fruit & fruit.name)判断对象是否存在,存在情况下取name属性的写法,是常用的写法。现在我们使用解构赋值的方式来替换:

function test(fruit) { 
  // 如果有值,则打印出来
  if (fruit && fruit.name)  {
    console.log (fruit.name);
  } else {
    console.log('unknown');
  }
}
//测试结果
test(undefined); // unknown
test({ }); // unknown
test({ name: 'apple', color: 'red' }); // apple

替换写法:

// 解构fruit对象,只得到name属性,并为其赋予一个{}空值,用于传入undefined的情况
function test({name} = {}) {
  console.log(name || 'unknown')
}
test(undefined)  // unknown
test({})  //unknown
test({name: 'apple', color: 'red'})
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 1、使用Array.includes处理多种条件 让我们来看一下的例子: // conditionfunction...
    Java架构_师阅读 282评论 0 0
  • 世界一天比一天陌生 人 总要出走很远 很久 之后 才明白当初离开的是什么 而 我们 在越来越沉默中 找不到 同类 ...
    小飞侠303阅读 116评论 0 1
  • 虎兔在一起生活了28个年头了,虎发蔫,爱想事,兔机灵,善沟通。虽然难免磕磕绊绊,但恩爱有加。那一年,经人介...
    虎头兔尾阅读 282评论 0 0
  • 小满未满,一切刚刚好! 踩着二十四节气紧锣密鼓的步点,小满时节如约而来。 在许多中国的文化国粹中,我们似乎...
    真水无香chf阅读 327评论 0 0
  • 我的父亲是地道的东北人,出生在黑土地栽种的农村里,作为上世纪八十年代农村出来的屈指可数的大学生,父亲可谓家喻户...
    LLLLWl阅读 382评论 0 0