首頁  >  文章  >  web前端  >  JavaScript開發人員需要知道的簡寫技巧(高階篇)

JavaScript開發人員需要知道的簡寫技巧(高階篇)

云罗郡主
云罗郡主轉載
2018-10-19 14:41:401907瀏覽

這篇文章帶給大家的內容是關於JavaScript開發人員需要知道的簡寫技巧(高級篇),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

1、變數賦值

當一個變數的值賦給另一個變數時,首先需要確保原值不是 null、未定義的或空值。

可以透過寫一個包含多個條件的判斷語句來實現:

if (variable1 !== null || variable1 !== undefined || variable1 !== '') {
     let variable2 = variable1;
}

或簡寫為以下的形式:

const variable2 = variable1  || 'new';

可以將下面的程式碼貼到 es6console 中,自己測試:

let variable1;
let variable2 = variable1  || '';
console.log(variable2 === ''); // prints true
variable1 = 'foo';
variable2 = variable1  || '';
console.log(variable2); // prints foo

2、預設值賦值

如果預期參數是null 或未定義,則不需要寫六行程式碼來指派預設值。我們可以只使用一個簡短的邏輯運算符,只用一行程式碼就能完成相同的操作。

let dbHost;
if (process.env.DB_HOST) {
  dbHost = process.env.DB_HOST;
} else {
  dbHost = 'localhost';
}

簡寫為:

const dbHost = process.env.DB_HOST || 'localhost';

3、物件屬性

ES6 提供了一個很簡單的方法,來指派屬性的物件。如果屬性名稱與 key 名相同,則可以使用簡寫。

const obj = { x:x, y:y };

簡寫為:

const obj = { x, y };

4、箭頭函數

#經典函數很容易讀寫,但是如果把它們嵌套在其它函數中進行呼叫時,整個函數就會變得有些冗長和混亂。這時候可以使用箭頭函數來簡寫:

function sayHello(name) {
  console.log('Hello', name);
}
 
setTimeout(function() {
  console.log('Loaded')
}, 2000);
 
list.forEach(function(item) {
  console.log(item);
});

簡寫為:

sayHello = name => console.log('Hello', name);
setTimeout(() => console.log('Loaded'), 2000);
list.forEach(item => console.log(item));

5、隱含回傳值

傳回值是我們通常用來傳回函數最終結果的關鍵字。只有一個語句的箭頭函數,可以隱式傳回結果(函數必須省略括號({ }),以便省略回傳關鍵字)。

要傳回多行語句(例如物件文字),需要使用()而不是{ }來包裹函數體。這樣可以確保程式碼以單一語句的形式進行求值。

function calcCircumference(diameter) {
  return Math.PI * diameter
}

簡寫為:

calcCircumference = diameter => (
  Math.PI * diameter;
)

6、預設參數值

#可以使用 if 語句來定義函數參數的預設值。 ES6 中規定了可以在函數宣告中定義預設值。

function volume(l, w, h) {
  if (w === undefined)
    w = 3;
  if (h === undefined)
    h = 4;
  return l * w * h;
}

簡寫為:

volume = (l, w = 3, h = 4 ) => (l * w * h);
volume(2) //output: 24

7、模板字串

#過去我們習慣了使用「 」將多個變數轉換為字串,但是有沒有更簡單的方法呢?

ES6 提供了對應的方法,我們可以使用反引號和 $ { } 將變數合成一個字串。

const welcome = 'You have logged in as ' + first + ' ' + last + '.'
const db = 'http://' + host + ':' + port + '/' + database;

簡寫為:

const welcome = `You have logged in as ${first} ${last}`;
const db = `http://${host}:${port}/${database}`;

8、解構賦值

解構賦值是一種表達式,用於從陣列或物件中快速提取屬性值,並賦給定義的變數。

在程式碼簡寫方面,解構賦值能達到很好的效果。

