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