前端学习之ES6+

1.ES6是什么

ES6,全称是ECMAScript 6,是JavaScript语言的下一代标准,由ECMA国际组织在2015年6月正式发布。ES6也被称作ECMAScript 2015,从这个版本开始,ECMA组织决定每年发布一个新的ECMAScript版本,以使JavaScript语言能够持续发展和进化。

ES6引入了许多新特性,这些特性旨在提高JavaScript语言的编程效率、代码的可读性和可维护性。以下是一些ES6中的重要特性:

  1. 箭头函数(Arrow functions):提供了一种更简洁的函数书写方式。

    const sum = (a, b) => a + b;
    
  2. (Classes):引入了类的概念,尽管JavaScript仍然是基于原型的,但类的语法更接近传统的面向对象语言。

    class Animal {
      constructor(name) {
        this.name = name;
      }
      speak() {
        console.log(`${this.name} makes a noise.`);
      }
    }
    
  3. 模块化(Modules):通过importexport关键字,支持模块的导入和导出,使得代码组织更加清晰。

    // 导出
    export const myFunction = () => {};
    // 导入
    import { myFunction } from './myModule';
    
  4. 模板字符串(Template literals):允许使用反引号(`)创建字符串,并提供字符串插值功能。

    const message = `Hello, ${name}!`;
    
  5. 解构赋值(Destructuring assignment):允许从数组或对象中提取数据,并赋值给变量。

    const [a, b] = [1, 2];
    const { x, y } = { x: 1, y: 2 };
    
  6. let和const:引入了letconst关键字用于声明变量,解决了var的一些问题,如变量提升和作用域问题。

  7. Promise:用于更优雅地处理异步操作,替代了传统的回调函数模式。

  8. 默认参数(Default parameters):允许在函数定义时为参数设置默认值。

  9. 展开运算符(Spread operator):允许在函数调用或数组字面量中展开数组或对象。

  10. Set和Map:引入了新的数据结构Set和Map,提供了更丰富的集合操作。

ES6的这些新特性极大地推动了JavaScript的发展,使得这门语言更适合大型应用的开发,并且更加现代化和高效。随着现代浏览器的支持,ES6已经成为现代前端开发的标配。

ES与JavaScript的关系

2.let和const的简介

在JavaScript中,let、var 和 const 都是用来声明变量的关键字,但它们之间有几个关键的区别:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>let、const 与 var 的区别</title>
  </head>
  <body>
    <script>
      // 1.重复声明
      // 已经存在的变量或常量,又声明了一遍
      // var 允许重复声明,let、const 不允许
      // let a = 1;
      // // ...
      // let a = 2;
      // console.log(a);

      // function func(a) {
      //   let a = 1;
      // }
      // func();

      // 2.变量提升
      // var 会提升变量的声明到当前作用域的顶部
      // console.log(a);

      // console.log(a);
      // var a = 1;

      // 相当于
      // var a;
      // console.log(a);
      // a = 1;
      // console.log(a);

      // let、const 不存在变量提升
      // console.log(a);
      // let a = 1;

      // 养成良好的编程习惯,对于所有的变量或常量,做到先声明,后使用

      // 3.暂时性死区
      // 只要作用域内存在 let、const,它们所声明的变量或常量就自动“绑定”这个区域,不再受到外部作用域的影响
      // let、const 存在暂时性死区
      // let a = 2;
      // let b = 1;
      // function func() {
      //   console.log(b);
      //   // console.log(a);
      //   // let a = 1;
      // }
      // func();

      // 养成良好的编程习惯,对于所有的变量或常量,做到先声明,后使用

      // 4.window 对象的属性和方法
      // 全局作用域中,var 声明的变量,通过 function 声明的函数,会自动变成 window 对象的属性或方法
      // let、const 不会

      // var/function
      // var age = 18;
      // function add() {}
      // console.log(window.age);
      // console.log(window.add === add);

      // let/const
      // let age = 18;
      // const add = function () {};
      // console.log(window.age);
      // console.log(window.add === add);

      // 5.块级作用域
    </script>
  </body>
</html>
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>let、const 与 var 的区别</title>
  </head>
  <body>
    <script>
      // 块级作用域
      // 1.什么是块级作用域
      // var 没有块级作用域
      // for (var i = 0; i < 3; i++) {
      //   // console.log(i);
      // }
      // console.log(i);

      // let/const 有块级作用域
      // for (let i = 0; i < 3; i++) {
      //   // i = i+1
      //   // console.log(i);
      // }
      // console.log(i);

      // 2.作用域链
      // function func() {
      //   for (let i = 0; i < 3; i++) {
      //     // console.log(i);
      //   }
      // }
      // func();
      // console.log(i);
      // 作用域链:内层作用域->外层作用域->...->全局作用域

      // 3.有哪些块级作用域
      // {}
      // {
      //   let age = 18;
      //   // console.log(age);
      // }
      // console.log(age);

      // {}
      // for(){}
      // while(){}
      // do{}while()
      // if(){}
      // switch(){}

      // function(){}
      // const person = {
      //   getAge: function () {}
      // };
    </script>
  </body>
</html>

 1.作用域(Scope):
        var 声明的变量拥有函数作用域(function scope),这意味着如果 var 变量在函数外部声明,它将是一个全局变量;如果在函数内部声明,它只能在那个函数内部被访问。
        let 和 const 声明的变量拥有块作用域(block scope),这意味着它们的作用域限定在它们被声明的块(如一个花括号 {} 内部的区域)中。

2.变量提升(Hoisting):
        var 声明的变量会被提升到其作用域的顶部,但在初始化之前不能使用,访问未初始化的变量会得到 undefined。
        let 和 const 也会被提升,但是它们不允许在声明之前被访问,如果尝试这样做将会导致一个引用错误(ReferenceError)。

3.重复声明(Re-declaration):
        在同一个作用域内,var 允许重复声明同一个变量。
        let 和 const 不允许在同一个作用域内重复声明同一个变量。

4.重新赋值(Re-assignment):
        使用 var 和 let 声明的变量可以被重新赋值。
        使用 const 声明的变量必须在声明时初始化,并且一旦被赋值,其引用就不能再被改变。需要注意的是,const 保证的是变量引用的不可变性,而不是变量的值不可变。例如,如果 const 变量引用的是一个对象,那么对象的属性是可以被修改的。

5.window 对象的属性和方法
全局作用域中,var 声明的变量,通过 function 声明的函数,会自动变成 window 对象的属性或方法。let、const 不会

// 2.2.const 声明的常量,允许在不重新赋值的情况下修改它的值

// 基本数据类型

// const sex = 'male';

// sex = 'female'; //会报错

// 引用数据类型

// const person = { username: 'Alex' };

// // person = {};

// person.username = 'ZhangSan'; //通过.直接修改值,而不是复制操作,是可以的。

// console.log(person);

不知道用什么的时候先用const,也就是说不确定需求的时候用const,因为如果需要修改会报错,方便查找。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>const</title>
  </head>
  <body>
    <script>
      // 1.为什么需要 const
      // let
      // let sex = 'male';
      // // ...
      // sex = 'female';
      // console.log(sex);

      // const
      // const sex = 'male';
      // // ...
      // sex = 'female';
      // console.log(sex);

      // const 就是为了那些一旦初始化就不希望重新赋值的情况设计的

      // 2.const 的注意事项
      // 2.1.使用 const 声明常量,一旦声明,就必须立即初始化,不能留到以后赋值
      // const sex;
      // sex='male'

      // const sex = 'male';

      // 2.2.const 声明的常量,允许在不重新赋值的情况下修改它的值
      // 基本数据类型
      // const sex = 'male';
      // sex = 'female';

      // 引用数据类型
      // const person = { username: 'Alex' };
      // // person = {};
      // person.username = 'ZhangSan';
      // console.log(person);

      // 3.什么时候用 const,什么时候用 let
      // var
      // for (let i = 0; i < 3; i++) {}
      // const username = 'Alex';
      // // ...
      // username = 'ZhangSan';
    </script>
  </body>
</html>

以下是这些关键字的简单比较:

    var 是ES5及之前版本中的标准声明方式,现在一般不推荐使用,因为它的作用域和提升行为可能会导致代码中的意外行为。
    let 是ES6(ECMAScript 2015)中引入的,用于声明块作用域的变量,通常在需要重新赋值的情况下使用。
    const 也是ES6中引入的,用于声明块作用域的常量,当你不希望变量的引用改变时使用。

总结来说,现代JavaScript编程中推荐尽可能使用 const,只在变量需要被重新赋值时使用 let。这样做可以提高代码的可读性和可维护性。

3.模版字符串

(1)是什么

模板字符串(Template Literals)是ES6(ECMAScript 2015)中引入的一种新的字符串表示法,它允许开发者以更简单、更直观的方式创建和维护字符串。模板字符串使用反引号(`)而不是单引号(')或双引号(")来定义字符串。

以下是模板字符串的一些主要特点和用法:

  1. 多行字符串:模板字符串可以跨越多行,不需要使用反斜杠(\)来换行。

    const multiLineString = `This is a string
    that spans multiple lines.`;
    
  2. 字符串插值:可以在模板字符串中嵌入变量和表达式,这些变量和表达式会被解析并转换为字符串的一部分。插入变量或表达式时,需要使用${expression}的语法。

    const name = 'Alice';
    const age = 30;
    const greeting = `Hello, my name is ${name} and I am${age} years old.`;
    
  3. 标签模板(Tagged Templates):模板字符串可以与一个函数一起使用,这种用法称为标签模板。函数的第一个参数是一个字符串数组,其余的参数对应于模板字符串中的插值表达式。

    function myTag(strings, ...values) {
      // strings 是一个包含模板字符串中静态部分的数组
      // values 是一个包含模板字符串中动态部分(即插值表达式)的数组
      return strings.reduce((acc, str, i) => {
        return acc + str + (values[i] || '');
      }, '');
    }
    
    const result = myTag`Hello ${name}, how are you?`;
    
  4. 原始字符串:模板字符串可以创建原始字符串,即字符串中的转义序列不会被特殊处理。这可以通过在模板字符串前加上String.raw来实现。

    const rawString = String.raw`This is a raw string: \n and \t are not special characters.`;
    

模板字符串因其灵活性和易读性,在现代JavaScript开发中被广泛使用。它们提供了一种简洁的方式来构建包含变量和表达式的大型字符串,而无需使用字符串连接或格式化函数。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>模板字符串是什么</title>
  </head>
  <body>
    <script>
      // 1.认识模板字符串
      // const username1 = 'alex';
      // // "alex"

      // const username2 = `alex`;
      // console.log(username1, username2, username1 === username2);

      // 2.模板字符串与一般字符串的区别
      const person = {
        username: 'Alex',
        age: 18,
        sex: 'male'
      };

      // const info =
      //   '我的名字是:' +
      //   person.username +
      //   ', 性别:' +
      //   person.sex +
      //   ', 今年' +
      //   person.age +
      //   '岁了';
      // console.log(info);

      // const info = `我的名字是:${person.username}, 性别:${person.sex}, 今年${person.age}岁了`;
      // console.log(info);

      // 和其他东西一起使用的时候,使用模板字符串,方便注入
      // 其他情况下使用模板字符串或一般字符串都行
    </script>
  </body>
</html>

 (2)模版字符串的注意事项

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>模板字符串的注意事项</title>
  </head>
  <body>
    <script>
      // 1.输出多行字符串
      // 一般字符串
      // const info = '第1行\n第2行';
      // console.log(info);

      // 模板字符串
      // const info = `第1行\n第2行`;
      //       const info = `第1行
      // 第2行`;
      //       console.log(info);

      // 模板字符串中,所有的空格、换行或缩进都会被保留在输出之中

      // 2.输出 ` 和 \ 等特殊字符
      // const info = `'\`\\`;
      // console.log(info);

      // 3.模板字符串的注入
      // ${}
      // const username = 'alex';
      // const person = { age: 18, sex: 'male' };
      // const getSex = function (sex) {
      //   return sex === 'male' ? '男' : '女';
      // };

      // const info = `${username}, ${person.age + 2}, ${getSex(person.sex)}`;
      // console.log(info);

      // 只要最终可以得出一个值的就可以通过 ${} 注入到模板字符串中
    </script>
  </body>
</html>

(3) 应用

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>模板字符串的应用</title>
    <style>
      body {
        padding: 50px 0 0 300px;
        font-size: 22px;
      }

      ul {
        padding: 0;
      }

      p {
        margin-bottom: 10px;
      }
    </style>
  </head>
  <body>
    <p>学生信息表</p>
    <ul id="list">
      <li style="list-style: none;">信息加载中……</li>
    </ul>

    <script>
      // 数据
      const students = [
        {
          username: 'Alex',
          age: 18,
          sex: 'male'
        },
        {
          username: 'ZhangSan',
          age: 28,
          sex: 'male'
        },
        {
          username: 'LiSi',
          age: 20,
          sex: 'female'
        }
      ];

      const list = document.getElementById('list');

      let html = '';

      for (let i = 0; i < students.length; i++) {
        html += `<li>我的名字是:${students[i].username},${students[i].sex},${students[i].age}</li>`;
      }

      // console.log(html);
      list.innerHTML = html;
    </script>
  </body>
</html>

4.箭头函数

(1)是什么

<script>
      // 1.认识箭头函数
      // const add = (x, y) => {
      //   return x + y;
      // };
      // console.log(add(1, 1));

      // 2.箭头函数的结构
      // const/let 函数名 = 参数 => 函数体

      // 3.如何将一般函数改写成箭头函数
      // 声明形式
      // function add() {}

      // 声明形式->函数表达式形式
      // const add = function () {};

      // 函数表达式形式->箭头函数
      const add = () => {};
    </script>

(2)注意事项

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>箭头函数的注意事项</title>
  </head>
  <body>
    <script>
      // 1.单个参数
      // 单个参数可以省略圆括号
      // const add = x => {
      //   return x + 1;
      // };
      // console.log(add(1));

      // 无参数或多个参数不能省略圆括号
      // const add = () => {
      //   return 1 + 1;
      // };
      // const add = (x, y) => {
      //   return x + y;
      // };
      // console.log(add(1, 1));

      // 2.单行函数体
      // 单行函数体可以同时省略 {} 和 return
      // const add = (x, y) => {
      //   return x + y;
      // };
      // const add = (x, y) => x + y;
      // console.log(add(1, 1));

      // 多行函数体不能再化简了
      // const add = (x, y) => {
      //   const sum = x + y;
      //   return sum;
      // };

      // 3.单行对象
      // const add = (x, y) => {
      //   return {
      //     value: x + y
      //   };
      // };
      // const add = (x, y) => ({
      //   value: x + y
      // });

      // 如果箭头函数返回单行对象,可以在 {} 外面加上 (),让浏览器不再认为那是函数体的花括号

      // const add = (x, y) => [x, y];

      // console.log(add(1, 1));
    </script>
  </body>
</html>

(3)非箭头函数中this指向

在JavaScript中,this关键字的行为取决于函数的调用方式。在非箭头函数(即传统的函数表达式或函数声明)中,this的指向通常不是在函数定义时确定的,而是在函数被调用时确定的。以下是几种常见的函数调用场景及其对应的this指向:

  1. 作为对象的方法调用: 当一个函数作为对象的方法被调用时,this指向该对象。

    const obj = {
      method: function() {
        return this; // 这里的this指向obj对象
      }
    };
    obj.method(); // 返回obj对象
    
  2. 独立函数调用: 当函数不是作为对象的方法调用时(即独立调用),在非严格模式下,this指向全局对象(在浏览器中通常是window对象),而在严格模式下,thisundefined

    function func() {
      return this; // 非严格模式:指向全局对象,严格模式:undefined
    }
    func(); // 非严格模式返回全局对象,严格模式抛出TypeError
    
  3. 构造函数调用: 当使用new关键字调用一个函数时,this指向新创建的对象。

    function Constructor() {
      this.prop = 'value'; // 这里的this指向新创建的对象
    }
    const instance = new Constructor();
    instance.prop; // 'value'
    
  4. 使用callapplybind方法调用: Function.prototype.callFunction.prototype.applyFunction.prototype.bind方法可以显式地设置函数调用时this的值。

    function func() {
      return this;
    }
    const context = { value: 'custom context' };
    func.call(context); // 返回{ value: 'custom context' }
    func.apply(context); // 同上
    const boundFunc = func.bind(context);
    boundFunc(); // 同上
    
  5. 作为DOM事件处理函数: 当函数作为DOM事件处理程序被调用时,this通常指向触发事件的元素。

    document.getElementById('button').addEventListener('click', function() {
      console.log(this); // 指向button元素
    });
    

理解this的工作原理对于编写JavaScript代码至关重要,因为它经常会导致混淆和错误。记住,this的值是在函数被调用时确定的,而不是在函数定义时。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>非箭头函数中的 this 指向</title>
  </head>
  <body>
    <script>
      // 1.全局作用域中的 this 指向
      // console.log(this); // window

      // 2.一般函数(非箭头函数)中的 this 指向
      // 'use strict';
      function add() {
        console.log(this);
      }

      // 严格模式就指向 undefined
      // add(); // undefined->window(非严格模式下)

      // window.add();

      // const calc = {
      //   add: add
      // };
      // // calc.add(); // calc
      // const adder = calc.add;
      // adder(); // undefined->window(非严格模式下)

      // document.onclick = function () {
      //   console.log(this);
      // };
      // document.onclick();

      // function Person(username) {
      //   this.username = username;
      //   console.log(this);
      // }

      // const p = new Person('Alex');

      // 只有在函数调用的时候 this 指向才确定,不调用的时候,不知道指向谁
      // this 指向和函数在哪儿调用没关系,只和谁在调用有关
      // 没有具体调用对象的话,this 指向 undefined,在非严格模式下,转向 window
    </script>
  </body>
</html>

(4)箭头函数中this指向

箭头函数(Arrow Functions)在JavaScript中的this绑定规则与传统的函数表达式或函数声明不同。箭头函数不绑定自己的this,而是继承其所在上下文的this值。这意味着箭头函数中的this值由其外围最近一层非箭头函数决定。

以下是箭头函数中this指向的一些关键点:

  1. 继承上下文的this: 箭头函数不定义自己的this值,它会捕获其所在上下文的this值,即定义时的词法作用域中的this

    const obj = {
      method: function() {
        setTimeout(() => {
          console.log(this); // 这里的this指向obj对象
        }, 1000);
      }
    };
    obj.method(); // 打印obj对象
    
  2. this不会随调用方式改变: 由于箭头函数不绑定自己的this,所以即使使用callapplybind方法,也无法改变箭头函数中的this值。

    const arrowFunc = () => this;
    const context = { value: 'custom context' };
    arrowFunc.call(context); // 这里的this不会改变,仍然指向定义时的上下文
    
  3. 没有自己的arguments对象: 箭头函数没有自己的arguments对象,但是可以访问外围函数的arguments对象。

    const arrowFunc = () => arguments[0];
    function outerFunc() {
      return arrowFunc(5); // 这里的arguments是outerFunc的
    }
    outerFunc(10); // 返回10,因为箭头函数使用的是outerFunc的arguments
    
  4. 不能用作构造函数: 由于箭头函数没有自己的this,因此它们不能用作构造函数,尝试使用new关键字会抛出错误。

    const ArrowFunc = () => {};
    const instance = new ArrowFunc(); // 抛出TypeError
    
  5. 没有prototype属性: 箭头函数没有prototype属性,因此也不能使用new.target来检测函数是否被用作构造函数。

理解箭头函数的this绑定规则对于避免常见的JavaScript错误非常有帮助,尤其是在处理异步代码和回调函数时。由于箭头函数的this值是固定的,它们在处理事件处理器和定时器时特别有用,因为这些情况下传统函数的this值可能会意外地改变。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>箭头函数中的 this 指向</title>
  </head>
  <body>
    <script>
      // 1.箭头函数中的 this 指向
      // 箭头函数没有自己的 this
      // const calc = {
      //   add: () => {
      //     console.log(this);
      //   }
      // };
      // calc.add(); // window

      // 2.练习
      // 'use strict';
      const calc = {
        add: function () {
          // this
          const adder = () => {
            console.log(this);
          };
          adder();
        }
      };
      // calc.add(); // calc

      const addFn = calc.add;
      addFn(); // undefined->window
    </script>
  </body>
</html>

(5)不适用箭头函数的场景

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>不适用箭头函数的场景</title>
  </head>
  <body>
    <script>
      // 1.作为构造函数
      // 箭头函数没有 this
      // const Person = () => {};
      // new Person();

      // 2.需要 this 指向调用对象的时候
      // document.onclick = function () {
      //   console.log(this);
      // };
      // document.addEventListener(
      //   'click',
      //   () => {
      //     console.log(this); //window
      //   },
      //   false
      // );

      // 3.需要使用 arguments 的时候
      // 箭头函数中没有 arguments
      // function add() {
      //   console.log(arguments);
      // }
      // add(1, 2,3,4,5);

      // const add = () => console.log(arguments);
      // add();
      // 剩余参数
    </script>
  </body>
</html>

(6)箭头函数的应用

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>箭头函数的应用</title>
    <style>
      body {
        padding: 50px 0 0 250px;
        font-size: 30px;
      }

      #btn {
        width: 100px;
        height: 100px;
        margin-right: 20px;
        font-size: 30px;
        cursor: pointer;
      }
    </style>
  </head>
  <body>
    <button id="btn">开始</button>
    <span id="result">0</span>

    <script>
      const btn = document.getElementById('btn');
      const result = document.getElementById('result');

      // const timer = {
      //   time: 0,
      //   start: function () {
      //     // this
      //     var that = this;
      //     // var self = this;
      //     btn.addEventListener(
      //       'click',
      //       function () {
      //         setInterval(function () {
      //           console.log(this);
      //           // this.time++;
      //           // result.innerHTML = this.time;
      //           that.time++;
      //           result.innerHTML = that.time;
      //         }, 1000);
      //       },
      //       false
      //     );
      //   }
      // };

      const timer = {
        time: 0,
        start: function () {
          // this
          btn.addEventListener(
            'click',
            () => {
              // this
              setInterval(() => {
                console.log(this);
                this.time++;
                result.innerHTML = this.time;
              }, 1000);
            },
            false
          );
        }
      };

      timer.start();
    </script>
  </body>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

