我經常做這樣的東西:模式用於治療零truthy
delay = delay || 24; // default delay of 24 hours
但其實我是想允許0,0 || 24 === 24
,而不是0
。
我想知道最好的模式是從命令行或從哪裏輸入用戶輸入,並且執行相同的邏輯,只將零視爲真理。我想我已經找到了最好的模式是做正是:
delay = (delay === 0 ? delay : (delay || 24));
首先,它允許之類的東西'abc'
,這是真的錯了。但是如果我提前+
,它會讓null
滑過,這也是錯誤的。其次,非常難看,因爲它顯然是在解決語言缺陷問題,而不是用可用的語言工具做一些優雅的事情。而且不可讀。我正在做一些思路,我想用一行實際的代碼來做(不是技術上的一行,就像這樣)。但大多數其他的想法我已經得到甚至醜陋:
delay = typeof delay === 'number' ? delay : 24; // but typeof NaN === 'number', so
delay = (!isNaN(delay) && typeof delay === 'number') ? delay : 24;
注意,這實際上將與字符串工作 - 如果我有興趣在接受""
,然後
str = typeof str === 'string' ? str : 'default';
由於沒有NaN
孔,這是智能可讀的:如果我們有一個字符串使用,否則使用defaut。
還是這條路線:
delay = !isNaN(+delay) ? delay : 24; // fails on null
delay = !Number.isNaN(+delay) ? delay : 24; // still fails on null
// same thing with null check, now way uglier than we started
所以我還是很喜歡我的哈克三元和布爾邏輯更好。是的,我正在尋找一種精簡的單行解決方案,因爲JS充斥着各種模式,而其他許多語言中聰明的東西在JS中被廣泛認可,易讀和清晰。但我是新手,並試圖學習好的模式,因此,這個問題。
更明確的要求:
0
需要去0
。undefined
需要去24
。- 除
NaN
之外,typeof
下的所有實際數字都需要自行解析。 - 我強烈地感受到
null
應該去24
,因爲我很少使用故意把null
和undefined
不同的JS代碼。我覺得保持這種方式會更好。 - 我稍微感覺
NaN
應該去24
,因爲這更接近||
模式。麻煩的事情應該默認。 'abc'
應該去24 - 在我的真實應用程序這是用戶輸入,並且用戶不應該錯誤地鍵入,說一個電子郵件。'123abc'
理想情況下應去24
,其轉換爲Number
漁獲,但parseInt
沒有。我相信電子郵件可以從數字開始,所以這就促使人們認爲這是應該被捕獲的東西。
下劃線或lodash答案是特別接受,,那些你們誰給我講想成爲「聰明」,而不是寫一個2-3線功能。這些庫的存在正是因爲許多簡單的2-3行函數在世界各地許多代碼庫中的許多地方完成了相同的事情,並且它的可讀性和可維護性更強,並且可以將它們隔離爲諸如_.readNumber
。如果不存在這樣的方法,並且我能夠提出足夠一般的要求,我將自己提交一個投票請求,並將其作爲對這個問題的回答發佈。這是我喜歡JS的東西 - 它具有良好的生態系統,因此很有可能而不是必須編寫這些實用程序方法。由於我特別處理用戶輸入,因此編寫稍微更專用的函數並提交給commander.js可能會更好,這是我一直需要的。
爲什麼不'delay = delay> -1:delay:24'?負值是否被接受? –
@ Karl-AndréGagnon在我的案例中沒有,這其實很合理。 – djechlin
「NaN洞」是什麼意思? 'num = typeof num ==='number'如何? num:24'不足? –