JavaScript 中常用簡寫技巧總結

在這里插入圖片描述

平時我們寫代碼時最高級的境界是自己寫的東西別人看不懂!哈哈哈!分享一些自己常用的js簡寫技巧,長期更新,會著重挑選一些實用的簡寫技巧,使自己的代碼更簡潔優雅~
這里只會收集一些大多數人不知道的用法,但是確實能提高自己的編碼技巧,像ES6那些基礎的簡寫語法或者是三目運算符代替if else那些我覺得是基礎,沒必要寫在這里浪費精力。

另外推薦一個只用一行代碼實現一個方法的實用網站

If-Else 用 || 或 ?? 運算符進行簡化

邏輯或操作符 ||,這里要注意的是 0‘’ 也會認為是false

如果 || 前面的值是 0falsenullundefinedNaN其中的任意一種,則直接返回||后面的值

function(obj){var a = obj || {}
}
// 等價于 =>>
function(obj){var a;if(obj === 0 || obj === "" || obj === false || obj === null || obj === undefined ||isNaN(obj)){a = {}} else {a = obj;}
}

空值合并操作符??如果沒有定義左側返回右側。如果是,則返回左側。
這種方法非常實用,有時候僅僅只是想判斷一個字段有沒有值,而不是把空字符串或者0也當做false處理

function(obj){var a = obj ?? {}
}
// 等價于 =>>
function(obj){var a;if(obj === null || obj === undefined){a = {}} else {a = obj;}
}

輸入框非空的判斷(有時候不想把0當成false可以用此方法。比如分數0也是個值,這種情況就不能認為是false)

if(value !== null && value !== undefined && value !== ''){}
// 等價于 ==>
if((value ?? '') !== ''){}

includes的正確使用姿勢

在上面邏輯或操作符||代碼段里有一個if判斷比較長,這時候就可以用includes去簡化代碼

if(obj === 0 || obj === "" || obj === false || obj === null || obj === undefined
){// ...
}// 使用includes簡化
if([0, '', false, null, undefined].includes(obj)){// ...
}

防止崩潰的可選鏈(?.)

可選鏈操作符?. 如果訪問未定義的屬性,則會產生錯誤。這就是可選鏈的用武之地。在未定義屬性時使用可選鏈運算符,undefined將返回而不是錯誤。這可以防止你的代碼崩潰。

const student = {name: "lwl",address: {state: "New York"},
}// 一層一層判斷
console.log(student && student.address && student.address.ZIPCode) // 輸出:undefined
// 使用可選鏈操作符
console.log(student?.address?.ZIPCode) // 輸出:undefined

可選鏈運算符也可以用于方法調用。如果方法存在,它將被調用,否則將返回 undefined。例如:

onst obj = {foo() {console.log('Hello from foo!')}
}obj.foo?.() // 輸出:'Hello from foo!'
obj.bar?.() // 輸出:undefined,因為 bar 方法不存在

同樣,數組也可以使用。例如:

const arr = [1, 2, 3, 4]console.log(arr[0]) // 輸出:1
console.log(arr[4]) // 輸出:undefined// 使用可選鏈運算符
console.log(arr?.[0]) // 輸出:1
console.log(arr?.[4]) // 輸出:undefined
console.log(arr?.[0]?.toString()) // 輸出:'1'

邏輯空賦值(??=)

邏輯空賦值??= 邏輯空賦值運算符(x ??= y)僅在 x 是 nullish (null 或 undefined) 時對其賦值。

const a = { duration: 50 };a.duration ??= 10;
console.log(a.duration);
// expected output: 50a.speed ??= 25;
console.log(a.speed);
// expected output: 25

快速生成1-10的數組

生成0-9,利用了數組的下標值

// 方法一
const arr1 = [...new Array(10).keys()]
// 方法二
const arr2 = Array.from(Array(10), (v, k) => k)

生成1-10,通過map的特性

const arr2 = [...Array(10)].map((v, i) => i + 1)

快速生成10個0的數組

const arr = new Array(10).fill(0)

快速生成10個[]的數組(二維數組)

二維數組不能直接寫成new Array(10).fill([])(也就是fill方法不能傳引用類型的值,[]換成new Array()也不行),因為fill里傳入引用類型值會導致每一個數組都指向同一個地址,改變一個數據的時候其他數據也會隨之改變,詳見 mdn官方說明

