【JavaScript】ES6新特性(3)

news2025/1/10 22:44:53

10. Symbol

使用 Symbol,表示独一无二的值

每个 Symbol 是不一样的

不能进行运算

可以显式调用 toString()

可以隐式转换 boolean

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Symbol</title>
</head>

<body>
    <script>
        let obj = {
            name: "ich",
            getName() {
                console.log(this.name);
            }
        }

        obj.name = "du";
        // 设置的对象属性值被随意改动
        obj.getName(); // du

        // 使用 Symbol,表示独一无二的值
        let s1 = Symbol(); // 生成一个 Symbol 类型数据
        let s2 = Symbol();
        console.log(typeof s1); // symbol

        // 每个 Symbol 是不一样的
        console.log(s1 == s2); // false
        console.log(s1 === s2); // false

        // 不能进行运算
        // console.log(s1 + "aaaa"); // Uncaught TypeError: Cannot convert a Symbol value to a string
        // console.log(s1 > "aaaa"); // Uncaught TypeError: Cannot convert a Symbol value to a number

        // 可以显式调用 toString()
        console.log(s1.toString()); // Symbol
        console.log(s1.toString() + "aaa"); // Symbolaaa

        // 可以隐式转换 boolean
        // s1 被转换成 true
        if (s1) {
            console.log("执行");
        }
    </script>
</body>

</html>

10.1 使用Symbol作为对象属性名

用法:由于每一个 Symbol 的值都是不相等的,所以 Symbol 作为对象的属性名,可以保证属性不重名

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>使用Symbol作为对象属性名</title>
</head>

<body>
    <script>
        let obj = {
            name: "ich",
            getName() {
                console.log(this.name);
            }
        }

        let name = Symbol();
        obj[name] = "du";
        console.log(obj[name]); // du
        // 定义 symbol 变量,添加到 对象 作为对象的属性
        // 作为新的属性,不会覆盖重名的普通属性
        console.log(obj.name); // ich

        // 不想对象属性被随意更改,使用symbol
        let name1 = Symbol();
        let age1 = Symbol();
        let obj1 = {
            [name1]: "ich",
            [age1]: 100
        }
        console.log(obj1[name1]);
        console.log(obj1[age1]);

        // 不可以直接在里面这样定义,外面访问不到
        let obj2 = {
            [Symbol()]: "no",
        }
        console.log(obj2[Symbol()]); // 找的是另一个新创建的 Symbol 变量,所以是 undefined

        // 使用Symbol作为对象属性名
        let keys = {
            name: Symbol(),
            age: Symbol(),
            location: Symbol(),
            test: Symbol()
        }
        let obj3 = {
            [keys.name]: "ich",
            [keys.age]: 100,
            [keys.location]: "cn",
            [keys.test]() {
                console.log("test");
            }
        }
    </script>
</body>

</html>

在这里插入图片描述

10.2 Symbol()函数的参数

问题:都是Symbol,分不清是哪个对象属性

在这里插入图片描述

解决

Symbol()函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述

这主要是为了在控制台显示,比较容易区分

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Symbol()函数的参数</title>
</head>
<body>
    <script>
        let keys = {
            name: Symbol("name"),
            age: Symbol("age"),
            location: Symbol("location"),
            test: Symbol("test")
        }
        let obj = {
            [keys.name]: "ich",
            [keys.age]: 100,
            [keys.location]: "cn",
            [keys.test]() {
                console.log("test");
            }
        }

        console.log(obj);
    </script>
</body>
</html>

在这里插入图片描述

10.3 Symbol 的遍历问题

Symbol 值作为属性名时,不会出现在 for…in 、 for…of 的循环中,也不会被 Object.keys() 、 Object.getOwnPropertyNames() 返回

如果要读取到一个对象的 Symbol 属性,可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Symbol 的遍历问题</title>
</head>

