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

Qt中常见的JS类和函数(二): 全局对象

相关系列文章

Qt中字符串转换为JS的函数执行

Qt中常见的JS类和函数(一): 全局对象

Qt中常见的JS类和函数(二): 全局对象

目录

2.3.构造函数属性

2.3.1.Object

2.3.2.Function

2.3.3.Array

2.3.4.ArrayBuffer

2.3.5.String

2.3.6.Boolean

2.3.7.Number

2.3.8.DataView

2.3.9.Date

2.3.10.Promise

2.3.11.RegExp

2.3.12.Map

2.3.13.Set

2.3.14.SharedArrayBuffer

2.4.其它属性

2.4.1.Atomics

2.4.2.Math

2.4.3.JSON

2.4.4.Reflect


2.3.构造函数属性

2.3.1.Object

        ECMAScript 中的 Object 对象与 Java 中的 java.lang.Object 相似,ECMAScript 中的所有对象都由这个对象继承而来,Object也是平时使用最多的一个类型,虽然Object的实例不具备多少功能,但对于在应用程序中存储和传输数据而言,它们确实是非常理想的选择。

        创建Object实例的方式有两种,第一种是使用new操作符后跟Object构造函数,如下所示:

var person = new Object();
person.name = "zdxiao";
person.age = 2;

        第二种是使用对象字面量表示,如下所示:

var person = {name: "zdxiao",age: 28
};

其他的功能会后面的详细讲解。

2.3.2.Function

函数实际上就是对象,每个函数都是Function类型的实例,而且都与其它引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。函数定义如下:

function  sum(num1, num2){return num1+num2;
}

这与下面使用函数表达式定义函数的方式相差无几。

var sum = function(num1, num2){return num1+num2;
};

还有一种定义函数的方式是使用Function构造函数。Function构造函数可以接受任意数量参数,但是最后一个参数始终都被看着是函数体,而前面的参数则枚举出了新函数的参数,语法如下:

var function_name = new function(arg1, arg2, ..., argN, function_body);

如下例子:

var  sum = new Function("num1", "num2", "return num1+num2"); //不推荐

这种写法会导致解析两次代码(第一次是解析常规ECMAScript代码,第二次是解析传入构造函数中的字符串),从而影响性能,不过,这种语法对于理解"函数是对象,函数名是指针"的概念倒是非常直观的。

2.3.3.Array

数组,是个有序列表。数组可以存储对象,数组的大小是可以动态调整的。创建数组的方式有两种,一是使用Array构造函数,如:

var colors = new Array(); //创建一个空的数组
var colors = new Array(20); //创建一个大小为20的数组var colors = Array(2);  //创建一个大小为2的数组
var colors = Array("zdxiao");  //创建一个大小为1的数组

二是使用数组字面量表示,数组字面量由一对包含数组项的方括号表示,多个数组项之间用逗号隔开,如:

var colors = ["21414", "1412412", "fqwfqwf"];
var colors = [];
var colors = [1, 2, "322r23"];

2.3.4.ArrayBuffer

        ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区。它是一个字节数组,通常在其他语言中称为“byte array”。

        你不能直接操作 ArrayBuffer 的内容,而是要通过类型数组对象或 DataView 对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区的内容。如下示例:

// create an ArrayBuffer with a size in bytes
const buffer = new ArrayBuffer(8);
console.log(buffer.byteLength);
// expected output: 8

2.3.5.String

String类型是字符串的对象包装类型,可以像下面这样使用String构造函数来创建。

var str = new String("23rt4erfegrth");

还可以直接使用字面量方式,如:

var str1 = 'hello';  //字面量声明方式

两种方式在使用上没有区别,但是在检测数据类型上是有一定的区别。

console.log(typeof str); //返回结果: 'string'
console.log(typeof o_str); //返回结果:'object' 

2.3.6.Boolean

Boolean 对象用于转换一个不是 Boolean 类型的值转换为 Boolean 类型值 (true 或者false)。定义如下:

var a = new Boolean(false);
var b = true;

2.3.7.Number

Number 对象是原始数值的包装对象。定义如下:

var numberObject = new Number(10);

2.3.8.DataView

DataView视图是一个可以从二进制ArrayBuffer对象中读写多种数值类型的底层接口,使用它时,不用考虑不同平台的字节序问题。语法:

new DataView(buffer[, byteOffset[, byteLength]]);//参数buffer一个已经存在的ArrayBuffer或Shared

2.3.9.Date

Date 对象用于处理日期与时间。以下四种方法同样可以创建 Date 对象:

var d = new Date();
var d = new Date(milliseconds); // 参数为毫秒
var d = new Date(dateString);
var d = new Date(year, month, day, hours, minutes, seconds, milliseconds);
  • milliseconds 参数是一个 Unix 时间戳(Unix Time Stamp),它是一个整数值,表示自 1970 年 1 月 1 日 00:00:00 UTC(the Unix epoch)以来的毫秒数。

  • dateString 参数表示日期的字符串值。

  • year, month, day, hours, minutes, seconds, milliseconds 分别表示年、月、日、时、分、秒、毫秒。

2.3.10.Promise

Promise 对象用于表示一个异步操作的最终状态(完成或失败),以及其返回的值。

2.3.11.RegExp

正则表达式是描述字符模式的对象。

正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具。

如:

var re = new RegExp("\\w+");
var re = /\w+/;

2.3.12.Map

Map是一组键值对的结构,具有极快的查找速度。定义如下:

var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
m.get('Michael'); // 95
var n = new Map();

2.3.13.Set

SetMap类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。

要创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set

var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3]); // 含1, 2, 3

重复元素在Set中自动被过滤:

var s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"}

注意数字3和字符串'3'是不同的元素。

2.3.14.SharedArrayBuffer

SharedArrayBuffer与ArrayBuffer的功能类似,SharedArrayBuffer 与 ArrayBuffer 具有同样的 API。二者的主要区别是 ArrayBuffer 必须 在不同执行上下文间切换,SharedArrayBuffer 则可以被任意多个执行上下文同时使用。

2.4.其它属性

2.4.1.Atomics

        JavaScript Atomics是一个原子操作库,它使多线程和共享内存的JavaScript编程变得更加容易和可靠。该库提供了一些原子数据类型、原子操作和同步原语,以便开发人员可以更加轻松地编写具有正确同步保证的并发JavaScript程序。

        这些原子操作属于 Atomics 模块。与一般的全局对象不同,Atomics 不是构造函数,因此不能使用 new 操作符调用,也不能将其当作函数直接调用。Atomics 的所有属性和方法都是静态的(与 Math 对象一样)。

JavaScript Atomics有以下原子数据类型:

  • Int8Array
  • Uint8Array
  • Int16Array
  • Uint16Array
  • Int32Array
  • Uint32Array
  • BigInt64Array
  • BigUint64Array

这些类型都是JavaScript的TypedArray类型,并支持原子操作。

JavaScript Atomics提供了以下原子操作:

  • Atomics.add()将指定位置上的数组元素与给定的值相加,并返回相加前该元素的值。
  • Atomics.and()将指定位置上的数组元素与给定的值相与,并返回与操作前该元素的值。
  • Atomics.compareExchange()如果数组中指定的元素与给定的值相等,则将其更新为新的值,并返回该元素原先的值。
  • Atomics.exchange()将数组中指定的元素更新为给定的值,并返回该元素更新前的值。
  • Atomics.isLockFree(size)可以用来检测当前系统是否支持硬件级的原子操作。对于指定大小的数组,如果当前系统支持硬件级的原子操作,则返回 true;否则就意味着对于该数组,Atomics 对象中的各原子操作都只能用锁来实现。此函数面向的是技术专家。
  • Atomics.load()返回数组中指定元素的值。
  • Atomics.notify()唤醒等待队列中正在数组指定位置的元素上等待的线程。返回值为成功唤醒的线程数量。
  • Atomics.or()将指定位置上的数组元素与给定的值相或,并返回或操作前该元素的值。
  • Atomics.store()将数组中指定的元素设置为给定的值,并返回该值。
  • Atomics.sub()将指定位置上的数组元素与给定的值相减,并返回相减前该元素的值。
  • Atomics.wait()检测数组中某个指定位置上的值是否仍然是给定值,是则保持挂起直到被唤醒或超时。返回值为 "ok"、"not-equal" 或 "time-out"。调用时,如果当前线程不允许阻塞,则会抛出异常(大多数浏览器都不允许在主线程中调用 wait())。
  • Atomics.xor()将指定位置上的数组元素与给定的值相异或,并返回异或操作前该元素的值。

下面是一个示例程序,展示如何使用Atomics在JavaScript中进行原子操作:

const sharedArray = new Int32Array(new SharedArrayBuffer(4));
Atomics.store(sharedArray, 0, 42);
console.log(Atomics.load(sharedArray, 0)); // 42
Atomics.add(sharedArray, 0, 2);
console.log(Atomics.load(sharedArray, 0)); // 44

在这个示例程序中,我们创建了一个具有一条整数的共享数组。然后,我们使用Atomics.store设置该数组的第一个元素为42。接下来,我们使用Atomics.add将值增加了2。最后,我们使用Atomics.load读取该值。该程序应该输出42和44。

2.4.2.Math

        Math是一个内置对象,它拥有一些数学常数属性和数学函数方法,Math不是一个函数对象。与其他全局对象不同的是,Math 不是一个构造器。Math 的所有属性与方法都是静态的。引用圆周率的写法是 Math.PI,调用正余弦函数的写法是 Math.sin(x),x 是要传入的参数。Math 的常量是使用 JavaScript 中的全精度浮点数来定义的。

        Math包中定义的主要函数会在后面详解

2.4.3.JSON

对象表示法,即键值对表示。基本单位是对象。{key:value}

全成JavaScript Object Notation。JS对象简谱。是一种轻量级的数据交换格式。使用JavaScript语法形式,长得很像JavaScript的Object,但是JSON格式仅仅是一个文本,数据类型String。这样,文本String可以被任何编程语言读取,解析,进而作为数据格式传递。

JSON 语法支持表示 3 种类型的值。
1)简单值:字符串、数值、布尔值和 null 可以在 JSON 中出现,就像在 JavaScript 中一样。特殊值 undefined 不可以。如:

3333
“请问该如何体育”

        JavaScript 字符串与 JSON 字符串的主要区别是,JSON 字符串必须使用双引号(单引号会导致语法错误)。

  布尔值和 null 本身也是有效的 JSON 值。不过,实践中更多使用 JSON 表示比较复杂的数据结构,其中会包含简单值。

2)对象:对象表示有序键/值对。每个值可以是简单值,也可以是复杂类型。如:

let person = {name: "Nicholas",age: 29
};
let object = {		// js中属性名加上引号,等同于上面的效果"name": "Nicholas","age" : 29
};

但 JSON 中的对象必须使用双引号把属性名包围起来。
3)数组:数组表示可以通过数值索引访问的值的有序列表。数组的值可以是任意类型,包括简单值、对象,甚至其他数组。如:

[25, "hi", true]

数组和对象可以组合使用,以表示更加复杂的数据结构。即数组中的元素可以是对象,或对象中的属性值可以为数组。如:

{
"sites":
[{"name":"Runoob", "url":"www.runoob.com"},
{"name":"Google", "url":"www.google.com"},
{"name":"Taobao", "url":"www.taobao.com"}]
}
//site这个key对应的value,是一个数组,3个站点记录的数组。

2.4.4.Reflect

Reflect 是一个内建的对象,用来提供方法去拦截 JavaScript 的操作。
Reflect 不是一个函数对象,所以它是不可构造的,也就是说它不是一个构造器,不能通过 new 操作符去新建或者将其作为一个函数去调用 Reflect 对象。
Reflect 的所有属性和方法都是静态的。

Reflect对象当前有 13 个静态方法。

// 对一个函数进行调用操作,同时可以传入一个数组作为调用参数。
Reflect.apply(target, thisArg, args)	
// 对构造函数进行 new 操作,相当于执行 new target(...args)。
Reflect.construct(target, args)
// 获取对象身上某个属性的值,类似于 target[name]。如果没有该属性,则返回undefined。
Reflect.get(target, name, receiver)
// 将值分配给属性的函数。返回一个Boolean,如果更新成功,则返回true。
Reflect.set(target, name, value, receiver)
// Reflect.defineProperty方法基本等同于Object.defineProperty,直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,不同的是,Object.defineProperty返回此对象。而Reflect.defineProperty会返回布尔值.
Reflect.defineProperty(target, name, desc)
// 作为函数的delete操作符,相当于执行 delete target[name]。
Reflect.deleteProperty(target, name)
// 判断一个对象是否存在某个属性,和 in 运算符 的功能完全相同。
Reflect.has(target, name)
// 返回一个包含所有自身属性(不包含继承属性)的数组。(类似于 Object.keys(), 但不会受enumerable影响, Object.keys返回所有可枚举属性的字符串数组).
Reflect.ownKeys(target)
// 判断一个对象是否是可扩展的(是否可以在它上面添加新的属性),类似于 Object.isExtensible()。返回表示给定对象是否可扩展的一个Boolean 。(Object.seal 或 Object.freeze 方法都可以标记一个对象为不可扩展。)
Reflect.isExtensible(target)
// 让一个对象变的不可扩展,也就是永远不能再添加新的属性。
Reflect.preventExtensions(target)
// 如果对象中存在该属性,如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),否则返回 undefined。类似于 Object.getOwnPropertyDescriptor()。
Reflect.getOwnPropertyDescriptor(target, name)
// 返回指定对象的原型.类似于 Object.getOwnPropertyDescriptor()。
Reflect.getPrototypeOf(target)
// 设置对象原型的函数. 返回一个 Boolean, 如果更新成功,则返回true。如果 target 不是 Object ,或 prototype 既不是对象也不是 null,抛出一个 TypeError 异常。
Reflect.setPrototypeOf(target, prototype)

示例如下:

// Reflect.apply
var obj1 = {};
Reflect.apply(Math.floor, obj1, [1.88]) // 1;// Reflect.construct
const obj2 = Reflect.construct(Date, [2021, 3, 1])// Reflect.get
var obj3 = { x: 1, y: 2 };
Reflect.get(obj3, "x"); // 1// Reflect.set
var obj4 = {};
Reflect.set(obj4, "prop", "value"); // true// Reflect.defineProperty(
const obj5 = {};
Reflect.defineProperty(obj5, 'property', {value: 666,writable: false
}); // true// Reflect.deleteProperty
var obj6 = { x: 1, y: 2 };
Reflect.deleteProperty(obj6, "x"); // true
obj; // { y: 2 }// Reflect.has
const obj7 = {x: 0}
Reflect.has(obj7, "x"); // true// Reflect.ownKeys
const obj8 = {z: 3, y: 2, x: 1}
Reflect.ownKeys(obj8); // [ "z", "y", "x" ]// Reflect.isExtensible
var obj9 = {};
Reflect.isExtensible(obj9); // true// Reflect.preventExtensions
var obj10 = {};
Reflect.isExtensible(obj10); // true
Reflect.preventExtensions(obj10);
Reflect.isExtensible(obj10); // false// Reflect.getOwnPropertyDescriptor
const obj11 = {x: "hello"}
Reflect.getOwnPropertyDescriptor(obj11, "x");
// {value: "hello", writable: true, enumerable: true, configurable: true}// Reflect.getPrototypeOf
var obj12 = {};
Reflect.getPrototypeOf(obj12); // 等同于Object.prototype// Reflect.setPrototypeOf
var obj13 = {};
Reflect.setPrototypeOf(obj13, null); // true

相关文章:

Qt中常见的JS类和函数(二): 全局对象

相关系列文章 Qt中字符串转换为JS的函数执行 Qt中常见的JS类和函数(一): 全局对象 Qt中常见的JS类和函数(二): 全局对象 目录 2.3.构造函数属性 2.3.1.Object 2.3.2.Function 2.3.3.Array 2.3.4.ArrayBuffer 2.3.5.String 2.3.6.Boolean 2.3.7.Number 2.3.8.DataView …...

mysql 安装 与 使用

1.安装地址(社区免费版本) https://dev.mysql.com/downloads/mysql/ 2.查看端口 ****是否被占用(例子 3306端口) netstat -an | find "3306" 3.配置环境 系统变量名 变量名:MYSQL_HOME 变量值&#…...

2月26日做题总结(C/C++真题)

今天是2024年2月16日,新学期开学第一天。在大三这个重要阶段,我决定参加24年秋招。在准备项目的同时,也先做一些入门的笔试题吧,慢慢积累。如果你也是处于这个阶段,欢迎来找我交流讨论! 今天是做题第一天&a…...

创作纪念日:记录我的成长与收获

机缘 一开始是在我深入学习前端知识的Vue.js框架遇到了一个问题,怎么都解决不了,心烦意乱地来csdn上找解决方法。开心的是真被我找到了,真的很感恩,也意识到在这个平台上分享自己的经验是多么有意义的事情,可能随便的…...

全志H713/H618方案:调焦电机(相励磁法步进电机)的驱动原理、适配方法

一、篇头 全志H713平台,作为FHD投影的低成本入门方案,其公板上也配齐了许多投影使用的模组,本文即介绍投影仪调焦所用的步进电机,此模组的驱动原理、配制方法、调试方法。因为条件限制,本文采用的是H618香橙派Z3平台&…...

excel数据导入到数据库的方法

背景:最近在做和HW对接的某项目,需要将第三方接口提供的数据进行展示;在对方提供了详细的excel后,觉得也挺简单的就是将excel数据导入到数据库中。 方案一: 普通的初学者肯定会想,那我读取excel数据&…...

Runaway Queries 管理:提升 TiDB 稳定性的智能引擎

