從Element日期組件源碼中學到的兩個工具方法

来源:https://www.cnblogs.com/zsxblog/archive/2023/08/13/17626979.html
-Advertisement-
Play Games

最近翻到 ElementUI 的日期組件源碼,看到一些處理日期的工具方法,挺有意思,平常沒有註意到,特此記錄下來。 ### 獲取當前日期的前一天,後一天 ```js export const prevDate = function(date, amount = 1) { return new Dat ...


最近翻到 ElementUI 的日期組件源碼,看到一些處理日期的工具方法,挺有意思,平常沒有註意到,特此記錄下來。

獲取當前日期的前一天,後一天

export const prevDate = function(date, amount = 1) {
  return new Date(date.getFullYear(), date.getMonth(), date.getDate() - amount);
};

export const nextDate = function(date, amount = 1) {
  return new Date(date.getFullYear(), date.getMonth(), date.getDate() + amount);
};

這裡獲取當前日期的前一天用的是 date.getDate() - 1 而不是 date.getTime() - 24 * 60 * 60 * 1000 是為了避免在夏令時轉換時導致的錯誤。

在某些國家,比如英國,每年都會實行夏令時制。

夏令時,又稱作Daylight Saving Times(DST),是為了節省能源而人為規定的時間制度,夏天天亮得早,所以大家早起一個小時,就能多享受日光,從而減少用電量。冬天晚起一個小時,早上就能將將趕上天亮。

每年夏天的時候,英國都要把時間往前調一個小時,變成+1。比如:每年在三月最後一個周日的夜晚,時間會神奇地從00:59直接變成02:00。這就是夏令時的時間變化

所以在夏令時起止當天如果用 date.getTime() (+)- 24 * 60 * 60 * 1000 獲取前一天後一天可能會導致錯誤。

創建包含 1-N 的數組

Element 的做法是利用 Function.prototype.apply 的第二個參數可以是類數組對象來實現;

export const range = function(n) {
  return Array.apply(null, {length: n}).map((_, n) => n);
};

上面的 Array.apply(null, {length: n}) 將會創造 n 個值為 undefined 的數組,再利用 map 函數一個個改變數組值;

還有很多種實現方法,而且有比上面執行速度更快的方法;

(1)Array.from()

// 第一種
Array.from(Array(N), (_, i) => i+1)

// 第二種
Array.from({length: N}, (_, i) => i + 1)

// 第三種
Array.from({length:N}, Number.call, i => i + 1)

Array.from() 可以通過 可迭代對象 和 類數組對象(帶有 length 屬性和索引元素的對象) 來創建數組;
並且如果 類數組對象 只有length屬性沒有索引元素,那麼創建的數組值都為 undefined 參考

Array.from() 的第二個參數為一個可選的 mapFn,類似於數組 map 函數;但不同的是Array.from() 的 mapFn 會對空槽元素執行回調函數;上面方式的比 Array.apply(null, {length: n}).map((_, n) => n); 的優勢是不會創建中間數組;

第三種方法,第三個參數是一個函數,會被 Number.call 當作 this 調用

(2)while 循壞

let i=0, a=Array(N);
while(i<N) a[i++]=i;

(3)for 迴圈

var foo = [];

for (var i = 1; i <= N; i++) {
   foo.push(i);
}

(4)Array.prototype.fill

Array(N).fill().map((_, i) => i+1);

Array.from() 類似,Array(N).fill() 也會創建 N 個值為 undefined 的數組;

(5)Array(N).join().split(',')

Array(N).join().split(',').map((_, i) => i+1 );

Array(N) 會創建 N 個空槽組成的數組,空槽既不是 undefined,也不是空字元串;並且 map 也不會對空槽元素執行回調函數,所以需要通過 Array(N).join().split(',') 將會得到 N 個字元串組成的數組;

(6)擴展運算符

[...Array(N).keys()].map(x => x + 1);

[...Array(N+1).keys()].slice(1)

[...Array(N)] 擴展運算符會將空槽元素轉化為 undefined

(7)Uint8Array

new Uint8Array(5).map((item, i) => i + 1);

性能

對以上方式進行性能測試,測試工具是 jsbench ,測試的的瀏覽器版本是谷歌 115.0.5790.110(正式版本) (64 位)

結果如下

設置初始值 N 為 1000000,ops 為每秒操作數,圖中結果按照從高到低排序;while 迴圈最快

image

參考資料


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當我們需要處理一個大量的數據集合時,一次性將其全部讀入記憶體並處理可能會導致記憶體溢出。此時,我們可以採用迭代器`Iterator`和生成器`Generator`的方法,逐個地處理數據,從而避免記憶體溢出的問題。迭代器是一個可以逐個訪問元素的對象,它實現了`python`的迭代協議,即實現了`__iter... ...
  • 通過編碼實戰瞭解quarkus攔截器的另一個高級特性:禁用類級別攔截器,這樣可以避免類級別和方法級別攔截器的疊加衝突 ...
  • [toc] ### 1.晶元手冊中的LED電路圖 ![圖1](https://img-blog.csdnimg.cn/34c2a95aa89c4cbe8a7904429d889564.png) ### 2.官網手冊 ![圖2](https://img-blog.csdnimg.cn/e9b1131d ...
  • 設計字元設備 文件系統調用系統IO的內核處理過程 在Linux文件系統管理中,當應用程式調用open函數時,內核會根據文件路徑找到文件的索引結點(inode),為文件分配文件描述符和文件對象,並根據打開模式和許可權等參數進行相應的操作和設置。 硬體層原理 思路:把底層寄存器配置操作放在文件操作介面里, ...
  • 前面講了Centos如何安裝telnet遠程,這次分享Ubuntu系統如何安裝遠程telnet,作為咱們運維備用遠程途徑 一、下載和安裝 查看系統版本:Ubuntu 22.04.1 LTS 線上安裝: apt install telnet telnetd openbsd-inetd 離線安裝: 離線 ...
  • > 拋磚引玉:多個查詢需要在同一時刻進行數據的修改,就會產生併發控制的問題。我們需要如何避免寫個問題從而保證我們的資料庫數據不會被破壞。 ## 鎖的概念 讀鎖是共用的互相不阻塞的。多個事務在聽一時刻可以同時讀取同一資源,而相互不幹擾。 寫鎖的排他的。一個寫鎖會阻塞其他寫鎖或讀鎖。出於安全考慮只有這樣 ...
  • CentOS 7.9 環境的安裝不再贅述,不清楚可以參看之前的文章:https://www.cnblogs.com/iflytek/p/14403664.html 1、準備GBase 8a的安裝包:GBase8a-NoLicense-Free-8.6.2_build43-R7-redhat7.3-x ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...