能夠提高幸福感的js小技巧(上)

1. 類型強制轉換

1.1 string強制轉換爲數字

能夠用 *1來轉化爲數字(其實是調用 .valueOf方法) 而後使用 Number.isNaN來判斷是否爲 NaN,或者使用 a!==a 來判斷是否爲 NaN,由於 NaN!==NaN數組

'32' * 1  // 32
'ds' * 1  // NaN
null * 1  // 0
undefined * 1  // NaN
1 * { valueOf: ()=>  '3'}   // 3

經常使用:也可使用 +來轉化字符串爲數字框架

+ '123' // 123
+  'ds'  // NaN
+  ' '   // 0
+ null // 0
+ undefined  // NaN
+ { valueOf: ()=>'3'}    // 3

1.2 object強制轉化爲string

可使用 字符串+Object 的方式來轉化對象爲字符串(其實是調用 .toString() 方法)函數

'the Math object:' + Math   // "the Math object:[object Math]"
'the JSON object:' + JSON  // "the JSON object:[object JSON]"

固然也能夠覆蓋對象的 toStringvalueOf方法來自定義對象的類型轉換:優化

2  * { valueOf: ()=> '3'}           // 6
'J' + { toString: ()=> 'S'}         // "JS"

《Effective JavaScript》P11:當 +用在鏈接字符串時,當一個對象既有 toString方法又有 valueOf方法時候,JS經過盲目使用 valueOf方法來解決這種含糊。對象經過 valueOf方法強制轉換爲數字,經過 toString方法強制轉換爲字符串ui

'' + {toString:()=> 'S' valueOf:()= 'J' }         // J

1.3 使用Boolean過濾數組中的全部假值

咱們知道JS中有一些假值:falsenull0""undefinedNaN,怎樣把數組中的假值快速過濾呢,可使用Boolean構造函數來進行一次轉換url

const compact = arr => arr.filter( Boolean) compact([0, 1, false, 2, '', 3, 'a', 'e' * 23, NaN, 's', 34])             // [ 1, 2, 3, 'a', 's', 34 ]

1.4 雙位運算符 ~~

可使用雙位操做符來替代 Math.floor()。雙否認位操做符的優點在於它執行相同的操做運行速度更快。spa

Math.floor(4.9) === 4  //true // 簡寫爲:
~~4.9 === 4      //true

不過要注意,對整數來講 ~~ 運算結果與 Math.floor() 運算結果相同,而對於負數來講不相同:.net

~~4.5            // 4
Math.floor(4.5)        // 4
~~-4.5    // -4
Math.floor(-4.5)        // -5

1.5 短路運算符

咱們知道邏輯與 &&與邏輯或 ||是短路運算符,短路運算符就是從左到右的運算中前者知足要求,就再也不執行後者了;能夠理解爲:code

  • &&爲取假運算,從左到右依次判斷,若是遇到一個假值,就返回假值,之後再也不執行,不然返回最後一個真值對象

  • ||爲取真運算,從左到右依次判斷,若是遇到一個真值,就返回真值,之後再也不執行,不然返回最後一個假值

let param1 = expr1 && expr2 let param2 = expr1 || expr2

所以能夠用來作不少有意思的事,好比給變量賦初值:

let variable1 let variable2 = variable1  ||  'foo'

若是variable1是真值就直接返回了,後面短路就不會被返回了,若是爲假值,則會返回後面的 foo

也能夠用來進行簡單的判斷,取代冗長的 if語句:

let variable = param && param.prop

若是 param若是爲真值則返回 param.prop屬性,不然返回 param這個假值,這樣在某些地方防止 paramundefined的時候還取其屬性形成報錯。

1.6 取整 |0

對一個數字 |0能夠取整,負數也一樣適用, num|0

1.3 | 0    // 1
-1.9 | 0   // -1

1.7 判斷奇偶數 &1

對一個數字 &1能夠判斷奇偶數,負數也一樣適用, num&1

const num= 3; !!(num & 1)               // true
!!(num % 2)              // true