<body>
    <script>
        let keys = {
            name: Symbol("name"),
            age: Symbol("age"),
            location: Symbol("location"),
            test: Symbol("test")
        }
        let obj = {
            [keys.name]: "ich",
            [keys.age]: 100,
            [keys.location]: "cn",
            [keys.test]() {
                console.log("test");
            }
        }

        // 设置对象普通属性
        obj.name = "du";
        obj.age = 20;

        // for in 遍历打印出来的都是普通属性,并没有打印symbol属性
        for (let i in obj) {
            console.log(i);
        }
        // 遍历 symbol 要使用 Object.getOwnPropertySymbols() 方法
        console.log(Object.getOwnPropertySymbols(obj));

        // 普通属性和symbol属性全部遍历
        console.log(Reflect.ownKeys(obj));

        // 每个遍历对象属性和属性对应的值
        Reflect.ownKeys(obj).forEach(item => {
            console.log(item, obj[item]);
        })
    </script>
</body>

</html>

在这里插入图片描述

10.4 Symbol 作为常量

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Symbol作为常量</title>
</head>

<body>
    <script>
        // Symbol 作为常量
        // const VIDEO = 1;
        // const AUDIO = 1;
        // const IMAGE = 1;

        // 不用赋值,固定用变量名来判断
        const VIDEO = Symbol();
        const AUDIO = Symbol();
        const IMAGE = Symbol();

        function play(type) {
            switch (type) {
                case VIDEO:
                    console.log("视频播放");
                    break;
                case AUDIO:
                    console.log("音频播放");
                    break;
                case IMAGE:
                    console.log("图片播放");
                    break;
                default:
                    break;
            }
        }

        // 参数不一样也可以执行
        play(VIDEO);
        // play(1); // 没执行
    </script>
</body>

</html>

10.5 Symbol.for()

Symbol.for()可以重新使用同一个 Symbol 值

Symbol.for() 是 JavaScript 中的内置函数,用于将给定符号搜索到 runtime-wide 符号注册表中,如果找到该符号,则返回相同符号,否则将在全局变量中创建与该符号相同名称的新符号符号注册表并返回它们

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Symbol.for</title>
</head>

<body>
    <script>
        var obj = {
            [Symbol.for("name")]: "kerwin",
            [Symbol.for("age")]: 100
        }

        console.log(obj[Symbol.for("name")]);
    </script>
</body>

</html>

11. Iterator迭代器

  • Iterator 的作用有三个:
    • 为各种数据结构,提供一个统一的、简便的访问接口;
    • 使得数据结构的成员能够按某种次序排列;
    • ES6 创造了一种新的遍历命令 for…of 循环,Iterator 接口主要供for…of 循环

Iterator 的遍历过程是这样的

  1. 创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象
  2. 第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员
  3. 第二次调用指针对象的next方法,指针就指向数据结构的第二个成员
  4. 不断调用指针对象的next方法,直到它指向数据结构的结束位置
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>介绍迭代器</title>
</head>

<body>
    <script>
        let arr = ["aaa", "bbb", "ccc"];
        console.log(arr);

        // 获得的是数组元素的索引值
        for (let i in arr) {
            console.log(i);
        }

        // 获得的是数组元素的内容
        for (let i of arr) {
            console.log(i);
        }

        let iter = arr[Symbol.iterator]();
        // 返回的是遍历器对象/迭代器对象
        console.log(iter);

        console.log(iter.next()); // Object { value: "aaa", done: false }
        console.log(iter.next()); // Object { value: "bbb", done: false }
        console.log(iter.next()); // Object { value: "ccc", done: false }
        console.log(iter.next()); // Object { value: undefined, done: true } - true表示数组已经没有元素可以遍历
        // Iterator 的遍历过程是这样的。
        // (1)创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象
        // (2)第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员
        // (3)第二次调用指针对象的next方法,指针就指向数据结构的第二个成员
        // (4)不断调用指针对象的next方法,直到它指向数据结构的结束位置
    </script>
</body>

</html>