// 錯誤寫法
const arr = new Array(10).fill([]) // 注意這是錯誤寫法,不要這么寫
// 正確寫法
const arr = new Array(10).fill().map(() => new Array())

數組降維

你是否還在用遞歸給一個多維數組降維?如果是,那你應該知道一下es6的 flat()方法。
如果不確定需要降維的數組有多深,可以傳入最大值作為參數Infinity,默認值深度為1

const arr = [1, [2, [3, 4], 5], 6]
const flatArr = arr.flat(Infinity) // 輸出 [1, 2, 3, 4, 5, 6]

你是否在使用map的時候想要對數組降維?大概像這樣

const arr = [1, 2, 3, 4]
const result = arr.map(v => [v, v * 2]).flat()
console.log(result); // 輸出 [1, 2, 2, 4, 3, 6, 4, 8]

其實js也提供了更簡便的方法,那就是flatMap(),可以改成這樣:

const result = arr.flatMap(v => [v, v * 2])

從數組中刪除重復項

在 JavaScript 中,Set 是一個集合,它允許你僅存儲唯一值。這意味著刪除任何重復的值。
因此,要從數組中刪除重復項,你可以將其轉換為集合,然后再轉換回數組。

const numbers = [1, 1, 20, 3, 3, 3, 9, 9];
const uniqueNumbers = [...new Set(numbers)]; // -> [1, 20, 3, 9]

它是如何工作的?
new Set(numbers)從數字列表中創建一個集合。創建集合會自動刪除所有重復值。
展開運算符…將任何可迭代對象轉換為數組。這意味著將集合轉換回數組。[…new Set(numbers)]

在沒有第三個變量的情況下交換兩個變量

在 JavaScript 中,你可以使用解構從數組中拆分值。這可以應用于交換兩個變量而無需第三個
比較簡單,es6語法

let x = 1;
let y = 2;// 交換變量
[x, y] = [y, x];

將對象的值收集到數組中

用于Object.values()將對象的所有值收集到一個新數組中

const info = { name: "Matt", country: "Finland", age: 35 };// LONGER FORM
let data = [];
for (let key in info) {data.push(info[key]);
}// SHORTHAND
const data = Object.values(info);

指數運算符(用的不多)

你Math.pow()習慣把一個數字提高到一個冪嗎?你知道你也可以使用**運算符嗎?
雖然可以簡寫,不過我還是建議寫成Math.pow()方法,代碼更有語義化。
注意:**運算符要求操作數為數值類型,不過在js里也能正常運行。

Math.pow(2, 3); // 輸出: 8 
2 ** 3; // 輸出: 8 Math.pow(4, 0.5); // 輸出: 2 
4 ** 0.5; // 輸出: 2 Math.pow(3, -2); // 輸出: 0.1111111111111111 
3 ** -2; // 輸出: 0.1111111111111111 Math.pow('2', '3'); // 輸出: 8 (參數被自動轉換為數字) 
'2' ** '3'; // js中輸出: 8,其他語言可能報錯

Math.floor() 簡寫(用的不多)

向下取整Math.floor()并不是什么新鮮事。但是你知道你也可以使用~~運算符嗎?
同上雖然可以簡寫,不過我還是建議寫成Math.floor()方法,代碼更有語義化。
注意:對于正數而言兩者都是直接去掉小數位,但對于負數來說Math.floor()是向下取整,~~依然是只去掉小數位,整數位不變。 請看下面輸出結果:

Math.floor(3.14); // 輸出: 3 
Math.floor(5.7); // 輸出: 5 
Math.floor(-2.5); // 輸出: -3 
Math.floor(10); // 輸出: 10~~3.14; // 輸出: 3 
~~5.7; // 輸出: 5 
~~(-2.5); // 輸出: -2 
~~10; // 輸出: 10

逗號運算符(,)

逗號( , )運算符對它的每個操作數從左到右求值,并返回最后一個操作數的值。這讓你可以創建一個復合表達式,其中多個表達式被評估,復合表達式的最終值是其成員表達式中最右邊的值。這通常用于為 for 循環提供多個參數。

