」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Staat 原始碼中的 Object.is() 用法。

Staat 原始碼中的 Object.is() 用法。

發佈於2024-11-04
瀏覽:987

在這篇文章中,我們將探討Zustand原始碼中如何使用Object.is()方法。

Object.is() usage in Zustand’s source code.

上面的程式碼片段摘自vanilla.ts

setState 中使用了 Object.is() 方法(稍後將有更多文章介紹)。

我們先來了解什麼是Object.is()方法。

對象.is()

Object.is()靜態方法判斷兩個值是否相同。

以下範例摘自 MDN 文件:

    console.log(Object.is('1', 1));
    // Expected output: false

    console.log(Object.is(NaN, NaN));
    // Expected output: true

    console.log(Object.is(-0, 0));
    // Expected output: false

    const obj = {};
    console.log(Object.is(obj, {}));
    // Expected output: false

這是一個有點複雜的 JSON 範例:

    const jsonObject1 = {
        name: "foo",
        age: 30
    };

    const jsonObject2 = {
        name: "bar",
        age: 30
    };

    console.log(Object.is(jsonObject1, jsonObject2)); // false

為什麼 Object.is() 回傳 false?

儘管 jsonObject1 和 jsonObject2 具有相同的內容,但它們在記憶體中是不同的物件。在 JavaScript 中,物件是透過引用進行比較的,而不是透過其內容進行比較的。由於這兩個物件儲存在不同的記憶體位置,Object.is() 會傳回 false。

Object.is(nextState, 狀態)

在 Zustand 的以下程式碼片段中,Object.is() 方法用於在繼續更新狀態並通知偵聽器之前確定 nextState 是否確實與目前狀態不同。此檢查對於效能和避免不必要的狀態更新至關重要。

    const setState: StoreApi['setState'] = (partial, replace) => {
      // TODO: Remove type assertion once https://github.com/microsoft/TypeScript/issues/37663 is resolved
      // https://github.com/microsoft/TypeScript/issues/37663#issuecomment-759728342
      const nextState =
        typeof partial === 'function'
          ? (partial as (state: TState) => TState)(state)
          : partial
      if (!Object.is(nextState, state)) {
        const previousState = state
        state =
          (replace ?? (typeof nextState !== 'object' || nextState === null))
            ? (nextState as TState)
            : Object.assign({}, state, nextState)
        listeners.forEach((listener) => listener(state, previousState))
      }
    }

下圖顯示了 Object.is() 的作用

Object.is() usage in Zustand’s source code.

Object.is() usage in Zustand’s source code.

為了加入上述日誌語句,我使用指令 pnpm run build 編譯了 Zustand,並將 dist 複製到 Examples/demo/src 中。看起來很老套,但是嘿,我們正在嘗試並弄清楚 Zustand 內部是如何運作的。

Object.is() usage in Zustand’s source code.

    const useStore = create((set) => ({
      count: 1,
      inc: () => set((state) => ({ count: state.count   1 })),
    }))

呼叫 inc 以某種方式觸發 setState,我們將在接下來的文章中弄清楚如何實作。

關於我們:

在 Think Throo,我們的使命是教導受開源專案啟發的最佳實踐。

透過練習先進的架構概念、學習最佳實踐並建立生產級專案來提高您的編碼技能。

我們是開源的 — https://github.com/thinkthroo/thinkthroo(請給我們一顆星!)

需要 Next.js 專案的幫助?請透過 [email protected] 與我們聯絡

關於作者:

嘿,我是拉姆。我是一名充滿熱情的軟體工程師/OSS Tinkerer。

查看我的網站:https://www.ramunarasinga.com/

參考:

  1. https://github.com/pmndrs/zustand/blob/main/src/vanilla.ts#L71

  2. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is

  3. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#same-value_equality_using_object.is