2. 函數

2.1 函數默認值

func = (l, m = 3, n = 4) => (l * m * n); func(2)             //output: 24

注意,傳入參數爲 undefined或者不傳入的時候會使用默認參數,可是傳入 null仍是會覆蓋默認參數。

2.2 強制參數

默認狀況下,若是不向函數參數傳值,那麼JS 會將函數參數設置爲 undefined。其它一些語言則會發出警告或錯誤。要執行參數分配,可使用 if語句拋出未定義的錯誤,或者能夠利用 強制參數

mandatory = ( ) => { throw  new  Error('Missing parameter!'); } foo = (bar = mandatory( )) => {    // 這裏若是不傳入參數,就會執行manadatory函數報出錯誤
return bar; }

2.3 隱式返回值

返回值是咱們一般用來返回函數最終結果的關鍵字。只有一個語句的箭頭函數,能夠隱式返回結果(函數必須省略大括號 {},以便省略返回關鍵字)。

要返回多行語句(例如對象文本),須要使用 ()而不是 {}來包裹函數體。這樣能夠確保代碼以單個語句的形式進行求值。

function calcCircumference(diameter) { return  Math.PI * diameter } // 簡寫爲:
 calcCircumference = diameter => ( Math.PI * diameter; )

2.4 惰性載入函數

在某個場景下咱們的函數中有判斷語句,這個判斷依據在整個項目運行期間通常不會變化,因此判斷分支在整個項目運行期間只會運行某個特定分支,那麼就能夠考慮惰性載入函數

function foo(){ if(a !== b){ console.log('aaa') }else{ console.log('bbb') } } // 優化後
function foo(){ if(a != b){ foo = function(){ console.log('aaa') } }else{foo = function(){ console.log('bbb') } } return foo(); } 

那麼第一次運行以後就會覆寫這個方法,下一次再運行的時候就不會執行判斷了。固然如今只有一個判斷,若是判斷不少,分支比較複雜,那麼節約的資源仍是可觀的。

2.5 一次性函數

跟上面的惰性載入函數同理,能夠在函數體裏覆寫當前函數,那麼能夠建立一個一次性的函數,從新賦值以前的代碼至關於只運行了一次,適用於運行一些只須要執行一次的初始化代碼

var sca = function() { console.log('msg') sca = function() { console.log('foo') } } sca() // msg
sca()        // foo
sca()        // foo

3. 代碼複用

3.1 Object [key]

雖然將 foo.bar 寫成 foo['bar'] 是一種常見的作法,可是這種作法構成了編寫可重用代碼的基礎。許多框架使用了這種方法,好比element的表單驗證。

請考慮下面這個驗證函數的簡化示例:

function validate(values) { if(!values.first) return false; if(!values.last) return false; return  true; } console.log(validate({first:'Bruce',last:'Wayne'}));  // true 

上面的函數完美的完成驗證工做。可是當有不少表單,則須要應用驗證,此時會有不一樣的字段和規則。若是能夠構建一個在運行時配置的通用驗證函數,會是一個好選擇。

// object validation rules
const schema = { first: { required:true }, last: { required:true } } // universal validation function
const  validate = (schema, values) => { for(field in schema) { if(schema[field].required) { if(!values[field]) { return  false; } } } return true; } console.log(validate(schema, {first:'Bruce'})); // false
console.log(validate(schema, {first:'Bruce',last:'Wayne'})); // true 

如今有了這個驗證函數,咱們就能夠在全部窗體中重用,而無需爲每一個窗體編寫自定義驗證函數。

如下是原地址:

https://mp.weixin.qq.com/s?src=11&timestamp=1570409940&ver=1897&signature=I4iRaadFDIs3ZeTtAZWILnz*dEk-eUOIa0mY*Dqc2a9xKj38SWygNNL0Xi4vxUzqA9Wp4mfgXfXdSDLih4jlOaaZG29hW6NDPps8WMEYmseGYkhvq2kWRWKUbiTS29vB&new=1

相關文章
相關標籤/搜索