在这里插入图片描述

ES6 规定,默认的 Iterator 接口部署在数据结构的 Symbol.iterator 属性,或者说,一个数据结构只要具有 Symbol.iterator 属性,就可以认为是“可遍历的”(iterable)。Symbol.iterator 属性本身是一个函数,就是当前数据结构默认的遍历器生成函数。执行这个函数,就会返回一个遍历器

11.1 具备 Iterator 接口的数据结构

原生默认具备 Iterator 接口的数据结构如下

  • Array
  • Set
  • Map
  • String
  • arguments 对象
  • NodeList 对象
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>具备 Iterator 接口的数据结构</title>
</head>

<body>
    <script>
        // 字符串数组
        let str = "ichdu";
        let iter1 = str[Symbol.iterator]();

        console.log(iter1.next());
        console.log(iter1.next());
        console.log(iter1.next());

        // arguments 对象
        function test() {
            for (let i of arguments) {
                console.log(i);
            }
        }
        test(1, 2, 3, 4);
    </script>
</body>

</html>

11.2 如何对于对象进行for fo遍历?

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>对象遍历</title>
</head>

<body>
    <script>
        // 对象 非线性
        // let obj = {
        //     0: "ich",
        //     1: "du",
        //     2: "ichdu"
        // }

        // for (let i of obj) {
        //     console.log(i);
        //     // Uncaught TypeError: obj is not iterable
        //     // 报错,不是一个可以遍历的结构
        // }

        let obj = {
            0: "ich",
            1: "du",
            2: "ichdu",
            // 数组是有长度的,不然不知道结束
            length: 3,
            // 将数组的原型赋值给 对象的 [Symbol.iterator]
            [Symbol.iterator]: Array.prototype[Symbol.iterator]
        }

        // 因为加了迭代器,对象可遍历
        for (let i of obj) {
            console.log(i);
        }

        // 应用:在对象中获取遍历 list 属性
        let obj2 = {
            code: 200,
            name: "obj2",
            list: ["ich", "du", "ichdu"],

            // 迭代器
            [Symbol.iterator]() {
                // 设置一个获得 list 索引的参数
                let index = 0;
                // 返回
                return {
                    // 设置箭头函数是为了 this 指向 obj2
                    next: () => {
                        return {
                            // 获得对象属性 list 的值 
                            value: this.list[index++],
                            // 判断是否超过 list 长度,超过返回 true,否则返回 false 可以继续执行遍历
                            // 因为 index 在上面做了加加自增操作,所以
                            done: index === (this.list.length + 1) ? true : false
                        }
                    }
                }
            }
        }

        let iter = obj2[Symbol.iterator]();
        console.log(iter);
        console.log(iter.next());
        console.log(iter.next());
        console.log(iter.next());

        // 给对象加了迭代器,obj2 对象可遍历
        for (let i of obj2) {
            console.log(i);
        }
    </script>
</body>

</html>

在这里插入图片描述

12. Set 结构

它类似于数组,但成员的值都是唯一的,没有重复的值

12.1 初识Set

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>set 结构</title>
</head>

<body>
    <script>
        let s1 = new Set([1, 2, 3, 4, 2, 2, 3, 3, 3, 3, 3]);

        console.log(s1);

        // 满足 iterator 
        // 可以使用 ... 转换成数组
        console.log([...s1]);

        // Array.from 也可以转换数组
        console.log(Array.from(s1));

        // 初始化 set 结构的空数组,然后使用 add 函数添加元素
        let s2 = new Set();
        s2.add(1);
        s2.add(2);
        s2.add(2);
        s2.add(3);
        console.log(s2);

        // 遍历 set 结构数组
        for (let i of s1) {
            console.log(i);
        }
    </script>
</body>

</html>

打印 set 结构,发现不是数组,而是 Set 对象是值的集合,但是有迭代器,可以转换成数组

在这里插入图片描述

