爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      从纯函数讲起,一窥最深刻的函子 Monad

      首页 知识中心 大数据 文章详情页

      从纯函数讲起,一窥最深刻的函子 Monad

      2024-09-25 10:15:01 阅读次数:47

      javascript,数据

      建议按顺序“食用”。饮水知其源,由 lambda 演算演化而来的闭包思想是 JavaScript 写在基因里的东西,闭包的“孪生子”柯里化,是封装高阶函数的利器。

      当我们频繁使用高阶函数、甚至自己不断在封装高阶函数的时候,其实就已经把“函数是一等公民”这个最核心的函数式编程思想根植在心里面了。

      函数可以作为参数、可以作为返回值、可以赋值给变量......

      本篇带来 JavaScript 函数式编程思想中最重要的概念之一 —— 纯函数,它定义了:写出怎样的函数才是优雅的! 由纯函数概念衍生,我们将进一步探讨:

      • 函数的输入和输出
      • 函数的副作用
      • 组合函数
      • 无形参风格编程
      • 以及最后将一窥较难理解的函子 Monad 概念

      纯函数

      什么样的函数才算“纯”?

      紧扣定义,满足以下两个条件的函数可以称作纯函数:

      1. 如果函数的调用参数相同,则永远返回相同的结果。它不依赖于程序执行期间函数外部任何状态或数据的变化,必须只依赖于其输入参数。
      2. 该函数不会产生任何可观察的副作用,例如网络请求,输入和输出设备或数据突变(mutation)

      输入 & 输出

      在纯函数中,约定:相同的输入总能得到相同的输出。而在日常 JavaScript 编程中,我们并没有刻意保持这一点,这会导致很多“意外”。

      🌰 比如:分不清 slice 和 splice 的区别

      var arr = [1,2,3,4,5];

      arr.slice(0,3); // [1,2,3]

      arr.slice(0,3); // [1,2,3]

      arr.slice(0,3); // [1,2,3]
      var arr = [1,2,3,4,5];

      arr.splice(0,3); // [1,2,3]

      arr.splice(0,3); // [4,5]

      arr.splice(0,3); // []

      使用 slice 无论多少次,相同的输入参数,都会有相同的结果;而 splice 则不会,splice 会修改原数组,导致即使参数完全相同,结果竟然完全不同。

      在数组中,类似的、会对原数组修改的方法还有不少:​​pop()、push()、shift()、unshift()、reverse()、sort()、splice()​​ 等,阅读代码时,想要得到原数组最终的值,必须追踪到每一次修改,这会大幅降低代码的可读性。

      🌰 比如: random 函数的不确定

      Math.random() // 0.9706010566439833
      Math.random() // 0.26820889412263416
      Math.random() // 0.6144693062318409

      ​​Math.random()​​ 每次运行,都会产生一个介于 0 和 1 之间的新随机数,你无法预测它,相同的输入、不通的输出,意外 + 1;

      相似的还有 ​​new Date()​​ 函数,每次相同的调用,结果不一致;

      new Date().toLocaleTimeString() // '11:43:44'

      new Date().toLocaleTimeString() // '11:44:16'

      🌰 比如:有隐式输出的函数

      var tax = 20;

      function calculateTax(productPrice) {
      tax = tax/100
      return (productPrice * tax) + productPrice;
      }

      calculateTax(100) // 120

      calculateTax(100) // 100.2

      上面 ​​calculateTax​​ 函数是一个比较隐蔽的非纯函数,输入相同的参数,得到不同的结果。

      究其原因是因为函数输出依赖外部变量 tax,并在无意中修改了外部变量。

      所以,综上,纯函数必须要是:有相同的输入就必须有相同输出的这样的函数,运行一次是这样,运行一万次也应该是这样。

      副作用

      除了保障相同的输入得到相同的输出这一点外,纯函数还要求:不会产生任何可观察的副作用。

      副作用指当调用函数时,除了返回可能的函数值之外,还对主调用函数产生附加的影响。

      副作用主要包含:

      • 可变数据
      • 打印/log
      • 获取用户输入
      • DOM 查询
      • 发送一个 http 请求
      • Math.random()
      • 获取的当前时间
      • 访问系统状态
      • 更改文件系统
      • 往数据库插入记录

      🌰 举一些常见的有副作用的函数例子:

      // 修改函数外部数据

      let num = 0
      function sum(x,y){
      num = x + y
      return num
      }

      // 调用 I/O

      function sum(x,y){
      console.log(x,y)
      return x+y
      }

      // 引用函数外检索值

      function of(){
      return this._value
      }

      // 调用磁盘方法

      function getRadom(){
      return Math.random()
      }

      // 抛出异常

      function sum(x,y){
      throw new Error()
      return x + y
      }

      我们不喜欢副作用,它充满了不确定性,我们的函数不是一个稳定的黑盒,假设 ​​function handleA()​​ 函数,我们只期望它的功能是 A 操作,不希望它意外的又操作了 B 或 C。

      所以,我们在纯函数内几乎不去引用、修改函数外部的任何变量,仅仅通过最初的形参输入,经过一系列计算后再 ​​return​​ 返回给外部。

      但副作用真的太常见了,有时候难以避免使用带副作用的非纯函数。在 JavaScript 函数式编程中,我们并不是倡导严格控制函数不带一点副作用,而是要尽量把这个“危险的玩意”控制在可控的范围内。后面会讲到如何控制非纯函数的副作用。

      “纯”的好处

      说了这么多关于“纯函数”概念,肯定有人会问:写纯函数有什么好处?我为什么要写纯函数?

      自文档化

      函数越纯,它的功能越明确,不需要你阅读它的时候还翻前找后,代码本身就是文档,甚至读一下方法名就能放心的使用它,而不用担心它还会不会有其它的影响。这就是代码的自文档化。

      🌰举个例子:

      实现一个登录功能:

      // 非纯函数

      var signUp = function(attrs) {
      var user = saveUser(attrs);
      welcomeUser(user);
      };

      var saveUser = function(attrs) {
      var user = Db.save(attrs);
      ...
      };

      var welcomeUser = function(user) {
      Email(user, ...);
      ...
      };

      // 纯函数

      var signUp = function(Db, Email, attrs) {
      return function() {
      let user = saveUser(Db, attrs);
      welcomeUser(Email, user);
      };
      };

      var saveUser = function(Db, attrs) {
      ...
      };

      var welcomeUser = function(Email, user) {
      ...
      };

      在纯函数表达中,每个函数需要用到的参数更明确、调用关系更明确,为我们提供了更多的基础信息,代码信息自成文档。

      组合函数

      本瓜常提的“组合函数”就是纯函数衍生出来的一种函数。把一个纯函数的结果作为另一个纯函数的输入,最终得到一个新的函数,就是组合函数。

      const componse = (...fns) => fns.reduceRight((pFn, cFn) => (...args) => cFn(pFn(...args)))
      function hello(name) { return `HELLO ${name}` }

      function connect(firstName, lastName) { return firstName + lastName; }

      function toUpperCase(name) { return name.toUpperCase() }
      const sayHello = componse(hello, toUpperCase, connect)

      console.log(sayHello('juejin', 'anthony')) // HELLO JUEJINANTHONY

      多个纯函数组合起来的函数也一定是纯函数。

      引用透明性

      引用透明性是指一个函数调用可以被它的输出值所代替,并且整个程序的行为不会改变。

      我们可以利用这个特性对纯函数进行“加和乘”的运算,这是重构代码的绝妙手段之一~

      🌰比如:

      优化以下代码:

      var Immutable = require('immutable');

      var decrementHP = function(player) {
      return player.set("hp", player.hp-1);
      };

      var isSameTeam = function(player1, player2) {
      return player1.team === player2.team;
      };

      var punch = function(player, target) {
      if(isSameTeam(player, target)) {
      return target;
      } else {
      return decrementHP(target);
      }
      };

      var jobe = Immutable.Map({name:"Jobe", hp:20, team: "red"});
      var michael = Immutable.Map({name:"Michael", hp:20, team: "green"});

      punch(jobe, michael);

      因为 ​​decrementHP​​​ 和 ​​isSameTeam​​ 都是纯函数,我们可以用等式推导、手动执行、值的替换来简化代码:

      因为数据不可变,所以 ​​isSameTeam(player, target)​​​ 替换成 ​​"red" === "green"​​​,在 puch 函数内,​​if(false){...}​​​ 则直接删掉,然后将 ​​decrementHP​​ 函数内联,最终简化为:

      var punch = function(player, target) {
      return target.set("hp", target.hp-1);
      };

      var jobe = Immutable.Map({name:"Jobe", hp:20, team: "red"});
      var michael = Immutable.Map({name:"Michael", hp:20, team: "green"});

      punch(jobe, michael);

      纯函数的引用透明性让纯函数能做简单运算及替换,在重构中能大大减少代码量。

      其它

      • 纯函数不需要访问共享的内存,这也是它的决定性好处之一。这样一来,它无需处于竞争态,使得 JS 在服务端的并行能力极大提高。
      • 纯函数还能让测试更加容易。我们不需要模拟一个真实的场景,只需要简单模拟函数的输入、然后断言输出即可。
      • 纯函数与运行环境无关,只要愿意吗,可以在任何地方移植它、运行它,其本身已经撇除了函数所携带的的各种隐式环境,这是命令式编程的弊病之一。

      言而总之,函数尽量写“纯”一点,好处真的有很多~ 写着写着就知道了

      从纯函数讲起,一窥最深刻的函子 Monad

      无形参风格

      纯函数的引用透明性可以等式推导演算,在函数式编程中,有一种流行的代码风格和它很相似,如出一辙。

      这种风格就是无形参风格,其目的是通过移除不必要的形参-实参映射来减少视觉上的干扰。

      🌰举例说明:

      function double(x) {
      return x * 2;
      }

      [1,2,3,4,5].map( function mapper(v){
      return double( v );
      } );

      ​​double​​​ 函数和 ​​mapper​​​ 函数有着相同的形参,​​mapper​​​ 的参数 v 可以直接映射到 ​​double​​​ 函数里的实参里,所以 ​​mapper(..)​​ 函数包装是非必需的。我们可以将其简化为无形参风格:

      function double(x) {
      return x * 2;
      }

      [1,2,3,4,5].map( double );
      // [2,4,6,8,10]

      无形参可以提高代码的可读性和可理解性。

      其实我们也能看出只有纯函数的组合才能更利于写出无形参风格的代码,看起来更优雅~

      Monad

      前面一直强调:纯函数!无副作用!

      谈何容易?HTTP 请求、修改函数外的数据、输出数据到屏幕或控制台、DOM查询/操作、Math.random()、获取当前时间等等这些操作都是我们经常需要做的,根本不可能摈弃它们,不然连最基础功能都实现不了。。。

      解决上述矛盾,这里要抛出一个哲学问题:

      你是否能知道一间黑色的房间里面有没有一只黑色的猫?

      从纯函数讲起,一窥最深刻的函子 Monad

      明显是不能的,直到开灯那一刻之前,把一只猫藏在一间黑色的屋子里,和一间干净的黑屋子都是等效的。

      所以,对了!我们可以把不纯的函数用一间间黑色屋子装起来,最后一刻再亮灯,这样能保证在亮灯前一刻,一直都是“纯”的。

      这些屋子就是单子 —— “Monad”!

      🌰举个例子,用 JavaScript 模拟这个过程:

      var fs = require("fs");

      // 纯函数,传入 filename,返回 Monad 对象
      var readFile = function (filename) {
      // 副作用函数:读取文件
      const readFileFn = () => {
      return fs.readFileSync(filename, "utf-8");
      };
      return new Monad(readFileFn);
      };

      // 纯函数,传入 x,返回 Monad 对象
      var print = function (x) {
      // 副作用函数:打印日志
      const logFn = () => {
      console.log(x);
      return x;
      };
      return new Monad(logFn);
      };

      // 纯函数,传入 x,返回 Monad 对象
      var tail = function (x) {
      // 副作用函数:返回最后一行的数据
      const tailFn = () => {
      return x[x.length - 1];
      };
      return new Monad(tailFn);
      };

      // 链式操作文件
      const monad = readFile("./xxx.txt").bind(tail).bind(print);
      // 执行到这里,整个操作都是纯的,因为副作用函数一直被包裹在 Monad 里,并没有执行
      monad.value(); // 执行副作用函数

      ​​readFile、print、tail​​ 函数最开始并非是纯函数,都有副作用操作,比如读文件、打印日志、修改数据,然而经过用 Monad 封装之后,它们可以等效为一个个纯函数,然后通过链式绑定,最后调用执行,也就是开灯。

      在执行 ​​monad.value()​​ 这句之前,整段函数都是“纯”的,都没有对外部环境做任何影响,也就意味着我们最大程度的保证了“纯”这一特性。

      王垠在​​《对函数式语言的误解》​​中准确了描述了 Monad 本质:

      Monad 本质是使用类型系统的“重载”(overloading),把这些多出来的参数和返回值,掩盖在类型里面。这就像把乱七八糟的电线塞进了接线盒似的,虽然表面上看起来清爽了一些,底下的复杂性却是不可能消除的。

      上述的 Monad 只是最通俗的理解,实际上 Monad 还有很多分类,比如:Maybe 单子、List 单子、IO 单子、Writer 单子等,后面再讨论~

      结语

      本篇从纯函数出发,JavaScript 函数要写的优雅,一定要“纯”!写纯函数、组合纯函数、简化运算纯函数、无形参风格、纯函数的链式调用、Monad 封装不存的函数让它看起来“纯”~

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/u_13961087/5821497,作者:CTO安东尼,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:用c++编写寻找最大数

      下一篇:初学Android,使用Bundle在Activity间交换数据(九)

      相关文章

      2025-05-19 09:04:53

      【NetApp数据恢复】误操作导致NetApp存储的卷丢失,卷内虚拟机无法访问的数据恢复案例

      【NetApp数据恢复】误操作导致NetApp存储的卷丢失,卷内虚拟机无法访问的数据恢复案例

      2025-05-19 09:04:53
      存储 , 数据 , 数据恢复 , 解压
      2025-05-16 09:15:10

      画图时使用的函数和一些错误处理

      画图时使用的函数和一些错误处理

      2025-05-16 09:15:10
      数据
      2025-05-14 10:33:25

      超级好用的C++实用库之国密sm4算法

      国密SM4算法,全称为国家密码管理局制定的SM4分组密码算法,是中国自主设计的商用密码算法标准之一,用于数据的对称加密。

      2025-05-14 10:33:25
      加密 , 参数 , 数据 , 模式 , 解密
      2025-05-14 10:07:38

      30天拿下Rust之引用

      在Rust语言中,引用机制是其所有权系统的重要组成部分,它为开发者提供了一种既高效又安全的方式来访问和共享数据。引用可以被视为一个指向内存地址的指针,它允许我们间接地访问和操作存储在内存中的数据。

      2025-05-14 10:07:38
      Rust , text , 可变 , 引用 , 数据
      2025-05-14 10:07:38

      30天拿下Rust之所有权

      在编程语言的世界中,Rust凭借其独特的所有权机制脱颖而出,为开发者提供了一种新颖而强大的工具来防止内存错误。这一特性不仅确保了代码的安全性,还极大地提升了程序的性能。

      2025-05-14 10:07:38
      data , Rust , 内存 , 函数 , 变量 , 数据
      2025-05-14 10:03:13

      超级好用的C++实用库之Base64编解码

      Base64是一种编码方式,用于将二进制数据转换为可打印的ASCII字符。这种编码方式常用于在HTTP协议等应用中传输二进制数据,比如:图片、音频、视频等。

      2025-05-14 10:03:13
      Base64 , 字符串 , 数据 , 编码 , 长度
      2025-05-14 10:03:13

      【MySQL】-数据库优化(索引)

      索引(index)是帮助数据库高效获取数据的数据结构

      2025-05-14 10:03:13
      index , Tree , 二叉 , 搜索 , 数据 , 索引 , 节点
      2025-05-14 10:02:58

      java项目多端数据同步解决方案

      多端数据同步是指在多个设备(例如桌面应用、移动应用、Web应用)之间保持数据的一致性。

      2025-05-14 10:02:58
      java , Spring , WebSocket , 同步 , 数据 , 版本号
      2025-05-14 10:02:58

      超级好用的C++实用库之字节流解析器

      字节流解析器是一种软件组件,它负责将接收到的原始二进制数据(字节流)转换为有意义的信息结构或格式。在计算机网络、文件处理和数据通信中,字节流是最基本的数据传输形式,但这些原始字节对于应用程序通常是没有直接意义的,需要通过特定的解析规则来解读。

      2025-05-14 10:02:58
      true , 参数 , 字节 , 数据 , 获取 , 解析器 , 返回值
      2025-05-13 09:49:27

      变量基础_变量场景

      变量基础_变量场景

      2025-05-13 09:49:27
      变量 , 场景 , 存储 , 学习 , 数据 , 编程语言
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5221898

      查看更多

      最新文章

      画图时使用的函数和一些错误处理

      2025-05-16 09:15:10

      30天拿下Rust之引用

      2025-05-14 10:07:38

      springmvc五种数据提交方式

      2025-05-07 09:07:56

      【30天玩转python】机器学习入门

      2025-05-06 09:19:30

      【30天玩转python】数据分析与可视化

      2025-05-06 09:19:30

      【 数据建模与预测】数据建模的基本方法与预测技术

      2025-05-06 09:18:38

      查看更多

      热门文章

      5、使用PyTorch 实现线性回归

      2023-02-27 09:14:47

      一次k8s 数据卷异常问题的解决

      2022-11-08 07:33:08

      Dataloader有哪些使用方法

      2023-02-13 08:10:07

      Vue:自定义v-model数据双向绑定

      2022-11-17 12:37:28

      2022-04-01 访问k8s内的etcd的数据

      2023-02-23 07:38:36

      提升网络训练的准确率

      2023-02-13 09:26:16

      查看更多

      热门标签

      算法 leetcode python 数据 java 数组 节点 大数据 i++ 链表 golang c++ 排序 django 数据类型
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      使用Ajax请求数据

      数据仓库与数据挖掘

      Hive-分区与分桶详解(超详细)

      Redis 为何使用近似 LRU 算法淘汰数据,而不是真实 LRU?

      Hive-基础介绍

      【30天玩转python】机器学习入门

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号