鴻蒙程式設計江湖:ArkTS 容器與原生容器在行為上的差異

SameX發表於2024-10-26

本文旨在深入探討華為鴻蒙HarmonyOS Next系統(截止目前API12)的技術細節,基於實際開發實踐進行總結。主要作為技術分享與交流載體,難免錯漏,歡迎各位同仁提出寶貴意見和問題,以便共同進步。本文為原創內容,任何形式的轉載必須註明出處及原作者。

ArkTS 提供了一套容器集,包括 Array、Map、Set 等型別,用於儲存和管理資料。ArkTS 容器與 JavaScript 原生容器在行為上存在一些差異,需要開發者注意。

ArkTS 的 Array、Map、Set 等容器型別

  • Array:ArkTS 的 Array 型別與 JavaScript 的 Array 型別類似,但有一些差異,例如不允許在遍歷、訪問過程中進行元素的增刪改操作。
  • Map:ArkTS 的 Map 型別與 JavaScript 的 Map 型別類似,但有一些差異,例如建構函式中必須提供一個初始值的建構函式,且不支援使用計算屬性名稱。
  • Set:ArkTS 的 Set 型別與 JavaScript 的 Set 型別類似,但有一些差異,例如不允許在遍歷、訪問過程中進行元素的增刪改操作,且 Sendable 類和介面中不允許使用計算屬性名稱。

原生 API 與 ArkTS API 的差異點

原生 API ArkTS API
Array.from collections.Array.from
Array.slice collections.Array.slice
Map.entries collections.Map.entries
Map.keys collections.Map.keys
Map.values collections.Map.values
Set.add collections.Set.add
Set.delete collections.Set.delete
Set.has collections.Set.has

ArkTS 容器在併發中的應用

ArkTS 容器可以安全地在併發例項間傳遞,避免了資料競爭問題。但是,ArkTS 容器並不是執行緒安全的,內部使用了 fail-fast 機制。因此,在併發環境中使用 ArkTS 容器時,需要使用非同步鎖機制保證容器的安全訪問。

ArkTS 容器的建立與操作例項

以下是一個簡單的示例,演示如何建立和操作 ArkTS 容器:

import { collections } from '@kit.ArkTS';
@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  build() {
    Column() {
      Text(this.message)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(async () => {
          // 建立 Array
          const arr = new collections.Array<number>();
          arr.push(1);
          arr.push(2);
          arr.push(3);
          console.log(arr); // 輸出: [1, 2, 3]
          // 建立 Map
          const map = new collections.Map<number, string>();
          map.set(1, 'one');
          map.set(2, 'two');
          map.set(3, 'three');
          console.log(map); // 輸出: {1: "one", 2: "two", 3: "three"}
          // 建立 Set
          const set = new collections.Set<string>();
          set.add('one');
          set.add('two');
          set.add('three');
          console.log(set); // 輸出: Set { "one", "two", "three" }
        })
        .width('100%');
    }
    .height('100%');
  }
}

這段程式碼定義了一個名為 Index 的元件,並在元件中顯示了一條文字訊息 "Hello World"。點選按鈕會建立 Array、Map 和 Set 容器,並輸出容器的內容。

ArkTS 容器與原生 API 對比表

原生 API ArkTS API 差異點
Array.length collections.Array.length 不允許設定 length
Array.pop collections.Array.pop 不允許在遍歷、訪問過程中進行元素的操作
Array.push collections.Array.push 不允許在遍歷、訪問過程中進行元素的操作
Array.concat collections.Array.concat 不允許在遍歷、訪問過程中進行元素的操作
Map.new collections.Map.create 必須提供初始值
Map.entries collections.Map.entries 不支援 thisArg
Map.keys collections.Map.keys 不支援 thisArg
Map.values collections.Map.values 不支援 thisArg
Set.add collections.Set.add 不允許在遍歷、訪問過程中進行元素的操作
Set.delete collections.Set.delete 不允許在遍歷、訪問過程中進行元素的操作
Set.has collections.Set.has 不支援 thisArg

總結

透過以上介紹,您可以瞭解到鴻蒙系統中 ArkTS 容器與原生容器的差異,以及 ArkTS 容器在併發中的應用。希望本文能夠幫助您掌握鴻蒙系統中的併發程式設計技術,並開發出更優秀的鴻蒙應用。

相關文章