JS 10個 常用的技巧和鮮為人知的特性

  • 2019 年 10 月 11 日
  • 筆記

作者:Euel Duran 來源: Dev 譯者:前端小智


JS是一門發展迅速的語言,正因如此,有些新的特性和功能,咱們沒有辦法在第時間內知道。在這篇文章中,咱們主要探討一些少有人知道的特性還有一些常用技巧。

獲取查詢字元串參數

URLSearchParams 是介面定義了一些實用的方法來處理 URL 的查詢字元串,它已經存在了好幾年了,但它在開發人員中並不流行,有點讓人驚訝,咱們來看看如何使用它

var paramsString = "q=URLUtils.searchParams&topic=api";  var searchParams = new URLSearchParams(paramsString);    //Iterate the search parameters.  for (let p of searchParams) {    console.log(p);  }    searchParams.has("topic") === true; // true  searchParams.get("topic") === "api"; // true  searchParams.getAll("topic"); // ["api"]  searchParams.get("foo") === null; // true  searchParams.append("topic", "webdev");  searchParams.toString(); // "q=URLUtils.searchParams&topic=api&topic=webdev"  searchParams.set("topic", "More webdev");  searchParams.toString(); // "q=URLUtils.searchParams&topic=More+webdev"  searchParams.delete("topic");  searchParams.toString(); // "q=URLUtils.searchParams"

使用 Set 對象創建一個惟一的元素列表

用JS創建惟一列表是一項常見的任務,通常通過filters或for循環來實現,但是還有另一種方法可以利用Set對象來實現這一點。

const list = [1, 2, 3, 5, 2, 5, 7];  const uniqueList = [...new Set(list)];

將原始值數組傳遞給Set對象,它創建一組惟一值,然後使用展開操作符語法和數組字面量將這些值轉回數組。

將原始值列錶轉換為另一種類型

有時候,後台或 DOM 中處理過的數據不是咱們需要的類型,我在處理數據集的屬性時看到過這種情況。假設有以下列表:

const naiveList = ['1500', '1350', '4580'];

想要計算數組中所有元素的和,在JS中,字元串的相加把兩個字元串拼接起來,像'1' + '2'它們會連接起來為 『12』,通常,要解決這個問題,咱們會使用parseInt函數,但還有另一種方法;咱們可以將數組中的元素轉換為所需的基本類型

const castedList = naiveList.map(Number);  console.log(castedList) // [1500, 1350, 4580]

castedList現在包含具有正確Number類型的值。

扁平嵌套的數組

隨著單頁應用程式體系結構(如Redux)和前端數據規範化等概念的興起,這種「數據規範化」趨勢有時意味著所有元素的 id 都需要放在同一級別。

假設有下面的列表,咱們想扁平它:

const nestedList = [133, 235, 515, [513, 15]];  const flattenList = nestedList.flat();  console.log(flattenList) //  [133, 235, 515, 513, 15]

就像這樣,咱們的id數組被扁平了。

使用 object .freeze 避免對象被改變

隨著函數式x編程的興起,數據不可變也越來越重要,咱們可以使用 Object.freeze 來防止對象被更改。

const immutableObject = {      name: '前端小智',      url: 'https://小智66.com'  };  Object.freeze(immutableObject);    immutableObject.wechat = 'qq449245884'  immutableObject.name = '王大治'  console.log(immutableObject) // {name: "前端小智", url: "https://小智66.com"}

使用 Object.seal 創建受控對象

Object.seal() 方法封閉一個對象,阻止添加新屬性並將所有現有屬性標記為不可配置。當前屬性的值只要可寫就可以改變,Object.freeze 是啥都不能做,Object.seal() 可以改變屬性的值。

const controlledObject = {      name: '前端小智'  };  Object.seal(controlledObject);  controlledObject.name = '王大冶';  controlledObject.hero = '英雄';    console.log(controlledObject) // {name: "王大冶"}

確保數組值

使用 grid ,需要重新創建原始數據,並且每行的列長度可能不匹配, 為了確保不匹配行之間的長度相等,可以使用Array.fill方法。

let array = Array(5).fill('');  console.log(array); // outputs (5) ["", "", "", "", ""]

數組 map 的方法 (不使用Array.Map)

另一種數組 map 的實現的方式,不用 Array.map。

Array.from 還可以接受第二個參數,作用類似於數組的map方法,用來對每個元素進行處理,將處理後的值放入返回的數組。如下:

const cities = [      { name: 'Paris', visited: 'no' },      { name: 'Lyon', visited: 'no' },      { name: 'Marseille', visited: 'yes' },      { name: 'Rome', visited: 'yes' },      { name: 'Milan', visited: 'no' },      { name: 'Palermo', visited: 'yes' },      { name: 'Genoa', visited: 'yes' },      { name: 'Berlin', visited: 'no' },      { name: 'Hamburg', visited: 'yes' },      { name: 'New York', visited: 'yes' }  ];    const cityNames = Array.from(cities, ({ name}) => name);  console.log(cityNames);  // outputs ["Paris", "Lyon", "Marseille",  // "Rome", "Milan", "Palermo", "Genoa", "Berlin", "Hamburg", "New York"]

有條件的對象屬性

不再需要根據一個條件創建兩個不同的對象,可以使用展開運算符號來處理。

nst getUser = (emailIncluded) => {    return {      name: 'John',      surname: 'Doe',      ...emailIncluded && { email : '[email protected]' }    }  }    const user = getUser(true);  console.log(user); // outputs { name: "John", surname: "Doe", email: "[email protected]" }    const userWithoutEmail = getUser(false);  console.log(userWithoutEmail); // outputs { name: "John", surname: "Doe" }

動態屬性名

早期,如果屬性名需要是動態的,我們首先必須聲明一個對象,然後分配一個屬性。這些日子已經過去了,有了ES6特性,我們可以做到這一點。

const dynamic = 'email';  let user = {      name: 'John',      [dynamic]: '[email protected]'  }  console.log(user); // outputs { name: "John", email: "[email protected]" }

程式碼部署後可能存在的BUG沒法實時知道,事後為了解決這些BUG,花了大量的時間進行log 調試,這邊順便給大家推薦一個好用的BUG監控工具 Fundebug。

原文: https://dev.to/duranenmanuel/...

Tags: