当前位置: 首页 > article >正文

HarmonyOS学习——ArkTS语法介绍之基本知识

ArkTS是一种为构建高性能应用而设计的编程语言。ArkTS在继承TypeScript语法的基础上进行了优化,以提供更高的性能和开发效率。

目前流行的编程语言TypeScript是在JavaScript基础上通过添加类型定义扩展而来的,而ArkTS则是TypeScript的进一步扩展。TypeScript深受开发者的喜爱,因为它提供了一种更结构化的JavaScript编码方法。ArkTS旨在保持TypeScript的大部分语法,为现有的TypeScript开发者实现无缝过渡,让移动开发者快速上手ArkTS。

基本知识

声明

ArkTS通过声明引入变量、常量、函数和类型。

变量声明

以关键字let开头的声明引入变量,该变量在程序执行期间可以具有不同的值。

let hi: string = 'hello';
hi = 'hello, world';

常量声明

以关键字const开头的声明引入只读常量,该常量只能被赋值一次。

const hello: string = 'hello';

对常量重新赋值会造成编译时错误。

自动类型推断

由于ArkTS是一种静态类型语言,所有数据的类型都必须在编译时确定。

但是,如果一个变量或常量的声明包含了初始值,那么开发者就不需要显式指定其类型。ArkTS规范中列举了所有允许自动推断类型的场景。

以下示例中,两条声明语句都是有效的,两个变量都是string类型:

let hi1: string = 'hello';
let hi2 = 'hello, world';

类型

基本类型和引用类型

基本类型:string、number、boolean、null、undefined、bigint等

console.log方法传入的参数需要是字符串类型,也就是string类型;如果要打印数字类型,则需要转换为字符串类型才能打印。

number类型

ArkTS提供number类型,任何整数和浮点数都可以被赋给此类型的变量。

数字字面量包括整数字面量和十进制浮点数字面量。

整数字面量包括以下类别:

  • 由数字序列组成的十进制整数。例如:0、117、-345
  • 以0x(或0X)开头的十六进制整数,可以包含数字(0-9)和字母a-f或A-F。例如:0x1123、0x00111、-0xF1A7
  • 以0o(或0O)开头的八进制整数,只能包含数字(0-7)。例如:0o777
  • 以0b(或0B)开头的二进制整数,只能包含数字0和1。例如:0b11、0b0011、-0b11

浮点字面量包括以下:

  • 十进制整数,可为有符号数(即,前缀为“+”或“-”);
  • 小数点(“.”)
  • 小数部分(由十进制数字字符串表示)
  • 以“e”或“E”开头的指数部分,后跟有符号(即,前缀为“+”或“-”)或无符号整数。

示例:

let n1 = 3.14;
let n2 = 3.141592;
let n3 = .5;
let n4 = 1e2;function factorial(n: number): number {if (n <= 1) {return 1;}return n * factorial(n - 1);
}factorial(n1)  //  7.660344000000002 
factorial(n2)  //  7.680640444893748 
factorial(n3)  //  1 
factorial(n4)  //  9.33262154439441e+157 

number类型在表示大整数时会造成精度丢失。在开发时可以按需使用bigInt类型来确保精度:

let bigIntger: BigInt = BigInt('999999999999999999999999999999999999999999999999999999999999');
console.log('bigIntger' + bigIntger.toString());

boolean类型

boolean类型由true和false两个逻辑值组成。

通常在条件语句中使用boolean类型的变量:

let isDone: boolean = false;// ...if (isDone) {console.log ('Done!');
}

string类型

string代表字符序列;可以使用转义字符来表示字符。

字符串字面量由单引号(')或双引号(")之间括起来的零个或多个字符组成。字符串字面量还有一特殊形式,是用反向单引号(`)括起来的模板字面量。

let s1 = 'Hello, world!\n';
let s2 = 'this is a string';
let a = 'Success';
let s3 = `The result is ${a}`;let name:string = "Xiaoming"
console.log(name);

引用类型:Interface、Object、Function、Array、Class、Tuple

void类型

void类型用于指定函数没有返回值。

此类型只有一个值,同样是void。由于void是引用类型,因此它可以用于泛型类型参数。

class Class<T> {//...
}
let instance: Class <void>

Object类型

Object类型是所有引用类型的基类型。任何值,包括基本类型的值(它们会被自动装箱),都可以直接被赋给Object类型的变量。object类型则用于表示除基本类型外的类型。

Array类型

array,即数组,是由可赋值给数组声明中指定的元素类型的数据组成的对象。

数组可由数组复合字面量(即用方括号括起来的零个或多个表达式的列表,其中每个表达式为数组中的一个元素)来赋值。数组的长度由数组中元素的个数来确定。数组中第一个元素的索引为0。

以下示例将创建包含三个元素的数组:

let names: string[] = ['Alice', 'Bob', 'Carol'];

枚举类型:Enum类型

enum类型,又称枚举类型,是预先定义的一组命名值的值类型,其中命名值又称为枚举常量。

使用枚举常量时必须以枚举类型名称为前缀。

enum ColorSet { Red, Green, Blue }
let c: ColorSet = ColorSet.Red;

常量表达式可以用于显式设置枚举常量的值。

enum ColorSet { White = 0xFF, Grey = 0x7F, Black = 0x00 }
let c: ColorSet = ColorSet.Black;

联合类型:Union类型

union类型,即联合类型,是由多个类型组合成的引用类型。联合类型包含了变量可能的所有类型。

let luckynum: number | string = 7;
lucknum = 'seven';class Cat {name: string = 'cat';// ...
}
class Dog {name: string = 'dog';// ...
}
class Frog {name: string = 'frog';// ...
}
type Animal = Cat | Dog | Frog | number;
// Cat、Dog、Frog是一些类型(类或接口)let animal: Animal = new Cat();
animal = new Frog();
animal = 42;
// 可以将类型为联合类型的变量赋值为任何组成类型的有效值

可以用不同的机制获取联合类型中特定类型的值。

示例:

class Cat { sleep () {}; meow () {} }
class Dog { sleep () {}; bark () {} }
class Frog { sleep () {}; leap () {} }type Animal = Cat | Dog | Frog;function foo(animal: Animal) {if (animal instanceof Frog) {animal.leap();  // animal在这里是Frog类型}animal.sleep(); // Animal具有sleep方法
}

类型别名:Type Aliases类型

Aliases类型为匿名类型(数组、函数、对象字面量或联合类型)提供名称,或为已有类型提供替代名称。

type Matrix = number[][];
type Handler = (s: string, no: number) => string;
type Predicate <T> = (x: T) => boolean;
type NullableObject = Object | null;

空安全

一般来说,有时会存在声明变量时不确定初始值。在这类情况下,通常使用联合类型包含null值

空安全机制的三种方式

1、使用if/else进行判空

2、使用空值合并表达式,??左边的值为null时会返回表达式右边的值

3、使用可选链,如果是null,运算符会返回undefined

运算符

赋值运算符

赋值运算符=,使用方式如x=y。

复合赋值运算符将赋值与运算符组合在一起,其中x op = y等于x = x op y。

复合赋值运算符列举如下:+=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、|=、^=。

比较运算符

运算符说明
===如果两个操作数严格相等(对于不同类型的操作数认为是不相等的),则返回true。
!==如果两个操作数严格不相等(对于不同类型的操作数认为是不相等的),则返回true。
==如果两个操作数相等,则返回true。
!=如果两个操作数不相等,则返回true。
>如果左操作数大于右操作数,则返回true。
>=如果左操作数大于或等于右操作数,则返回true。
<如果左操作数小于右操作数,则返回true。
<=如果左操作数小于或等于右操作数,则返回true。

算术运算符

一元运算符为-、+、--、++。

二元运算符列举如下:

运算符说明
+加法
-减法
*乘法
/除法
%除法后余数

位运算符

运算符说明
a & b按位与:如果两个操作数的对应位都为1,则将这个位设置为1,否则设置为0。
a | b按位或:如果两个操作数的相应位中至少有一个为1,则将这个位设置为1,否则设置为0。
a ^ b按位异或:如果两个操作数的对应位不同,则将这个位设置为1,否则设置为0。
~ a按位非:反转操作数的位。
a << b左移:将a的二进制表示向左移b位。
a >> b算术右移:将a的二进制表示向右移b位,带符号扩展。
a >>> b逻辑右移:将a的二进制表示向右移b位,左边补0。

逻辑运算符

运算符说明
a && b逻辑与
a || b逻辑或
! a逻辑非

语句

If语句

if语句用于需要根据逻辑条件执行不同语句的场景。当逻辑条件为真时,执行对应的一组语句,否则执行另一组语句(如果有的话)。

else部分也可能包含if语句。

if语句如下所示:

if (condition1) {// 语句1
} else if (condition2) {// 语句2
} else {// else语句
}

条件表达式可以是任何类型。但是对于boolean以外的类型,会进行隐式类型转换:

let s1 = 'Hello';
if (s1) {console.log(s1); // 打印“Hello”
}let s2 = 'World';
if (s2.length != 0) {console.log(s2); // 打印“World”
}

条件语句

let isValid: Boolean = false;
if (Math.random() > 0.5){isValid = true;
}else {isValid = false;
}

使用条件表达式

let isValid = Math.random() > 0.5 ? true : false;

Switch语句

使用switch语句来执行与switch表达式值匹配的代码块。

switch语句如下所示:

switch (expression) {case label1: // 如果label1匹配,则执行// ...// 语句1// ...break; // 可省略case label2:case label3: // 如果label2或label3匹配,则执行// ...// 语句23// ...break; // 可省略default:// 默认语句
}

如果switch表达式的值等于某个label的值,则执行相应的语句。

如果没有任何一个label值与表达式值相匹配,并且switch具有default子句,那么程序会执行default子句对应的代码块。

break语句(可选的)允许跳出switch语句并继续执行switch语句之后的语句。

如果没有break语句,则执行switch中的下一个label对应的代码块。

条件表达式

条件表达式由第一个表达式的布尔值来决定返回其它两个表达式中的哪一个。

示例如下:

condition ? expression1 : expression2

如果condition的值为真值(转换后为true的值),则使用expression1作为该表达式的结果;否则,使用expression2。

示例:

let message = Math.random() > 0.5 ? 'Valid' : 'Failed';

For语句

for语句会被重复执行,直到循环退出语句值为false。

for语句如下所示:

for ([init]; [condition]; [update]) {statements
}

for语句的执行流程如下:

1、 执行init表达式(如有)。此表达式通常初始化一个或多个循环计数器。

2、 计算condition。如果它为真值(转换后为true的值),则执行循环主体的语句。如果它为假值(转换后为false的值),则for循环终止。

3、 执行循环主体的语句。

4、 如果有update表达式,则执行该表达式。

5、 回到步骤2。

示例:

let sum = 0;
for (let i = 0; i < 10; i += 2) {sum += i;
}

For-of语句

使用for-of语句可遍历数组或字符串。示例如下:

for (forVar of expression) {statements
}

示例:

for (let ch of 'a string object') {/* process ch */
}

While语句

只要condition为真值(转换后为true的值),while语句就会执行statements语句。示例如下:

while (condition) {statements
}

示例:

let n = 0;
let x = 0;
while (n < 3) {n++;x += n;
}

Do-while语句

如果condition的值为真值(转换后为true的值),那么statements语句会重复执行。示例如下:

do {statements
} while (condition)

示例:

let i = 0;
do {i += 1;
} while (i < 10)

Break语句

使用break语句可以终止循环语句或switch。

示例:

let x = 0;
while (true) {x++;if (x > 5) {break;}
}

如果break语句后带有标识符,则将控制流转移到该标识符所包含的语句块之外。

示例:

let x = 1;
label: while (true) {switch (x) {case 1:// statementsbreak label; // 中断while语句}
}

Continue语句

continue语句会停止当前循环迭代的执行,并将控制传递给下一个迭代。

示例:

let sum = 0;
for (let x = 0; x < 100; x++) {if (x % 2 == 0) {continue;}sum += x;
}

Throw和Try语句

throw语句用于抛出异常或错误:

throw new Error('this error')

try语句用于捕获和处理异常或错误:

try {// 可能发生异常的语句块
} catch (e) {// 异常处理
}

下面的示例中throw和try语句用于处理除数为0的错误:

class ZeroDivisor extends Error {}function divide (a: number, b: number): number{if (b == 0) throw new ZeroDivisor();return a / b;
}function process (a: number, b: number) {try {let res = divide(a, b);console.log('result: ' + res);} catch (x) {console.log('some error');}
}

支持finally语句:

function processData(s: string) {let error: Error | null = null;try {console.log('Data processed: ' + s);// ...// 可能发生异常的语句// ...} catch (e) {error = e as Error;// ...// 异常处理// ...} finally {if (error != null) {console.log(`Error caught: input='${s}', message='${error.message}'`);}}
}

相关文章:

HarmonyOS学习——ArkTS语法介绍之基本知识

ArkTS是一种为构建高性能应用而设计的编程语言。ArkTS在继承TypeScript语法的基础上进行了优化&#xff0c;以提供更高的性能和开发效率。 目前流行的编程语言TypeScript是在JavaScript基础上通过添加类型定义扩展而来的&#xff0c;而ArkTS则是TypeScript的进一步扩展。TypeS…...

电子电器架构 --- 网关转发时延解析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

minio数据迁移(两台服务器没法相互通信)

场景描述: A服务器 无法访问 B服务器&#xff0c;B服务器 也无法访问 A&#xff08;即双方都不能通过公网或内网直连对方&#xff09; MinIO 官方提供了 mc&#xff08;MinIO Client&#xff09;命令行工具&#xff0c;可以直接实现 Bucket 之间的数据迁移&#xff1a; 安装 …...

笔记,麦克风的灵敏度

麦克风的“灵敏度&#xff08;Sensitivity&#xff09;”决定了它捕捉声音细节的能力。想象麦克风是一只有耳朵的生物。高灵敏度麦克风像长着“超级顺风耳”的精灵&#xff0c;能听见花瓣飘落的声音、远处树叶的沙沙声&#xff0c;甚至你心跳的微弱震动。适合录音棚里捕捉歌手的…...

特殊配合力(SCA)作为全基因组关联分析(GWAS)的表型,其生物学意义和应用价值

生物学意义 解析非加性遗传效应 特殊配合力(SCA)主要反映特定亲本组合的杂交优势,由非加性遗传效应(如显性、超显性、上位性)驱动。显性效应涉及等位基因间的显性互作,上位性效应则涉及不同位点间的基因互作。通过SCA-GWAS,可以定位调控这些非加性效应的关键基因组区域…...

2025年 全新 AI 编程工具 Cursor 安装使用教程

一、Cursor 软件下载 首选&#xff0c;登录Cursor官网&#xff0c;进行软件下载&#xff0c;官网下载地址如下&#xff1a; Cursor AI IDE 下载 二、Cursor软件安装配置 此处以Windows10系统安装为例&#xff0c;下载完成之后&#xff0c;右键安装包&#xff0c;以管理员身份…...

HarmonyOS 鸿蒙操作物联网设备蓝牙模块、扫描蓝牙、连接蓝牙和蓝牙通信

01【HarmonyOS 蓝牙】 物联网无线传输方案、HarmonyOS蓝牙数据通信之前的准备工作 02【HarmonyOS 蓝牙】配置蓝牙权限 检测 打开 关闭蓝牙 扫描蓝牙 显示蓝牙设备 03【HarmonyOS 蓝牙】连接蓝牙 发现服务 获取特征值 读取信息 写入信息 和蓝牙模块交互 04【物联网 Wifi模块…...

MVC是什么?分别对应SpringBoot哪些层?

作为Java开发者,理解MVC在SpringBoot中的实现方式直接影响我们构建可维护的Web应用能力。本文将用生产级代码示例揭示各层对应关系,并分享分层设计中的实用技巧。 一、MVC本质:解耦的艺术(SpringBoot视角) 1. 经典MVC三元组 组件职责SpringBoot对应层典型代码注解Model数…...

【质量管理】TRIZ因果链分析:解码质量问题的“多米诺效应“

为什么要使用因果链分析 没有发现问题并不等于没有问题。爱因斯坦曾说&#xff0c;如果我只有一个小时的时间来拯救世界&#xff0c;我将花45分钟时间分析问题&#xff0c;10分钟的时间来检查问题&#xff0c;最后5分钟的时间来解决问题。可见问题分析的重要性。 在质量管理实践…...

解决librechat 前端界面没有google gemini 2.5模型的选项

问题概述 根据librechat 的更新清单&#xff0c;是支持了google gemini的模型&#xff0c;但是却找不到界面上较新的 2.5模型的配置选项。 通过查阅项目的文档&#xff08;GitHub&#xff09;&#xff0c; 看到&#xff1a; 由于目前还不支持获取模型列表&#xff0c;因此您应…...

STM32实现simpleFOC控制无刷电机

一、FOC基础知识学习 使用simpleFOC控制无刷电机前&#xff0c;需要大概了解一下相关知识&#xff0c;包括力矩控制、速度控制、位置控制的原理和它们之间的联系。 推荐学习资料&#xff1a; 教你写一个比SimpleFOC更好的电机库_哔哩哔哩_bilibili 《灯哥手把手教你写FOC算…...

Redis-数据一致性问题与解决方案

Redis-数据一致性问题与解决方案 引言 Redis 是一个高性能的内存数据库&#xff0c;广泛应用于缓存、会话存储、实时分析等场景。作为一个 NoSQL 数据库&#xff0c;它的高性能和丰富的数据结构使其成为现代微服务架构中不可或缺的组件。然而&#xff0c;在高并发的环境下&am…...

项目实战-基于信号处理与SVM机器学习的声音情感识别系统

目录 一.背景描述 二.理论部分 三.程序设计 编程思路 流程图 1.信号部分 创建数据 generate_samples.py 头文件 生成函数 generate_emotion_sample 传入参数 存储路径 生成参数 创建基础正弦波信号 调制基础正弦波 对于愤怒可以增加噪声 归一化信号 存储 主函…...

二、【LLaMA-Factory实战】数据工程全流程:从格式规范到高质量数据集构建

一、引言 在大模型微调中&#xff0c;数据质量直接决定模型性能。LLaMA-Factory提供了完整的数据工程工具链&#xff0c;支持从数据格式规范到清洗增强、注册验证的全流程管理。本文结合结构图、实战代码和生产级经验&#xff0c;带您掌握构建高质量数据集的核心技术。 二、数…...

【论文笔记】SOTR: Segmenting Objects with Transformers

【题目】&#xff1a;SOTR: Segmenting Objects with Transformers 【引用格式】&#xff1a;Guo R, Niu D, Qu L, et al. Sotr: Segmenting objects with transformers[C]//Proceedings of the IEEE/CVF international conference on computer vision. 2021: 7157-7166. 【网…...

23盘古石决赛

一&#xff0c;流量分析 1. 计算流量包文件的SHA256值是&#xff1f;[答案&#xff1a;字母小写][★☆☆☆☆] 答案&#xff1a;2d689add281b477c82b18af8ab857ef5be6badf253db1c1923528dd73b3d61a9 解压出来流量包计算 2. 流量包长度在“640 - 1279”之间的的数据包总共有多少…...

LLM量化方法:ZeroQuant、LLM.int8()、SmoothQuant、GPTQ、AWQ

文章目录 TLDR;量化分类量化时机量化粒度ZeroQuant: Efficient and Affordable Post-Training Quantization for Large-Scale Transformers细粒度硬件感知量化低成本逐层知识蒸馏&#xff08;Layer-by-layer Knowledge Distillation, LKD&#xff09; LLM.int8(): 8-bit Matrix…...

数字经济时代下的消费行为变迁与经济学启示

在信息技术革命的推动下&#xff0c;数字经济正重塑全球经济运行方式。据统计&#xff0c;2022年中国数字经济规模已达50.2万亿元&#xff0c;占GDP比重41.5%。这种结构性变革不仅改变了生产要素配置方式&#xff0c;更深刻重构了微观消费行为模式。本文将从经济学视角分析数字…...

如何阅读GitHub上的深度学习项目

一、前期准备&#xff1a;构建知识基础 1. 必备工具与环境 开发工具&#xff1a; IDE&#xff1a;VS Code&#xff08;推荐&#xff0c;轻量化插件丰富&#xff0c;如 Python、PyTorch 插件&#xff09;、PyCharm&#xff08;适合大型项目&#xff09;。版本控制&#xff1a;…...

Oracle中自定义异常内置异常嵌套异常的捕获处理

一、异常类型分类 类型说明示例内置预定义异常Oracle已命名异常&#xff08;如NO_DATA_FOUND&#xff09;查询无数据时触发内置非预定义异常未命名的Oracle错误&#xff08;需用PRAGMA EXCEPTION_INIT关联&#xff09;ORA-02290&#xff08;违反检查约束&#xff09;自定义异常…...

【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件detect.py解读

【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件detect.py解读 文章目录 【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件detect.py解读前言if name ‘main’parse_opt函数main函数run函数不同命令参数的推理结果常规推理命令推理命令(新增…...

耳机插进电脑只有一边有声音怎么办 解决方法分享

当您沉浸在音乐或电影中时&#xff0c;如果突然发现耳机只有一边有声音&#xff0c;这无疑会破坏您的体验。本文将提供一系列检查和修复方法&#xff0c;帮助您找出并解决问题&#xff0c;让您的耳机恢复正常的立体声效果。 一、检查耳机连接是否正常 首先需要确认耳机与播放设…...

共享会议室|物联网解决方案:打造高效、智能的会议空间!

在数字化转型的浪潮下&#xff0c;企业、园区、公共机构的会议室面临诸多痛点&#xff0c;如何通过物联网技术实现会议室资源的智能调度、环境设备的自动化控制以及用户体验的全面升级&#xff1f;本文将结合行业实践与技术方案&#xff0c;探讨基于物联网的共享会议室解决方案…...

Dp通用套路(闫式)

闫式dp分析法&#xff1a; 从集合角度来分析DP问题。 核心思想&#xff1a; DP是一种求有限集中的最值或者个数问题 由于集合中元素的数量都是指数级别的&#xff0c;直接用定义去求&#xff0c;把每种方案都用dfs暴力枚举一遍&#xff0c;时间复杂度很高&#xff0c;此时用…...

ffmpeg录音测试

ffmpeg ffmpeg 是一个强大的多媒体处理工具&#xff0c;可以用于录音、音频处理、视频录制等多种功能。以下是使用 ffmpeg 进行录音的详细指令和参数说明。 基本录音指令 以下是一个简单的 ffmpeg 录音命令&#xff0c;将音频录制为 WAV 格式文件&#xff1a; ffmpeg -f …...

Debezium RelationalSnapshotChangeEventSource详解

Debezium RelationalSnapshotChangeEventSource详解 1. 类的作用与功能 1.1 核心功能 RelationalSnapshotChangeEventSource是Debezium中用于关系型数据库快照的核心抽象类,主要负责: 数据快照:对数据库表进行全量数据快照模式捕获:捕获数据库表结构事务管理:确保快照过…...

华为设备端口隔离

端口隔离的理论与配置指南 一、端口隔离的理论 基本概念 端口隔离&#xff08;Port Isolation&#xff09;是一种在交换机上实现的安全功能&#xff0c;用于限制同一VLAN内指定端口间的二层通信。被隔离的端口之间无法直接通信&#xff0c;但可通过上行端口访问公共资源&#…...

RabbitMq(尚硅谷)

RabbitMq 1.RabbitMq异步调用 2.work模型 3.Fanout交换机&#xff08;广播模式&#xff09; 4.Diret交换机&#xff08;直连&#xff09; 5.Topic交换机&#xff08;主题交换机&#xff0c;通过路由匹配&#xff09; 6.Headers交换机&#xff08;头交换机&#xff09; 6…...

GAF-CNN-SSA-LSSVM故障诊断/分类预测,附带模型研究报告(Matlab)

GAF-CNN-SSA-LSSVM故障诊断/分类预测&#xff0c;附带模型研究报告&#xff08;Matlab&#xff09; 目录 GAF-CNN-SSA-LSSVM故障诊断/分类预测&#xff0c;附带模型研究报告&#xff08;Matlab&#xff09;效果一览基本描述程序设计参考资料 效果一览 基本描述 本研究提出的GA…...

数据分析怎么做?高效的数据分析方法有哪些?

目录 一、数据分析的对象和目的 &#xff08;一&#xff09;数据分析的常见对象 &#xff08;二&#xff09;数据分析的目的 二、数据分析怎么做&#xff1f; &#xff08;一&#xff09;明确问题 &#xff08;二&#xff09;收集数据 &#xff08;三&#xff09;清洗和…...