摘要:兩個(gè)例子比較而言,語(yǔ)句的實(shí)現(xiàn)可能更具兼容性,可以適應(yīng)于數(shù)組元素是小數(shù)的情況。若數(shù)組元素為浮點(diǎn)類(lèi)型,第二個(gè)例子就無(wú)法正常使用。開(kāi)發(fā)環(huán)境推薦是基于瀏覽器的集成式開(kāi)發(fā)環(huán)境,支持絕大部分編程語(yǔ)言,包括小程序等等,無(wú)需下載安裝程序,一鍵切換開(kāi)發(fā)環(huán)境。
Coding Tip: Try to Code Without If-statements
現(xiàn)在開(kāi)始,請(qǐng)嘗試盡量避免使用if語(yǔ)句來(lái)實(shí)現(xiàn)我們的業(yè)務(wù)
你可能會(huì)疑問(wèn)不使用if有什么好處?額~,可能也沒(méi)啥很明顯的好處,就是換種思考方式來(lái)解決問(wèn)題。if-else并沒(méi)有錯(cuò),但在某些情況下大量的if-else可能會(huì)降低代碼可讀性。下面會(huì)列舉一些實(shí)例帶你感受其中的奧妙。
Challenge #1: 統(tǒng)計(jì)數(shù)值數(shù)組中共有多少個(gè)奇數(shù)已知一個(gè)整數(shù)類(lèi)型數(shù)組,統(tǒng)計(jì)該數(shù)組中奇數(shù)的個(gè)數(shù)
const arrayOfIntegers = [1, 4, 5, 9, 0, -1, 5];
if實(shí)現(xiàn)
let counter = 0; arrayOfIntegers.forEach((integer) => { const remainder = Math.abs(integer % 2); if (remainder === 1) { counter++; } }); console.log(counter);
非if實(shí)現(xiàn)
let counter = 0; arrayOfIntegers.forEach((integer) => { const remainder = Math.abs(integer % 2); // 偶數(shù)除2的余數(shù)為零,奇數(shù)的余數(shù)為一 counter += remainder; }); console.log(counter);
記: 上述兩個(gè)例子,forEach是會(huì)改變?cè)瓟?shù)組的,方法是可變的,違背了當(dāng)下所提倡的函數(shù)式編程immutable理念,不用在意,不是本文關(guān)注點(diǎn)。兩個(gè)例子比較而言,if語(yǔ)句的實(shí)現(xiàn)可能更具兼容性,可以適應(yīng)于數(shù)組元素是小數(shù)的情況。若數(shù)組元素為浮點(diǎn)類(lèi)型,第二個(gè)例子就無(wú)法正常使用。
Challenge #2: 判斷一個(gè)日期是周末還是工作日實(shí)現(xiàn)一個(gè)函數(shù),日期對(duì)象 new Date()作為輸入,根據(jù)不同日期返回當(dāng)天是工作日還是周末。
if實(shí)現(xiàn)
const weekendOrWeekday = inputDate => { const day = inputDate.getDay(); if (day === 0 || day === 6) { return "weekend"; } return "weekday"; // Or, for ternary fans: // return (day === 0 || day === 6) ? "weekend" : "weekday"; }; console.log(weekendOrWeekday(new Date()));
非if實(shí)現(xiàn)
const weekendOrWeekday = (inputDate) => { const day = inputDate.getDay(); return weekendOrWeekday.labels[day] || weekendOrWeekday.labels["default"]; }; weekendOrWeekday.labels = { 0: "weekend", 6: "weekend", default: "weekday" }; console.log(weekendOrWeekday(new Date()));
有沒(méi)有注意到,if語(yǔ)句中的數(shù)字代表哪天是周末,判定條件分布的較為零散,我們需要做的是將數(shù)字和周末或工作日類(lèi)型對(duì)應(yīng)起來(lái),如例子2,可以使用一個(gè)對(duì)象或者map來(lái)存儲(chǔ)對(duì)應(yīng)關(guān)系。
上述兩個(gè)例子對(duì)比,可以明顯看出非if代碼實(shí)現(xiàn)具有更好的可讀性和擴(kuò)展性
Challenge #3: The doubler function (here be dragons),翻譯不出來(lái)~尬~實(shí)現(xiàn)一個(gè)doubler函數(shù),根據(jù)輸入不同,做如下處理:
若輸入是number類(lèi)型, 做翻倍處理(5 => 10, -10 => -20)
若輸入是string類(lèi)型,重復(fù)每個(gè)字符("hello" => "hheelloo")
若輸入是function類(lèi)型,調(diào)用執(zhí)行兩次函數(shù)
若輸入是array類(lèi)型,對(duì)數(shù)組的每個(gè)元素做doubler處理
若輸入是object類(lèi)型,對(duì)對(duì)象的每個(gè)屬性做doubler處理
switch實(shí)現(xiàn)
const doubler = (input) => { switch (typeof input) { case "number": return input + input; case "string": return input .split("") .map(letter => letter + letter) .join(""); case "object": Object.keys(input) .map(key => (input[key] = doubler(input[key]))); return input; case "function": input(); input(); } }; console.log(doubler(-10)); console.log(doubler("hey")); console.log(doubler([5, "hello"])); console.log(doubler({ a: 5, b: "hello" })); console.log( doubler(function() { console.log("call-me"); }), );
非switch實(shí)現(xiàn)
const doubler = (input) => { return doubler.operationsByType[typeof input](input); }; doubler.operationsByType = { number: (input) => input + input, string: (input) => input .split("") .map((letter) => letter + letter) .join(""), function: (input) => { input(); input(); }, object: (input) => { Object.keys(input) .map((key) => (input[key] = doubler(input[key]))); return input; }, }; console.log(doubler(-10)); console.log(doubler("hey")); console.log(doubler([5, "hello"])); console.log(doubler({ a: 5, b: "hello" })); console.log( doubler(function() { console.log("call-me"); }), );
和Challenge #2類(lèi)似,將條件值聚合在一起做統(tǒng)一處理。
總結(jié)當(dāng)if-else的判斷條件較多時(shí),將條件做集中處理(用object存儲(chǔ)其對(duì)應(yīng)關(guān)系--條件做key,處理做value)。好處是增刪某個(gè)條件變得容易,代碼更加可讀,提倡使用key-value對(duì)應(yīng)來(lái)取代一部分的if-else的條件判斷。
【開(kāi)發(fā)環(huán)境推薦】Cloud Studio 是基于瀏覽器的集成式開(kāi)發(fā)環(huán)境,支持絕大部分編程語(yǔ)言,包括 HTML5、PHP、Python、Java、Ruby、C/C++、.NET 小程序等等,無(wú)需下載安裝程序,一鍵切換開(kāi)發(fā)環(huán)境。 Cloud Studio提供了完整的 Linux 環(huán)境,并且支持自定義域名指向,動(dòng)態(tài)計(jì)算資源調(diào)整,可以完成各種應(yīng)用的開(kāi)發(fā)編譯與部署。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/107038.html
摘要:譯者按試著不用擼代碼,是件很有趣的事,而且,萬(wàn)一你領(lǐng)會(huì)了什么是數(shù)據(jù)即代碼,代碼即數(shù)據(jù)呢原文譯者為了保證可讀性,本文采用意譯而非直譯。但是,不使用的話,有時(shí)候可以增加代碼的可讀性。 譯者按: 試著不用if擼代碼,是件很有趣的事,而且,萬(wàn)一你領(lǐng)會(huì)了什么是數(shù)據(jù)即代碼,代碼即數(shù)據(jù)呢? 原文: Coding Tip: Try to Code Without If-statements 譯者:...
摘要:更多信息嵌套三元運(yùn)算符之前改造后我承認(rèn),一開(kāi)始,使用嵌套三元運(yùn)算符的想法的確令人倒胃口。當(dāng)然使用三元運(yùn)算符具有兩面性,但就我個(gè)人而言,嵌套三元運(yùn)算符真的越來(lái)越吸引我了。 在這篇文章中,我介紹了一些編程時(shí)嘗試使用的模式。這些模式是多年來(lái)我自己在工作中實(shí)踐的結(jié)果,也有是從同事那里偷偷學(xué)到的。 這些模式?jīng)]有特定的順序,只是一個(gè)簡(jiǎn)單的集合。 提前退出(early exits) function...
摘要:函數(shù)式編程一開(kāi)始我并不理解。漸漸地,我熟練掌握了使用函數(shù)式的方法去編程。但是自從學(xué)習(xí)了函數(shù)式編程,我將循環(huán)都改成了使用和來(lái)實(shí)現(xiàn)。只有數(shù)據(jù)和函數(shù),而且因?yàn)楹瘮?shù)沒(méi)有和對(duì)象綁定,更加容易復(fù)用。在函數(shù)式的中,這些問(wèn)題不復(fù)存在。 譯者按: 當(dāng)從業(yè)20的JavaScript老司機(jī)學(xué)會(huì)函數(shù)式編程時(shí),他扔掉了90%的特性,也不用面向?qū)ο罅耍詈蟀l(fā)現(xiàn)了真愛(ài)?。。?! 原文: How I rediscov...
閱讀 1921·2021-09-03 10:50
閱讀 1382·2019-08-30 15:55
閱讀 3429·2019-08-30 15:52
閱讀 1288·2019-08-30 15:44
閱讀 1020·2019-08-30 15:44
閱讀 3369·2019-08-30 14:23
閱讀 3609·2019-08-28 17:51
閱讀 2338·2019-08-26 13:52