這里只說一下函數return的時候用逗號運算符簡化代碼的技巧,其他用法請直接點擊查看官方文檔。
舉一個簡單的例子:

// 簡化前
const result = arr => {arr.push('a')return arr
}
console.log(result([1,2])) // 輸出:[1, 2, 'a']

這段代碼需要返回修改后的數組,不能直接return arr.push(‘a’),因為push的返回值是修改后數組的長度,這時候可以用逗號運算符簡化成一行代碼。

// 簡化后
const result = arr => (arr.push('a'), arr)
console.log(result([1,2])) // 輸出:[1, 2, 'a']

Array.map()的簡寫

比如想要拿到接口返回的特定字段的值,可以用解構賦值和對象的簡寫方法對map方法簡寫。
比如接口返回數據,此時如果只想要數據里的id和name,就可以用下面的簡寫方式。

// 接口返回數據
res = [{id: 1,name: 'zhangsan',age: 16,gender: 0
}, {id: 2,name: 'lisi',age: 20,gender: 1
}]// 第一種方法:箭頭函數、 解構賦值
const data = res.map(({id, name}) => ({id, name}))
// 第二種方法:箭頭函數、返回對象(相對更容易理解)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39023.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39023.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39023.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL新的版本發布模型 - 創新版本和長支持版本

2023年7月18日,MySQL發布了最新數據庫服務器版本8.1.0,其中變化最大的是MySQL采用了新的版本發布模型。本文是官方博客的中文摘抄和個人理解,原文更精彩: https://blogs.oracle.com/mysql/post/introducing-mysql-innovation-and-longterm-su…

網絡原理(JavaEE初階系列11)

目錄 前言: 1.網絡原理的理解 2.應用層 2.1自定義協議的約定 2.1.1確定要傳輸的信息 2.1.2確定數據的格式 3.傳輸層 3.1UDP 3.1.1UDP報文格式 3.2TCP 3.2.1確認應答 3.2.2超時重傳 3.2.3連接管理 3.2.3.1三次握手 3.2.3.2四次揮手 3.2.4滑動窗口 3.…

bigemap如何添加mapbox地圖?

第一步 打開瀏覽器,找到你要訪問的地圖的URL地址,并且確認可以正常在瀏覽器中訪問;瀏覽器中不能訪問,同樣也不能在軟件中訪問。 以下為常用地圖源地址: 天地圖: http://map.tianditu.gov.cn 包含&…

【SA8295P 源碼分析】75 - QNX GVM Secpol 安全策略文件 gvm_la.txt 內容分析解讀

【SA8295P 源碼分析】75 - QNX GVM Secpol 安全策略文件 gvm_la.txt 內容分析解讀 第一部分、gvm_la_t secpol 類型定義第二部分、gvm_la_t 內存透傳相關配置第三部分、gvm_la_t 中斷透傳相關配置第四部分、gvm_la_t 類型的進程允許通信的所有 secpol 類型系列文章匯總見:《【…

字符串的綜合練習

1、練習-轉換羅馬數字 鍵盤錄入一個字符串 要求1:長度為小于等于9 要求2:只能是數字 將內容變成羅馬數字 下面是阿拉伯數字跟羅馬數字的對比關系: Ⅰ-1 Ⅱ-2 Ⅲ-3 Ⅳ-4 Ⅴ-5 Ⅵ-6 Ⅶ-7 Ⅷ-8 Ⅸ-9 注意點:羅馬數字里面沒有0的&…

51單片機的管腳介紹

圖文介紹 純文字說明 單片機管腳相關結構及其作用如下 電源正極引腳 一般接5V電源,為單片機提供正常工作時的電壓。 電源負極引腳 接地。然后才開始工作。 時鐘引腳 18、19腳為時鐘引腳(XTAL2、XTAL1)。單片機內部有大量的數字電路&a…

SringBoot-響應

響應數據 如何加載響應數據呢 其實在SpringBoot,已經有名為RessponseBody的方法注解為我們提供的響應的方法,他的作用是將方法返回值直接響應,如果返回值類型為實體對象/集合,則會轉換為JSON格式響應。 而RestController已經在內…

Java真實面試題,offer已到手