查缺补漏----用户上网过程(HTTP,DNS与ARP)

&#xff08;1&#xff09;HTTP 来自湖科大计算机网络微课堂&#xff1a; ① HTTP/1.0采用非持续连接方式。在该方式下&#xff0c;每次浏览器要请求一个文件都要与服务器建立TCP连接当收到响应后就立即关闭连接。 每请求一个文档就要有两倍的RTT的开销。若一个网页上有很多引…

【广西】《广西壮族自治区本级政务信息化建设和运维项目预算支出标准》(桂财建〔2023〕102号)-省市费用标准解读系列09

《广西壮族自治区本级政务信息化建设和运维项目预算支出标准》&#xff08;桂财建〔2023〕102号&#xff09;是广西壮族自治区财政厅于2023年9月26日发布的费用标准&#xff08;了解更多可直接关注我们咨询&#xff09;。我司基于专业第三方信息化项目造价机构角度&#xff0c;…

Linux基础-常用操作命令详讲

Linux基础-常用操作命令详讲 一、openssl加密简单介绍 1. 生成加密的密码散列&#xff08;password hash&#xff09;​编辑 1.1 常见的选项总结表 1.2 加密参数详解 2. 自签名证书 3. 证书转换 二、文件管理 1. 创建空文件 ​编辑 2. 删除文件 4. 新建目录 ​编辑…

