你好,我是华鸿技术栈的作者。
上一篇我们过了 ArkTS 基础语法的前半部分——数据类型、变量声明、函数、箭头函数。那篇没有 UI,全是代码片段,但那些是后面写组件的地基。
今天接着往下,把剩下的几个高频语法点扫完:数组操作、对象、解构、扩展运算符。这几样东西在写界面的时候会反复出现,比如列表渲染、接口数据处理、组件传参,碰到就讲,用不上的一笔带过。
数组就是用来存一组数据的容器。在鸿蒙开发里,文章列表、收藏列表、菜单选项,背后都是数组。
两种写法,效果一样,第一种更常用:
typescript
const list: string[] = ['鸿蒙', 'ArkTS', 'ArkUI']; const list2: Array
string[] 表示这个数组里装的都是字符串。如果是数字数组就写 number[],对象数组写 Article[]。
这些方法在实际开发里用到飞起,每一个都可能在某个场景里出现:
typescript
const arr: number[] = [1, 2, 3, 4, 5];
// 长度arr.length; // 5
// 访问某个位置(索引从 0 开始)arr[0]; // 1
// 末尾加一个arr.push(6); // arr 变成 [1, 2, 3, 4, 5, 6]
// 末尾删一个arr.pop(); // 删掉 6,arr 变回 [1, 2, 3, 4, 5]
// 前面加一个arr.unshift(0); // arr 变成 [0, 1, 2, 3, 4, 5]
// 前面删一个arr.shift(); // 删掉 0,arr 变回 [1, 2, 3, 4, 5]
// 查找某个值的位置arr.indexOf(3); // 2
遍历就是挨个访问数组里的每一项:
typescript
const list: string[] = ['鸿蒙', 'ArkTS', 'ArkUI'];
// 方式一:forEachlist.forEach((item, index) => { console.log(第${index}项:${item});});
// 方式二:for…of(更常用)for (const item of list) { console.log(item);}
map 把一个数组映射成另一个数组,filter 从数组里筛出一部分:

这两个方法在数据转换场景里经常用到。接口返回了一堆文章数据,你要取前 10 条、或者只取某个分类的,就靠 filter。你要把接口返回的字段名转换成页面需要的格式,就靠 map。
对象就是把一组相关的数据打包在一起。一篇文章有标题、作者、阅读量,这三个东西散着传很乱,打包成一个对象就清晰多了:
typescript
const article = {
title: '鸿蒙开发入门',
author: '华鸿技术栈',
readCount: 1280
};
typescript
console.log(article.title); // '鸿蒙开发入门' console.log(article['author']); // '华鸿技术栈'
点号访问最常用,括号访问用在属性名是变量或包含特殊字符的时候。
typescript
article.readCount = 1500; // 修改已有属性article.isPinned = true; // 添加新属性
type 定义对象的结构
用 type 给对象定义一个“固定形状”,后面用这个类型的时候,属性和类型都会受到约束,写错会报编译错误:
typescript
type Article = { title: string; author: string; readCount: number;};
const article: Article = { title: '鸿蒙开发入门', author: '华鸿技术栈', readCount: 1280};
这种写法在接口数据处理、组件传参时非常常用。后面讲网络请求和 JSON 解析时,第一步就是先定义接口返回的数据模型,用的就是这个语法。
实际开发中数据很少是扁平的,经常一层套一层。比如一个人的信息里包含一个“背包”对象:
typescript
type Bag = {size: string;color: string;};
type Person = {name: string;mine: Bag;};
const person: Person = {name: '张三',mine: {size: '大',color: '蓝色'}};
console.log(person.mine.color); // '蓝色'
后面讲 @ObservedV2 和 @Trace 的时候,嵌套对象的响应式监听就是在这个基础上展开的。
解构就是把对象或数组里的值“拆”出来,直接赋值给变量。不用每次都写 对象.属性 这种啰嗦写法。
typescript
const article = {
title: '鸿蒙开发入门',
author: '华鸿技术栈',
readCount: 1280
};
// 把三个属性分别取出来
const { title, author, readCount } = article;
console.log(title); // '鸿蒙开发入门'
console.log(author); // '华鸿技术栈'
typescript
const list: string[] = ['鸿蒙', 'ArkTS', 'ArkUI'];
const [first, second, third] = list;
console.log(first); // '鸿蒙'
console.log(second); // 'ArkTS'
实际开发中的用法
解构最常用的两个场景:
场景一:处理接口返回的数据。 接口通常返回一大坨 JSON,但你只需要其中几个字段:


这种写法在组件封装时很常见,传参清晰,不用记参数顺序。
扩展运算符用三个点 ... 表示,能把数组或对象“展开”到另一个数组或对象里。记住,扩展运算符是浅拷贝,只复制对象的第一层属性,嵌套对象仍然是共享引用。
typescript
const arr1: number[] = [1, 2, 3];const arr2: number[] = [4, 5, 6];const merged: number[] = […arr1, …arr2];// merged = [1, 2, 3, 4, 5, 6]
复制数组
typescript
const baseConfig = { fontSize: 16, fontColor: '#333333'};
const myConfig = { …baseConfig, fontSize: 18 // 覆盖 baseConfig 里的 fontSize};// myConfig = { fontSize: 18, fontColor: '#333333' }
合并对象
typescript
const baseConfig = { fontSize: 16, fontColor: '#333333'};
const myConfig = { …baseConfig, fontSize: 18 // 覆盖 baseConfig 里的 fontSize};// myConfig = { fontSize: 18, fontColor: '#333333' }
后面写组件时,你可以用扩展运算符合并默认样式和自定义样式,不用一个属性一个属性地写,代码少很多。
typescript
function sum(a: number, b: number, c: number): number { return a + b + c;}
const numbers: number[] = [1, 2, 3];sum(…numbers); // 等价于 sum(1, 2, 3)
5.5 动手写:这几个语法点合起来用一遍
下面这段代码把本篇的数组、对象、解构、扩展运算符串在一起。不用跑,读一遍,感受一下这些语法在实际代码里是怎么配合的:

这段代码里没有 UI,但逻辑和后面做列表渲染、数据格式化时写的代码几乎一模一样。现在先混个眼熟,后面写到的时候不会觉得陌生。
这一篇加上上一篇,把 ArkTS 基础语法里写 UI 常用的部分都过了一遍。你不用一次性全记住,用到的时候回来查就行。写多了自然会刻进肌肉记忆。
这次讲的四个点:
pushforEach、map、filter | ||
{}type 定义结构 | ||
const { a, b } = objconst [a, b] = arr | ||
...arr...obj |
语法篇到此结束。 下一篇我们正式进入 UI 实战——用学到的语法写第一个声明式 UI 组件,搞懂命令式和声明式的区别,手写一个计数器。从下一篇开始,代码里会出现真正的界面。
本文由「华鸿技术栈」原创发布,专注鸿蒙原生应用与元服务开发。分享实战代码、源码解析、性能优化及生态前沿。不讲虚的,只上干货。转载请联系授权。