版本聲明 本文轉載於:https://dev.to/thinkthroo/objectis-usage-in-zustands-source-code-2lod?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-16
  • 為什麼 C/C++ 中 `size_t` 是無符號的:歷史的必然還是現代的 bug 磁鐵?
    為什麼 C/C++ 中 `size_t` 是無符號的:歷史的必然還是現代的 bug 磁鐵?
    為什麼 size_t 無符號? Bjarne Stroustrup 的觀察結果是「使用無符號而不是int 來多獲得一位來表示正整數幾乎從來都不是一個好主意」引起了人們對將size_t 設為無符號的決定的擔憂。 歷史起源最初,size_t 是無符號的,以適應具有 16 位元指標的體系結構,例如 DOS...
    程式設計 發佈於2024-11-16
  • 如何使用 Selenium Python 從 Shadow Root 擷取資訊?
    如何使用 Selenium Python 從 Shadow Root 擷取資訊?
    如何使用Selenium 從影子根中提取資訊PythonSelenium 為Web 自動化提供了一個強大的框架,包括提取資訊的能力來自動態載入的Web 元素(例如影子根)的資訊。本指南將示範如何克服從影子根中的特定線上商店提取產品標籤和其他欄位的挑戰。 挑戰:從影子根中提取資訊 當遇到影子根時,有必...
    程式設計 發佈於2024-11-16
  • 如何使用特定欄位中的值數組從 MySQL 表中選擇資料?
    如何使用特定欄位中的值數組從 MySQL 表中選擇資料?
    從MySQL 表中選擇特定欄位中包含值的陣列在使用MySQL 資料庫時,您可能會遇到需要的場景根據儲存在數組中的值檢索資料。例如,假設您有一個名為$array 的數組,其中包含使用者ID 清單:$array = array(1, 40, 20, 55, 29, 48);To選擇myField 列與此...
    程式設計 發佈於2024-11-16
  • 在 HTML 中新增 Javascript 檔案的最佳方法
    在 HTML 中新增 Javascript 檔案的最佳方法
    在 HTML 中,有許多方法可以包含 JavaScript 檔案。我將解釋四種不同的方法及其缺點,最後強調最佳方法。 1.中的 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-...
    程式設計 發佈於2024-11-16
  • 為什麼我的 Bootstrap 4 欄位是垂直對齊而不是水平對齊?
    為什麼我的 Bootstrap 4 欄位是垂直對齊而不是水平對齊?
    Bootstrap 4 列對齊不一致在從Bootstrap 3 到4 的過渡中,您注意到您的列是垂直對齊的,而不是水平地。這可以歸因於 Bootstrap 4 中網格系統的變更。 Col-12 Issue在 Bootstrap 3 中,您可以使用以下方法將列包裝在父行中「col-12」類別。這在 B...
    程式設計 發佈於2024-11-16
  • 如何在 Python 中確定生成器是否為空
    如何在 Python 中確定生成器是否為空
    確定生成器的空性在Python中,生成器是用於惰性評估和迭代大型資料集的強大工具。然而,由於發電機的動態特性,確定發電機是否為空是一個獨特的挑戰。與列表或元組不同,生成器沒有大小屬性,簡單地迭代它們會導致 StopIteration 異常。 Peek 與 HasNext有些人可能會建議使用 peek...
    程式設計 發佈於2024-11-16
  • 如何基於公用列合併多個 DataFrame 並保留共用行?
    如何基於公用列合併多個 DataFrame 並保留共用行?
    基於公共列合併多個資料幀您有多個具有公共列「日期」的資料幀,並且需要合併它們同時保留所有資料幀共有日期的行。遞歸函數方法可能很複雜且容易出錯。這是使用 pandas 強大的分組和合併功能的更簡單的解決方案:import pandas as pd # Create a list of datafram...
    程式設計 發佈於2024-11-16
  • 為什麼 PHP 中的特殊字元會顯示為帶有問號的黑鑽石?
    為什麼 PHP 中的特殊字元會顯示為帶有問號的黑鑽石?
    PHP字符編碼問題:帶有問號的小黑鑽石PHP字符編碼問題:帶有問號的小黑鑽石用戶在使用PHP從數據庫中檢索數據時經常遇到一個特殊問題:特殊字元(例如引號)顯示為帶有問號(�) 的黑色菱形。此問題是由於資料的編碼與用於顯示它的編碼之間的差異所引起的。 要解決此問題,您可以實現多種方法:header(&...
    程式設計 發佈於2024-11-16
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-16
  • CURL 可以取代 file_get_contents 來取得外部連結嗎?
    CURL 可以取代 file_get_contents 來取得外部連結嗎?
    使用 CURL 獲取外部鏈接(替代 file_get_contents)為了獲取特定頁面上的外部鏈接,通常使用 file_get_contents 函數。但是,當您使用的伺服器不支援此功能時,CURL 可以作為可行的替代方案。 要實作 CURL,您可以使用以下程式碼:function file_ge...
    程式設計 發佈於2024-11-16
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-16
  • Go的FileMode函數如何處理八進制和十進制權限轉換?
    Go的FileMode函數如何處理八進制和十進制權限轉換?
    Go 中 FileMode 函數的權限解析os.FileMode 函數在設定標誌之前轉換各種格式的權限。這些格式包括整數、八進位表示形式以及可能的其他形式。 從整數轉換為 os.FileMode 時,此函數不會明確辨別整數是用八進位還是十進位表示。十進位表示形式被解釋為常規整數。 數字的八進位表示形...
    程式設計 發佈於2024-11-16
  • ## 如何在 Android 上從 FTP 伺服器下載檔案:哪個 Java 函式庫最好?
    ## 如何在 Android 上從 FTP 伺服器下載檔案:哪個 Java 函式庫最好?
    適用於Android 的FTP 庫正在尋找一個可靠的Java 庫,以方便從Android 設備上的FTP 伺服器下載和恢復文件?讓我們深入研究一些潛在的解決方案。 Apache Commons FTP想想 Apache Commons FTP,它是一個廣泛使用且備受推崇的 FTP 操作庫。它提供了一...
    程式設計 發佈於2024-11-16
  • 為什麼 Java 的模運算子對於負數傳回負結果?
    為什麼 Java 的模運算子對於負數傳回負結果?
    Java 中的負模結果在Java 中執行負數模運算時,您可能會注意到結果與獲得的結果不同在Python中。在 Java 中,int i = -1 % 2 得到 -1,而在 Python 中,它會傳回 1。 理解模和餘數理解這種差異的關鍵在於模和餘數之間的區別。在 Python 中,% 運算子傳回模數...
    程式設計 發佈於2024-11-16

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3