ALB搭建

ALB: 多级分发、消除单点故障提升应用系统的可用性&#xff08;健康检查&#xff09;。 海量微服务间的高效API通信。 自带DDoS防护&#xff0c;集成Web应用防火墙 配置&#xff1a; 1.创建ECS实例 2.搭建应用 此处安装的LNMP 3.创建应用型负载均衡ALB实例 需要创建服务关联角…

C语言笔记(字符串函数,字符函数,内存函数)

目录 前言 1.字符串函数 1.1.strlen 1.2.strcpy 1.3.strcat 1.4.strcmp 1.5.strncpy 1.6.strncat 1.7.strncmp 1.8.strstr 1.9.strtok 1.10.strerror 2.字符函数 2.1字符分类函数 2.2字符转换函数 3.内存函数 3.1.mencpy 3.2.memmove 3.3.memcmp 前言 本文重…

HCIP-HarmonyOS Application Developer V1.0 笔记(五)

弹窗功能 prompt模块来调用系统弹窗API进行弹窗制作。 当前支持3种弹窗API&#xff0c;分别为&#xff1a; 文本弹窗&#xff0c;prompt.showToast&#xff1b;对话框&#xff0c;prompt.showDialog&#xff1b;操作菜单&#xff0c;prompt.showActionMenu。 要使用弹窗功能&…

