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