關于學習 在黑馬程序員剛剛開始的時候學習盡頭非常足,到后面逐漸失去了一些興趣,以至于后面上課會出現走神等問題,但是畢業時后悔晚矣。等到開始學習項目一的時候,思路總會比別人慢一些,不看講義寫不出來代碼。 建議…

Lie group 專題:Lie 群

Lie group 專題:Lie 群 流形 流形的定義 一個m維流形是滿足以下條件的集合M:存在可數多個稱為坐標卡(圖集)的子集合族.以及映到的連通開子集上的一對一映射,,稱為局部坐標映射,滿足以下條件 坐標卡覆蓋M…

【Sklearn】基于多層感知器算法的數據分類預測(Excel可直接替換數據)

【Sklearn】基于多層感知器算法的數據分類預測(Excel可直接替換數據) 1.模型原理2.模型參數3.文件結構4.Excel數據5.下載地址6.完整代碼7.運行結果1.模型原理 多層感知器(Multilayer Perceptron,MLP)是一種前饋神經網絡,用于解決分類和回歸問題。它包含輸入層、若干個隱…

【數學建模】--灰色關聯分析

系統分析: 一般的抽象系統,如社會系統,經濟系統,農業系統,生態系統,教育系統等都包含有許多種因素,多種因素共同作用的結果決定了該系統的發展態勢。人們常常希望知道在眾多的因素中,哪些是主要…

leetcode 面試題 02.05 鏈表求和

?? 題目描述 🌟 leetcode鏈接:面試題 02.05 鏈表求和 ps: 首先定義一個頭尾指針 head 、tail,這里的 tail 是方便我們尾插,每次不需要遍歷找尾,由于這些數是反向存在的,所以我們直接加起來若…

深入理解設計模式-行為型之觀察者

概述 觀察者模式(Observer Pattern)是一種行為型設計模式,它定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽一個主題對象,當主題對象發生變化時,所有依賴于它的觀察者對象都會得到通知并更新。 在…

如何安裝Python?

如何安裝Python? 安裝Python非常簡單,讓我們一步步來進行。 1. 訪問官方網站 首先,您需要訪問Python官方網站(https://www.python.org/)。在首頁上,您會看到一個大大的「Downloads」按鈕,點擊…

【Redis實踐篇】使用Redisson 優雅實現項目實踐過程中的5種場景

文章目錄 1.前言2.使用方式1. 添加Redisson依賴:2. 配置Redis連接信息3. 使用場景3.1. 分布式鎖3.2. 限流器(Rate Limiter)3.3. 可過期的對象(Expirable Object)3.4. 信號量(Semaphore)3.5. 分布…

ChatGPT在智能文檔搜索和信息抽取中的應用如何?

智能文檔搜索和信息抽取是信息檢索和知識管理領域中的關鍵問題,而ChatGPT作為一種強大的自然語言處理模型,正在這些領域發揮越來越重要的作用。在大數據時代,文檔數量龐大,信息量巨大,有效地搜索和抽取信息變得至關重要…

spfa判斷負環

思路: (1)負環:區別于正環,在求最短路過程中,正環會繞路,故不會被討論,而負環會不斷讓路總權更短,會讓算法不斷循環; (2)于是考慮統…

JVM---垃圾回收算法介紹

目錄 分代收集理論 三種垃圾回收算法 標記-清除算法(最基礎的、基本不用) 標記-復制算法 標記-整理算法 正式因為jvm有了垃圾回收機制,作為java開發者不會去特備關注內存,不像C和C。 優點:開發門檻低、安全 缺點…

windows Socket簡單編程實例

服務端 #include <winsock2.h> #include <string.h> #include <stdio.h> #include <stdlib.h>#pragma comment(lib, "Ws2_32.lib")void error_handing(const char* message) {fputs(message, stderr);fputc(\n, stderr);exit(1); } int mai…

任我行CRM系統存在 SQL注入漏洞[2023-HW]

任我行CRM系統存在 SQL注入漏洞 一、 產品簡介二、 漏洞概述三、 復現環境四、 漏洞復現小龍POC又是一通哈拉少 五、 修復建議 免責聲明&#xff1a;請勿利用文章內的相關技術從事非法測試&#xff0c;由于傳播、利用此文所提供的信息或者工具而造成的任何直接或者間接的后果及…