Linux相关概念和易错知识点(20)(dentry、分区、挂载)

目录 1.dentry &#xff08;1&#xff09;路径缓存的原因 &#xff08;2&#xff09;dentry的结构 ①多叉树结构 ②file和dentry之间的联系 ③路径概念存在的意义 2.分区 &#xff08;1&#xff09;为什么要确认分区 &#xff08;2&#xff09;挂载 ①进入分区 ②被挂…

Redis 缓存击穿

目录 缓存击穿 什么是缓存击穿&#xff1f; 有哪些解决办法&#xff1f; 缓存穿透和缓存击穿有什么区别&#xff1f; 缓存雪崩 什么是缓存雪崩&#xff1f; 有哪些解决办法&#xff1f; 缓存预热如何实现&#xff1f; 缓存雪崩和缓存击穿有什么区别&#xff1f; 如何保…

电信网关配置管理系统 upload_channels.php 文件上传致RCE漏洞复现

0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远…

澳鹏通过高质量数据支持 Onfido 优化AI反欺诈功能

“Appen 在 Onfido 的发展中发挥了至关重要的作用&#xff0c;并已成为我们运营的重要组成部分。我们很高兴在 Appen 找到了可靠的合作伙伴。” – Onfido 数据和分析总监 Francois Jehl 简介&#xff1a;利用人工智能和机器学习增强欺诈检测 在当今日益数字化的世界&#xff…