12.2 实例的属性和方法

  • size:返回Set实例的成员总数
  • Set.prototype.add(value):添加某个value
  • Set.prototype.delete(value):删除某个value,返回一个布尔值,表示删除是否成功。
  • Set.prototype.has(value):返回一个布尔值,表示该值是否为Set的成员
  • Set.prototype.clear():清除所有成员,没有返回值
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>实例的属性和方法</title>
</head>

<body>
    <script>
        let s1 = new Set([1, 2, 3, 4]);
        // 实例的属性和方法
        // size:返回Set实例的成员总数
        console.log(s1.size);

        // add
        // Set.prototype.add(value):添加某个value
        s1.add(5);
        s1.add(6).add(7);
        console.log(s1); // Set(7) [ 1, 2, 3, 4, 5, 6, 7 ]

        // has
        // Set.prototype.has(value):返回一个布尔值,表示该值是否为`Set`的成员
        console.log(s1.has(8)); // false
        console.log(s1.has(5)); // true

        // delete
        // Set.prototype.delete(value):删除某个value,返回一个布尔值,表示删除是否成功
        s1.delete(5);
        console.log(s1.has(5)); // false

        // clear
        // Set.prototype.clear():清除所有成员,没有返回值
        s1.clear();
        console.log(s1); // Set []
    </script>
</body>

</html>

12.3 Set 遍历

  • Set.prototype.keys():返回键名的遍历器
  • Set.prototype.values():返回键值的遍历器
  • Set.prototype.entries():返回键值对的遍历器
  • Set.prototype.forEach():遍历每个成员
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Set结构遍历</title>
</head>

<body>
    <script>
        let s1 = new Set([1, 2, 3]);

        // 遍历
        console.log("for of 普通遍历");
        for (let i of s1) {
            console.log(i);
        }

        console.log("== Set.prototype.keys():返回键名的遍历器 ==");
        for (let i of s1.keys()) {
            console.log(i);
        }

        console.log("== Set.prototype.values():返回键值的遍历器 ==");
        for (let i of s1.values()) {
            console.log(i);
        }

        console.log("== Set.prototype.entries():返回键值对的遍历器 ==");
        for (let i of s1.entries()) {
            console.log(i);
        }

        console.log("== entries 与数组结合 ==");
        let arr = ["aaa", "bbb", "ccc"];
        for (let i of arr.entries()) {
            console.log(i);
        }

        console.log("== 打印 索引值 和 对应的内容 ==");
        for (let [index, item] of arr.entries()) {
            console.log(index, item);
        }

        console.log("== Set.prototype.forEach():遍历每个成员 ==");
        s1.forEach((item, index) => {
            console.log(item, index);
        })
    </script>
</body>

</html>

在这里插入图片描述

12.4 复杂数据结构去重

定义函数,设置传入的数组的参数

定义 Set 结构的数组,将传入的数组的元素逐个转换成字符串,

再进行 Set 的 has 方法对各个字符串进行判断是否相同,

相同则不进行 add 添加元素

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>复杂数据结构去重</title>
</head>

<body>
    <script>
        let arr = [1, 2, 2, "ich", "ich", "du",
            [1, 2], [3, 4], [1, 2],
            { name: "ich" }, { age: 100 }, { name: "ich" }];

        console.log(arr);

        function uni(arr) {
            let res = new Set();
            return arr.filter((item) => {
                // 判断是否有相同的内容 has true false
                // 没有就 return true

                // JSON.stringify()的作用是将 JavaScript 对象转换为 JSON 字符串
                let id = JSON.stringify(item);

                if (res.has(id)) {
                    return false;
                } else {
                    res.add(id);
                    return true;
                }
            })
        }

        console.log(uni(arr));
    </script>
</body>

</html>

在这里插入图片描述

13. Map 结构

类似于对象,也是键值对的集合,但是 “键” 的范围不限于字符串,各种类型的值(包括对象)都可以当作键

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Map 结构</title>
</head>

<body>
    <script>
        let m1 = new Map([
            ["name", "ich"],
            ["age", 100],
            [{ a: 1 }, "广东"]
        ])
        console.log(m1);

        // 定义空 Map
        let m2 = new Map();
        m2.set("name", "ich");
        m2.set("age", 100);
        m2.set({ a: 1 }, "广东");
        console.log(m2);

        // 遍历
        for (let i of m2) {
            console.log(i);
        }

        // 将 Map 结构转换成数组
        console.log([...m2]);
    </script>
</body>

</html>

在这里插入图片描述

在这里插入图片描述

13.1 实例的属性和方法

  • size:返回 Map 结构的成员总数
  • Map.prototype.set(key,value):添加key对应得value,返回 Map 结构本身
  • Map.prototype.get(key):获取key对应的value
  • Map.prototype.delete(key):删除某个键(键名+键值)
  • Map.prototype.has(key):某个键是否在当前 Map 对象之中
  • Map.prototype.clear():清除所有成员,没有返回值
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>实例的属性和方法</title>
</head>

<body>
    <script>
        let m2 = new Map();

        // Map.prototype.set(key,value):添加key对应得value,返回 Map 结构本身
        m2.set("name", "ich");
        m2.set("age", 100);

        // 用 get 获得相应的内容
        // Map.prototype.get(key):获取key对应的value

        // m2.set({ a: 1 }, "广东");
        // 这样获取不到对象,获取的时候会判断不相等
        let o = { a: 1 };
        m2.set(o, "广东");

        console.log(m2.get(o));
        console.log(m2.get("name"));

        // Map.prototype.has(key):某个键是否在当前 Map 对象之中
        console.log(m2.has("age")); // true

        // Map.prototype.delete(key):删除某个键(键名+键值)
        m2.delete("age");
        console.log(m2.has("age")); // false

        // size:返回 Map 结构的成员总数
        console.log(m2.size); // 2

        // Map.prototype.clear():清除所有成员,没有返回值
        m2.clear();

        console.log(m2); // Map(0) {size: 0}
    </script>
</body>

</html>

13.2 遍历

  • Map.prototype.keys():返回键名的遍历器
  • Map.prototype.values():返回键值的遍历器
  • Map.prototype.entries():返回所有成员的遍历器
  • Map.prototype.forEach():遍历 Map 的所有成员
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Map 遍历</title>
</head>

<body>
    <script>
        let m2 = new Map();
        m2.set("name", "ich");
        m2.set("age", 100);
        let o = { a: 1 };
        m2.set(o, "广东");

        // keys()
        console.log("== Map.prototype.keys():返回键名的遍历器 ==");
        for (let i of m2.keys()) {
            console.log(i);
        }

        // values()
        console.log("== Map.prototype.values():返回键值的遍历器 ==");
        for (let i of m2.values()) {
            console.log(i);
        }

        // entries()
        console.log("== Map.prototype.entries():返回所有成员的遍历器 ==");
        for (let [index, item] of m2.entries()) {
            console.log(index, item);
        }
        // 和上一个一样的,因为迭代器都是相同的
        for (let [index, item] of m2) {
            console.log(index, item);
        }

        // forEach()
        console.log("== Map.prototype.forEach():遍历 Map 的所有成员 ==");
        m2.forEach((item, index) => {
            console.log(item, index);
        })
    </script>
</body>

</html>

在这里插入图片描述

GitHub代码
gitee代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/561741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试真题 Java 实现【寻找相似单词】【2023Q2 200分】

一、题目描述 给定一个可存储若干单词的字典&#xff0c;找出指定单词的所有相似单词&#xff0c;并且按照单词名称从小到大排序输出。 单词仅包括字母&#xff0c;但可能大小写并存&#xff08;大写不一定只出现在首字母&#xff09;。 相似单词说明&#xff1a; 给定一个…

TCP是面向字节流的协议

TCP字节流 之所以会说 TCP 是面向字节流的协议&#xff0c;UDP 是面向报文的协议&#xff0c;是因为操作系统对 TCP 和 UDP 协议的发送方的机制不同&#xff0c;也就是问题原因在发送方。 为什么 UDP 是面向报文的协议&#xff1f; 当用户消息通过 UDP 协议传输时&#xff0c;…

从C语言到C++_12(string相关OJ题)

上一篇已经讲了string类的接口函数&#xff0c;然后根据查文档刷了一道力扣415字符串相加&#xff0c; 这篇继续跟着查文档来刷力扣题&#xff0c;体会C刷题的方便。 目录 917. 仅仅反转字母 - 力扣&#xff08;LeetCode&#xff09; 代码解析&#xff1a; 387. 字符串中的…

SSRS rdlc报表 一 创建报表

环境 vs2019 fromwork4.5 第一步 安装rdlc报表插件 vs2019使用rdlc&#xff0c;需要安装扩展插件&#xff0c;扩展→扩展管理→联机&#xff0c;搜索rdlc&#xff0c;安装Microsoft RDLC Report Designer&#xff0c;我在安装过程中&#xff0c;安装了很久都没安装成功&…

构建高可用性的核心服务层:Coupang电子商务应用程序的技术实践

随着Coupang电子商务平台用户数量的快速增长&#xff0c;构建一个高可用性的核心服务层成为了关键任务。本文将介绍Coupang如何通过统一的NoSQL数据存储、缓存层和实时数据流等技术和策略&#xff0c;构建一个高可用性的核心服务层&#xff0c;以满足日益增长的数据流量需求&am…

保姆式教学--教室友从买服务器到怎么搭建内网隧道

本文转载于&#xff1a;https://blog.csdn.net/qq_39739740/article/details/127604642 一、购买云服务器 怎么购买&#xff1f; 三个主流厂商&#xff1a;华为云、腾讯云、阿里云 --------拿阿里云举例。 首先第一步、我们要百度搜索 阿里云→进入官网→选择最便宜的服务器&…

python+django音乐推荐网站vue

为此开发了本音乐推介网站 &#xff0c;为用户提供一个基于音乐推介网站&#xff0c;同时方便管理员&#xff1b;首页、个人中心、用户管理&#xff0c;类型信息管理、乐器类型管理、歌曲信息管理、戏曲信息管理、MV专区管理、付费音乐管理、订单信息管理、音乐文件管理、论坛管…

JavaSE基础(七)—— 常用API(String、 ArrayList)

1.API 1.1API概述 什么是API ​ API (Application Programming Interface) &#xff1a;应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层的实现封装了起来&#xff0c;我们不需要关心这些类是如何实现的&#xff0c;只需…

阿里云/dev/vda1磁盘空间占满的解决过程

1.查看文件系统系统的占有量 使用df -h查看了下 2.查看本目录占据多少磁盘空间 du -sh 3.在cd /目录下 du -sh查看各个目录占据多少空间 d 然后使用 du -sh *查看具体文件差距多少空间逐一排查最后把占据大的文件删除掉即可.

Elasticsearch:使用字节大小的向量节省空间 - 8.6

作者&#xff1a;Jack Conradson, Benjamin Trent Elasticsearch 在 8.6 中引入了一种新型向量&#xff01; 该向量具有 8 位整数维度&#xff0c;其中每个维度的范围为 [-128, 127]。 这比具有 32 位浮点维度的当前向量小 4 倍&#xff0c;这可以节省大量空间。 你现在可以通…

【哈士奇赠书活动 - 24期】-〖前端工程化:基于Vue.js 3.0的设计与实践〗

文章目录 ⭐️ 赠书 - 《前端工程化&#xff1a;基于Vue.js 3.0的设计与实践》⭐️ 内容简介⭐️ 作者简介⭐️ 精彩书评⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - 《前端工程化&#xff1a;基于Vue.js 3.0的设计与实践》 ⭐️ 内容简介 本书以Vue.js的3.0版本为核心技术栈&#…