const observable = require('mobx/observable');
const action = require('mobx/action');
const runInAction = require('mobx/runInAction');
const store = this.props.store;
const form = this.props.form;
const loading = this.props.loading;
const errors = this.props.errors;
const entity = this.props.entity;

簡寫為:

import { observable, action, runInAction } from 'mobx';
const { store, form, loading, errors, entity } = this.props;

甚至可以指定自己的變數名稱:

const { store, form, loading, errors, entity:contact } = this.props;

9、展開運算子

展開運算子是在ES6 中引入的,使用展開運算子能夠讓JavaScript 程式碼更加有效和有趣。

使用展開運算子可以取代某些陣列函數。

// joining arrays
const odd = [1, 3, 5];
const nums = [2 ,4 , 6].concat(odd);
 
// cloning arrays
const arr = [1, 2, 3, 4];
const arr2 = arr.slice( )

簡寫為:

// joining arrays
const odd = [1, 3, 5 ];
const nums = [2 ,4 , 6, ...odd];
console.log(nums); // [ 2, 4, 6, 1, 3, 5 ]
 
// cloning arrays
const arr = [1, 2, 3, 4];
const arr2 = [...arr];

和 concat( ) 功能不同的是,使用者可以使用擴充運算子在任何一個陣列中插入另一個陣列。

const odd = [1, 3, 5 ];
const nums = [2, ...odd, 4 , 6];

也可以將展開運算子和ES6 解構符號結合使用:

const { a, b, ...z } = { a: 1, b: 2, c: 3, d: 4 };
console.log(a) // 1
console.log(b) // 2
console.log(z) // { c: 3, d: 4 }

10、強制參數

預設情況下,如果不向函數參數傳值,那麼JavaScript 會將函數參數設為未定義。其它一些語言則會發出警告或錯誤。要執行參數分配,可以使用if語句拋出未定義的錯誤,或者可以利用「強制參數」。

function foo(bar) {
  if(bar === undefined) {
    throw new Error('Missing parameter!');
  }
  return bar;
}

簡寫為:

mandatory = ( ) => {
  throw new Error('Missing parameter!');
}
foo = (bar = mandatory( )) => {
  return bar;
}

11、Array.find

如果你曾經寫過普通 JavaScript 中的 find 函數,那麼你可能使用了 for 迴圈。在 ES6 中,介紹了一個名為 find()的新數組函數,可以實現 for 迴圈的簡寫。

const pets = [
  { type: 'Dog', name: 'Max'},
  { type: 'Cat', name: 'Karl'},
  { type: 'Dog', name: 'Tommy'},
]
function findDog(name) {
  for(let i = 0; i<pets.length; ++i) {
    if(pets[i].type === &#39;Dog&#39; && pets[i].name === name) {
      return pets[i];
    }
  }
}

簡寫成:

pet = pets.find(pet => pet.type ==='Dog' && pet.name === 'Tommy');
console.log(pet); // { type: 'Dog', name: 'Tommy' }

12、Object [key]

雖然將foo.bar 寫成foo ['bar'] 是一種常見的做法,但這種做法構成了編寫可重複使用程式碼的基礎。

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

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

現在有了這個驗證函數,我們就可以在所有窗體中重複使用,而無需為每個窗體編寫自訂驗證函數。

13、雙位運算子

位元運算子是 JavaScript 初級教學的基本知識點,但是我們卻不常使用位元運算子。因為在不處理二進位的情況下,沒有人願意使用 1 和 0。

但是雙位運算子卻有一個很實用的案例。你可以使用雙位運算子來取代 Math.floor( )。雙重否定位元操作符的優點在於它執行相同的操作運行速度更快。

Math.floor(4.9) === 4  //true

簡寫為:

~~4.9 === 4  //true

以上就是對JavaScript開發人員需要知道的簡寫技巧(高級篇)的全部介紹,如果您想了解更多有關JavaScript影片教學,請關注PHP中文網。

以上是JavaScript開發人員需要知道的簡寫技巧(高階篇)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除