网站架构知识之Ansible模块(day021)

1.Ansible模块 作用:通过ansible模块实现批量管理 2.command模块与shell模块 command模块是ansible默认的模块&#xff0c;适用于执行简单的命令&#xff0c;不支持特殊符号 案列01&#xff0c;批量获取主机名 ansible all -m command -a hostname all表示对主机清单所有组…

应对AI与机器学习的安全与授权管理新挑战,CodeMeter不断创新引领保护方案

人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术正在快速发展&#xff0c;逐渐应用到全球各类主流系统、设备及关键应用场景中&#xff0c;尤其是在政府、商业和工业组织不断加深互联的情况下&#xff0c;AI和ML技术的影响日益广泛。虽然AI技术的…

实现uniapp-微信小程序 搜索框+上拉加载+下拉刷新

pages.json 中的配置 { "path": "pages/message", "style": { "navigationBarTitleText": "消息", "enablePullDownRefresh": true, "onReachBottomDistance": 50 } }, <template><view class…

布谷直播源码部署服务器关于数据库配置的详细说明

布谷直播源码搭建部署配置接口数据库 /public/db.php&#xff08;2019年8月后的系统在该路径下配置数据库&#xff0c;老版本继续走下面的操作&#xff09; 在项目代码中执行命令安装依赖库&#xff08;⚠️注意&#xff1a;如果已经有了vendor内的依赖文件的就不用执行了&am…