Python自动化办公对每个子文件夹的Excel表加个表头(Excel不同名)(下篇)

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 昭阳殿里恩爱绝&#xff0c;蓬莱宫中日月长。 大家好&#xff0c;我是皮皮。 一、前言 上一篇文章&#xff0c;我们抛出了一个问题&#xff0c;这篇文章…

发挥CWPP在零售行业安全关键价值

新钛云服已累计为您分享747篇技术干货 CWPP产品对于零售行业安全有关键价值&#xff0c;可以极大提升零售行业安全水平&#xff0c;是零售行业必备的安全产品。 零售行业的特点 零售行业的特点是实时在线、数据有独特价值&#xff0c;安全挑战是缺乏安全投入和人员。 实时在线方…

推荐 5 月份炫炫炫的 GitHub 项目

推荐 6 个五月份比较火的开源项目。因为近期 AI 项目的火爆&#xff0c;每天 GitHub 热榜都被 AI 项目占据&#xff0c;后续开源项目会同时盘点 AI 和其他分类的开源项目。 本期推荐开源项目目录&#xff1a; 1. 多合一聊天机器人客户端&#xff08;AI&#xff09; 2. 数据库场…

蓝库云|生产报工系统对制造业的作用,能给企业带来的质的飞跃

生产报工系统&#xff0c;对于做制造业的企业来说是再熟悉不过的软件系统了&#xff0c;不仅可以令制造企业可以快速响应客户需求&#xff0c;根据客户订购要求进行生产计划管理&#xff0c;还能生产报工可以帮助制造企业提升生产效率、提高产品质量、改善生产计划和提高客户满…

企业级应用如何用 Apache DolphinScheduler 有针对性地进行告警插件开发?

点击蓝字 关注我们 作者 | 刘宇星 Apache DolphinScheduler的2.0.1版本加入了插件化架构改进&#xff0c;将任务、告警组件、数据源、资源存储、注册中心等都将被设计为扩展点&#xff0c;以此来提高 Apache DolphinScheduler 本身的灵活性和友好性。在企业级应用中不同公司的告…

ChatGPT被广泛应用,潜在的法律风险有哪些?

ChatGPT由OpenAI开发&#xff0c;2022年11月一经面世便引发热烈讨论&#xff0c;用户数持续暴涨。2023年初&#xff0c;微软成功将ChatGPT接入其搜索引擎Bing中&#xff0c;市场影响力迅速提升&#xff0c;几乎同一时间&#xff0c;谷歌宣布其研发的一款类似人工智能应用Bard上…

树莓派 Ubuntu 18.04 连接 WiFi

树莓派 Ubuntu 18.04 连接 WiFi 阿瑞特后视镜那边代码调试需要用到树莓派&#xff0c;但是实验室 TP-LINK-DD48 用不了 所以要更改原先的 WiFi 连接信息 树莓派raspberry Pi 4B安装Ubuntu 20.04 LTS系统后如何连接WiFi 树莓派4B(ubuntu)设置wifi的方法 树莓派4B安装Ubuntu Se…

函数式接口入门简介(存在疑问,求解答)

这里写目录标题 引子四种函数式接口-简单Demo四种函数式接口介绍函数式接口实战-代码对比关于Consumer赋值问题&#xff08;疑问&#xff0c;求解答&#xff09; 引子 只包含一个抽象方法的接口&#xff0c;就称为函数式接口。来源&#xff1a;java.util.function 我想在方法…

【JS】1691- 重学 JavaScript API - Performance API

❝ 前期回顾&#xff1a; 1. Page Visibility API 2. Broadcast Channel API 3. Beacon API 4. Resize Observer API 5. Clipboard API 6. Fetch API ❞ &#x1f3dd; 1. 什么是 Performance API 1.1 概念介绍 Performance API 提供了「访问和测量浏览器性能相关信息」的方法。…