在数字化系统扮演重要角色的今天,数据库稳定性成为企业关注的核心问题。对于重要计算机系统而言,突发的性能下降可能对业务造成不可估量的损失。为了稳定数据库性能,用户可以从管理流程入手规范变更的测试,或者利用产品手段减少预…...

K8S部署Java项目(Gitlab CI/CD自动化部署终极版)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

对Redis锁延期的一些讨论与思考

上一篇文章提到使用针对不同的业务场景如何合理使用Redis分布式锁,并引入了一个新的问题 若定义锁的过期时间是10s,此时A线程获取了锁然后执行业务代码,但是业务代码消耗时间花费了15s。这就会导致A线程还没有执行完业务代码,A线程…...

【高德地图】Android高德地图初始化定位并显示小蓝点

&#x1f4d6;第3章 初始化定位并显示小蓝点 ✅第1步&#xff1a;配置AndroidManifest.xml✅第2步&#xff1a;设置定位蓝点✅第3步&#xff1a;初始化定位✅完整代码 ✅第1步&#xff1a;配置AndroidManifest.xml 在application标签下声明Service组件 <service android:n…...

继电器测试中需要注意的安全事项有哪些?

继电器广泛应用于电气控制系统中的开关元件&#xff0c;其主要功能是在输入信号的控制下实现输出电路的断开或闭合。在继电器测试过程中&#xff0c;为了确保测试的准确性和安全性&#xff0c;需要遵循一定的安全事项。以下是在进行继电器测试时需要注意的安全事项&#xff1a;…...

Java向ES库中插入数据报错:I/O reactor status: STOPPED

Java向ES库中插入数据报错&#xff1a;java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: STO 一、问题问题原因 二、解决思路 一、问题 在使用Java向ES库中插入数据时&#xff0c;第一次成功插入&#xff0c;第二次出现以下错误&#xff1a…...

vue3实现页面跳转

有需求是在vue项目中实现点击按钮完成页面跳转。这里不适用a标签&#xff0c;而是用vue自带的vue-router。 首先看一下项目结构 src │ App.vue │ main.js │ ├─router │ index.js │ └─views index.vue content.vue 可以看到&…...

【Linux运维系列】vim操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Centos服务器部署前后端项目

目录 准备工作1. 准备传输软件2. 连接服务器 部署Mysql1.下载Mysql(Linux版本)2. 解压3. 修改配置4. 启动服务另一种方法Docker 部署后端1. 在项目根目录中创建Dockerfile文件写入2. 启动 部署前端1. 在项目根目录中创建Dockerfile文件写入2. 启动 准备工作 1. 准备传输软件 …...

【初始RabbitMQ】延迟队列的实现

延迟队列概念 延迟队列中的元素是希望在指定时间到了之后或之前取出和处理消息&#xff0c;并且队列内部是有序的。简单来说&#xff0c;延时队列就是用来存放需要在指定时间被处理的元素的队列 延迟队列使用场景 延迟队列经常使用的场景有以下几点&#xff1a; 订单在十分…...

spark为什么比mapreduce快?

spark为什么比mapreduce快&#xff1f; 首先澄清几个误区&#xff1a; 1&#xff1a;两者都是基于内存计算的&#xff0c;任何计算框架都肯定是基于内存的&#xff0c;所以网上说的spark是基于内存计算所以快&#xff0c;显然是错误的 2;DAG计算模型减少的是磁盘I/O次数&…...

Unity通过XXpermission插件获取MANAGE_EXTERNAL_STORAGE权限

最近公司准备用Unity做一个安卓端的文件管理器功能&#xff0c;文件管理器已经做完了。刚开始的时候想要申请一下所有文件权限&#xff0c;发现在Unity里面申请所有文件权限(android.permission.MANAGE_EXTERNAL_STORAGE)相对来说比较麻烦。所以准备写一下文章记录一下如何申请…...

「连载」边缘计算(二十一)02-26:边缘部分源码(源码分析篇)

&#xff08;接上篇&#xff09; DeviceTwin struct组成剖析 该部分对DeviceTwin struct的组成进行剖析。接着devicetwin struct调用链剖析的实例化DeviceTwin struct&#xff08;dt : DeviceTwin{}&#xff09;往下剖析&#xff0c;进入DeviceTwin struct的定义&#xff0c;…...

Unity(第四部)新手组件

暴力解释就是官方给你的功能&#xff1b;作用的对象上面如&#xff1a; 创建一个球体&#xff0c;给这个球体加上重力 所有物体都是一个空物体&#xff0c;加上一些组件才形成了所需要的GameObject。 这是一个空物体&#xff0c;在Scene场景中没有任何外在表现&#xff0c;因为…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...