【C++】STL— stack的常见用法和模拟实现

目录 1、stack的介绍 2、stack的使用 构造一个空栈 stack的简单接口应用 3、stack的模拟实现 4、栈的相关题目 4.1 最小栈 4.1.2思路 4.1.3 实现代码 4.2 栈的压入、弹出序列 4.2.2 思路 4.2.3程序实现 1、stack的介绍 在C中&#xff0c;stack是一种标准模板库&am…

vue大疆建图航拍功能实现

介绍 无人机在规划一块区域的时候&#xff0c;我们需要手动的给予一些参数来影响无人机飞行&#xff0c;对于一块地表&#xff0c;无人机每隔N秒在空中间隔的拍照地表的一块区域&#xff0c;在整个任务执行结束后&#xff0c;拍到的所有区域照片能够完整的表达出一块地表&…

[ DOS 命令基础 2 ] DOS 命令详解-网络相关命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

es自动补全(仅供自己参考)

elasticssearch提供了CompletionSuggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询效率&#xff0c;对于文档中字段的类型有一些约束&#xff1a; 查询类型必须是&#xff1a;completion 字段内容是多个补全词条形成的数组 P…

react jsx基本语法,脚手架,父子传参,refs等详解

1&#xff0c;简介 1.1 概念 react是一个渲染html界面的一个js库&#xff0c;类似于vue&#xff0c;但是更加灵活&#xff0c;写法也比较像原生js&#xff0c;之前我们写出一个完成的是分为html&#xff0c;js&#xff0c;css&#xff0c;现在我们使用react库我们把html和js结…

Chrome浏览器如何导出所有书签并导入书签

前言 我平常在开发中&#xff0c;基本是用的谷歌的浏览器&#xff0c;也就是Chrome&#xff0c;因为这个对于开发来说&#xff0c;比较友好。在开发中&#xff0c;包括调试接口&#xff0c;打断点&#xff0c;查看打印日志等&#xff0c;都是非常不错的。另一方面&#xff0c;…