鸿蒙进阶篇-剩余和展开、简单和复杂类型

"在科技的浪潮中,鸿蒙操作系统宛如一颗璀璨的新星,引领着创新的方向。作为鸿蒙开天组,今天我们将一同踏上鸿蒙基础的探索之旅,为您揭开这一神奇系统的神秘面纱。"

各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今天的学习,鸿蒙进阶篇-剩余和展开、简单和复杂类型

在鸿蒙中:

"剩余" 参数允许函数接收数量不定的额外参数,并将它们以数组的形式进行处理,增强了函数在参数处理上的灵活性。

"展开" 常用于数组或对象操作中,例如将数组元素展开为独立的参数传递给函数,或者将对象的属性展开为独立的键值对。

"简单类型" 通常指基本的数据类型,如整数、浮点数、布尔值、字符和字符串等。它们具有固定的大小和简单的操作,在内存中的表示相对直接。

"复杂类型" 则包括数组、对象、类等。这些类型由多个简单类型或其他复杂类型组合而成,具有更丰富的结构和操作方式,需要更多的内存和处理逻辑来管理和操作。

总的来说,"剩余" 和 "展开" 是在编程中处理参数和数据结构的方式,而 "简单类型" 和 "复杂类型" 则是对数据类型的分类,反映了数据的结构和复杂度。

剩余和展开

接下来学习一个运算符 ...
...在不同的情况下有不同的效果,分别是 剩余参数 和 展开

剩余参数

通过剩余参数的语法,我们可以将 函数 或 方法 中一个不定数量的参数表示为一个数组
附上官方文档链接https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/rest_parameters

// 剩余参数 【只能写在最后一位】
function 函数名(参数1,参数2,...剩余参数数组){
  // 逻辑代码
  // 剩余参数之前的参数 挨个获取即可
  // 剩余参数:以数组的形式获取
}

展开

出于程序稳定性,以及运行性能考虑,在 ArkTS 中 ...(展开运算符) 只能用在数组上
附上官方文档链接https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/quick-start/typescript-to-arkts-migration-guide.md#%E9%83%A8%E5%88%86%E6%94%AF%E6%8C%81%E5%B1%95%E5%BC%80%E8%BF%90%E7%AE%97%E7%AC%A6

下面展示一个案例来理解:

const numArr1: number[] = [1, 2, 3, 4]
const numArr2: number[] = [5, 6, 7]

// 合并到一起
const totalArr: number[] = [...numArr1, ...numArr2]

// 添加
const numArr3: number[] = [8, 9, 10]
const numArr4: number[] = [11, 12, 13]

// 将 numArr4 展开,传递给push
numArr3.push(...numArr4)
console.log('', totalArr)

@Entry
@Component
struct Example01 {
  build() {
    Column() {
      Column() {
        Column() {
        }
        .margin(10)

      }.width(250)
      .height(500)
      .backgroundColor('#eee')
      .border({ width: 2, color: 'green', style: BorderStyle.Solid })

    }.width('100%')
  }
}

简单类型和复杂类型

ArkTS中的数据类型整体可以分为 两大类:

1 基本数据类型(简单数据类型)

number 数字型、string 字符串型、boolean布尔型、undefined未定义、null空类型

2 引用数据类型(复杂数据类型)

Object、Function、Array

这两类数据在内存中保存的方式略有不同,导致在日常开发中对这两类数据进行赋值操作时会有不同的结果

下面展示一个案例来理解:

比如如下代码:
1
num1和 num2 的值分别是?
2
p1.name和p2.name 分别是?

// 基本数据类型
let numA: number = 10
let numB: number = numA
numB++
console.log('numA:', numA) // ?
console.log('numB:', numB) // ?


// 引用数据类型
class Person {
  name: string = ''

  constructor(name: string) {
    this.name = name
  }
}

const p1: Person = new Person('jack')
const p2: Person = p1
// 修改 P2 是否会报错
p2.name = 'rose'

console.log('p1.name:', p1.name) // ?
console.log('p2.name:', p2.name) // ?

@Entry
@Component
struct Example01 {
  build() {
    Column() {
      Column() {
        Column() {
        }
        .margin(10)

      }.width(250)
      .height(500)
      .backgroundColor('#eee')
      .border({ width: 2, color: 'green', style: BorderStyle.Solid })

    }.width('100%')
  }
}

为了弄明白上述现象的原因,就需要搞清楚这两种数据类型在内存存储的差异是什么

内存中堆栈空间

咱们可以把内存理解为有 2 类空间:

1栈:访问速度快,基本数据类型存放到栈里面

2堆:存储容量大,引用数据类型存放到堆里面

基本数据类型和复杂数据类型是如何保存的呢?

基本数据类型存储

变量的数据直接存放在栈空间中,访问速度快

引用数据类型存储

1 栈空间:存放 变量的内存地址(堆中的地址)

2 堆空间:存放 变量的 值

站在内存角度看变量赋值

基本数据类型

num1 num2 都保存在堆内存中,虽然值相同,但是各自是独立的空间,后续操作 互不影响

let num1: number = 10
let num2: number = num1

引用数据类型

p1 和 p2 栈内存中有各自独立的空间,但是保存的是堆内存的地址,指向的是同一个数据:

修改 p2.namep1.name 也会受到影响,因为是同一份数据

class Person {
  name: string = ''

  constructor(name: string) {
    this.name = name
  }
}

const p1: Person = new Person('jack')
const p2: Person = p1
p2.name = 'rose'

以上是关于鸿蒙进阶篇-剩余和展开、简单和复杂类型、类综合的一些内容,方便大家学习,至此,关于鸿蒙进阶篇 - 剩余和展开、简单和复杂类型综合的内容就介绍到这里,愿您能学以致用,开发出精彩的鸿蒙应用!

以上内容仅供学习交流,如有违法或者侵权可以联系删除。

相关推荐
Freerain992 小时前
鸿蒙Next ArkTS语法适配背景概述
华为·harmonyos
他的猫哎2 小时前
鸿蒙 Navigation组件下的组件获取pageStack问题
harmonyos·鸿蒙
雨汨2 小时前
鸿蒙之路的坑
华为·harmonyos
轻口味3 小时前
【每日学点鸿蒙知识】沙箱目录、图片压缩、characteristicsArray、gm-crypto 国密加解密、通知权限
pytorch·华为·harmonyos
xo198820117 小时前
鸿蒙人脸识别
redis·华为·harmonyos
塞尔维亚大汉8 小时前
【OpenHarmony】 鸿蒙 UI开发之CircleIndicator
harmonyos·arkui
BisonLiu8 小时前
华为仓颉鸿蒙HarmonyOS NEXT仓颉原生数据网络HTTP请求(ohos.net.http)
harmonyos
BisonLiu8 小时前
华为仓颉鸿蒙NEXT原生加解密算法库框架
harmonyos
变色龙云8 小时前
网页生成鸿蒙App
华为·harmonyos
BisonLiu8 小时前
华为仓颉鸿蒙HarmonyOS NEXT仓颉原生ohos.request(上传下载)
harmonyos