JavaScript快捷方式:15个简写技巧,让你的代码事半功倍!

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

    • 1. 使用箭头函数
    • 2. 对象字面量的简写
    • 3. 解构赋值
    • 4. 默认参数
    • 5. 模板字符串
    • 6. 简写的条件判断
    • 7. 短路求值
    • 8. 真值判断
    • 9. 数组方法的简写
    • 10. 使用扩展运算符
    • 11. 简写属性方法
    • 12. 使用箭头函数的简写语法
    • 13. 数组解构赋值和函数默认参数的结合
    • 14. 简写的对象方法定义
    • 15. 使用`Array.from`和`Array.of`

当进行JavaScript编码时,有许多简写技巧可以提高开发效率。
下面列举了15个常用的JS简写技巧:

1. 使用箭头函数

使用箭头函数 () => {} 替代传统的函数表达式,简化函数定义。

传统函数表达式:

function add(a, b) {return a + b;
}

箭头函数简化定义:

const add = (a, b) => a + b;

通过使用箭头函数,我们可以将函数定义的语法更简洁地表示出来,省略了 function 关键字和 return 语句。箭头函数的特点是自动绑定了当前作用域的 this 值,因此在一些回调或高阶函数中使用会更加方便和简洁。请记住,箭头函数与传统函数表达式在语义和作用域绑定方面存在一些差异,在使用时要注意这些差异。

2. 对象字面量的简写

当对象属性的名称和值相同时,可以只写属性名,省略冒号和重复的变量名。

你可以在对象字面量中省略属性名和冒号,当属性名和变量名相同时,只写属性名即可。这在提高代码可读性方面是非常有用的。

例如,传统的写法:

const x = 1;
const y = 2;const obj = {x: x,y: y
};

使用简写方式:

const x = 1;
const y = 2;const obj = {x,y
};

在这个示例中,属性名和变量名 xy 是相同的,所以我们可以直接在对象字面量中省略冒号和重复的变量名,只写属性名。这样可以减少代码的冗余,让代码更加简洁易读。

3. 解构赋值

使用解构赋值语法,一次性从数组或对象中提取多个值,简化变量的声明和赋值。

解构赋值语法可以方便地一次性从数组或对象中提取多个值,并将它们赋值给对应的变量。这样可以简化变量的声明和赋值的过程。

  1. 从数组中提取多个值:
const arr = [1, 2, 3];// 传统的写法
const a = arr[0];
const b = arr[1];
const c = arr[2];// 使用解构赋值
const [a, b, c] = arr;
  1. 从对象中提取多个值:
const obj = { x: 1, y: 2, z: 3 };// 传统的写法
const x = obj.x;
const y = obj.y;
const z = obj.z;// 使用解构赋值
const { x, y, z } = obj;

在这些示例中,我们使用解构赋值语法一次性从数组和对象中提取了多个值,并将它们赋值给相应的变量。这样可以简化代码,使得声明和赋值过程更加简洁和可读。请注意,在解构赋值时,变量名需要与数组或对象中的属性名一致,这样才能正确地提取对应的值。

4. 默认参数

在函数声明中使用默认参数,可以简化对函数的调用,避免传递 undefined 或 null。

确实,在函数声明中使用默认参数可以简化函数调用的过程,并且避免了传递 undefined 或 null 的情况。默认参数允许我们在定义函数时指定参数的默认值,如果函数在调用时没有为该参数提供值,将会使用默认值。

下面是一个示例,展示了如何在函数声明中使用默认参数:

function greet(name = 'Guest') {console.log(`Hello, ${name}!`);
}greet(); // 输出:Hello, Guest!
greet('Alice'); // 输出:Hello, Alice!

在上面的示例中,我们定义了一个名为 greet 的函数,并为 name 参数设置了默认值 'Guest'。当函数调用时没有提供 name 参数的值时,将使用默认值 'Guest' 来代替。这样,我们可以简单地调用 greet(),而无需显式地传递参数,或者传递 undefined 或 null。

使用默认参数不仅简化了函数的调用方式,还可以提高代码的可读性和灵活性。如果需要,我们仍然可以传递一个新的值来覆盖默认参数。

注意:默认参数的默认值可以是任何合法的表达式,例如常量、变量、函数调用等。

5. 模板字符串

使用模板字符串(``)来代替字符串拼接,使用 ${} 语法方便地插入变量。

当我们需要在字符串中插入变量时,可以使用模板字符串(``)和 ${} 语法来代替传统的字符串拼接。这种语法更加简洁和直观。

下面是一个示例,展示了如何使用模板字符串和 ${} 语法来插入变量:

const name = 'Alice';
const age = 28;// 传统的字符串拼接
const message = 'My name is ' + name + ' and I am ' + age + ' years old.';
console.log(message);// 使用模板字符串和 ${} 语法
const message = `My name is ${name} and I am ${age} years old.`;
console.log(message);

在上面的示例中,我们使用模板字符串来替代了传统的字符串拼接方式。在模板字符串中,我们使用 ${} 语法来插入变量,并将变量的值嵌入到字符串中。这让代码更加简洁易读,并且避免了繁琐的字符串连接操作。

6. 简写的条件判断

使用三元运算符(condition ? value1 : value2)来简化简单的条件判断。

是的,使用三元运算符可以简化简单的条件判断,特别是在需要根据条件选择不同的值时。三元运算符的语法是 condition ? value1 : value2

下面是一个示例,展示了如何使用三元运算符来简化简单的条件判断:

function getDiscount(price, isMember) {const discount = isMember ? 0.2 : 0; // 如果 isMember 为真,则 discount 为 0.2,否则为 0return price - (price * discount);
}console.log(getDiscount(100, true)); // 输出:80
console.log(getDiscount(100, false)); // 输出:100

在上面的示例中,我们定义了一个名为 getDiscount 的函数,该函数根据 isMember 参数的值来确定折扣值。如果 isMember 为真(即成员),则折扣为 0.2,否则折扣为 0。通过使用三元运算符,我们可以根据条件快速选择不同的值,并在函数中进行相应的计算。

使用三元运算符能够简化代码,使其更加简洁和易读。但请注意,过多复杂的条件判断可能会降低代码的可读性,因此请适度使用三元运算符。在某些情况下,使用 if-else 语句可能更加清晰和可读。

7. 短路求值

使用逻辑与(&&)和逻辑或(||)来进行短路求值,简化一些条件判断。

逻辑与(&&)和逻辑或(||)运算符可以用于短路求值,从而简化一些条件判断。这种技巧称为"短路求值",它利用了逻辑运算符的特性:逻辑与(&&)在前面的条件为假时短路,逻辑或(||)在前面的条件为真时短路。

下面是一个示例,展示了如何使用短路求值来简化条件判断:

function greet(user) {const name = user && user.name || 'Guest';console.log(`Hello, ${name}!`);
}greet({ name: 'Alice' }); // 输出:Hello, Alice!
greet(null); // 输出:Hello, Guest!
greet(undefined); // 输出:Hello, Guest!

在上面的示例中,我们定义了一个名为 greet 的函数,该函数接受一个 user 参数。使用短路求值,我们首先判断 user 是否存在(不是 null 或 undefined),如果存在,则使用 user.name 作为名称;否则,使用默认值 'Guest'。这样,我们可以在一行代码中实现了对 user 对象是否存在以及是否有名称的判断,避免了显式的 if-else 判断语句。

请注意,在使用短路求值时,需要注意操作数的顺序和条件判断的逻辑。确保逻辑与(&&)和逻辑或(||)的操作数顺序和条件判断的顺序是一致的,以确保正确的短路求值。

短路求值在某些情况下可以提高代码的简洁性和可读性,但有时也可能导致代码难以理解。请确保在使用短路求值时保持代码清晰和易于维护。

8. 真值判断

使用 !! 来将一个值转换为对应的布尔值,判断一个变量是否为真值。

可以使用 !! 来将一个值转换为对应的布尔值。这种技巧被称为"双重取反",它利用了 JavaScript 中的类型转换规则。

下面是一个示例,展示了如何使用 !! 判断一个变量是否为真值:

function isTruthy(value) {return !!value;
}console.log(isTruthy(0)); // 输出:false
console.log(isTruthy('')); // 输出:false
console.log(isTruthy(null)); // 输出:false
console.log(isTruthy(undefined)); // 输出:false
console.log(isTruthy(false)); // 输出:falseconsole.log(isTruthy(1)); // 输出:true
console.log(isTruthy('hello')); // 输出:true
console.log(isTruthy({})); // 输出:true
console.log(isTruthy(true)); // 输出:true

在上面的示例中,我们定义了一个名为 isTruthy 的函数,该函数接受一个 value 参数。通过使用 !!value,我们将 value 转换为对应的布尔值。如果 value 为真值(非 0、非空字符串、非 null、非 undefined、非 false),则返回 true;否则返回 false

双重取反的作用是将任何值转换为其对应的布尔值,简化了对真值判断的过程。它可以在条件判断、逻辑运算等场景中使用,使代码更加简洁和直观。

需要注意的是,双重取反操作符 !! 在转换为布尔值时具有强制性,如果你只需要判断变量是否为真值,可以直接在条件语句中使用变量作为判断条件,而无需使用双重取反。使用双重取反通常用于显式地将一个值转换为布尔值。

9. 数组方法的简写

使用数组方法如 mapfilterreduce 等来替代循环操作,提高代码简洁性。

使用数组方法如 mapfilterreduce 等可以更简洁地操作数组,替代传统的循环操作。它们提供了一种函数式编程的风格,让代码更易读、易写、易于维护。下面是一些示例代码,展示了如何使用这些数组方法:

1. 使用 map 方法:

const numbers = [1, 2, 3, 4, 5];const squaredNumbers = numbers.map(num => num ** 2);
console.log(squaredNumbers); // 输出:[1, 4, 9, 16, 25]const doubledNumbers = numbers.map(num => num * 2);
console.log(doubledNumbers); // 输出:[2, 4, 6, 8, 10]

在上面的示例中,我们使用 map 方法对数组 numbers 中的每个元素进行操作,生成一个新的数组。第一个例子将每个数字的平方放入 squaredNumbers 数组中,第二个例子将每个数字乘以 2 放入 doubledNumbers 数组中。

2. 使用 filter 方法:

const numbers = [1, 2, 3, 4, 5];const evenNumbers = numbers.filter(num => num % 2 === 0);
console.log(evenNumbers); // 输出:[2, 4]const oddNumbers = numbers.filter(num => num % 2 !== 0);
console.log(oddNumbers); // 输出:[1, 3, 5]

在上面的示例中,我们使用 filter 方法根据指定条件过滤数组 numbers,生成一个新的数组。第一个例子筛选出数组中的偶数,第二个例子筛选出数组中的奇数。

3. 使用 reduce 方法:

const numbers = [1, 2, 3, 4, 5];const sum = numbers.reduce((total, num) => total + num, 0);
console.log(sum); // 输出:15const max = numbers.reduce((maxNum, num) => (num > maxNum ? num : maxNum), -Infinity);
console.log(max); // 输出:5

在上面的示例中,我们使用 reduce 方法将数组 numbers 中的元素归约为一个值。第一个例子使用 reduce 方法计算数组中所有数字的和,初始值为 0。第二个例子使用 reduce 方法找到数组中的最大值,初始值为负无穷小。

这些是使用 mapfilterreduce 等数组方法来替代循环操作的示例。它们可以显著简化代码,并且提供了丰富的功能来操作和转换数组数据。

10. 使用扩展运算符

使用扩展运算符(...)来合并数组、复制数组或对象,简化相关操作。

使用扩展运算符(...)可以在 JavaScript 中合并数组、复制数组或对象,从而简化相关操作。下面是一些示例代码,演示如何使用扩展运算符:

1. 合并数组:

const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];const mergedArray = [...arr1, ...arr2];
console.log(mergedArray); // 输出:[1, 2, 3, 4, 5, 6]

在上面的示例中,我们使用扩展运算符 ... 将两个数组 arr1arr2 合并成一个新的数组 mergedArray

2. 复制数组:

const originalArray = [1, 2, 3];const copiedArray = [...originalArray];
console.log(copiedArray); // 输出:[1, 2, 3]

上面的示例展示了如何使用扩展运算符 ... 快速复制一个数组。通过将原始数组扩展到一个新数组中,我们创建了一个具有相同元素的副本。

3. 合并对象:

const obj1 = { foo: 'bar' };
const obj2 = { baz: 'qux' };const mergedObject = { ...obj1, ...obj2 };
console.log(mergedObject); // 输出:{ foo: 'bar', baz: 'qux' }

在上面的示例中,我们使用扩展运算符 ... 将两个对象 obj1obj2 合并成一个新的对象 mergedObject。通过这种方式,我们可以将多个对象的属性合并成一个新的对象。

扩展运算符在这些例子中起到了简化代码的作用,它允许我们更方便地合并数组、复制数组或对象。它可以应用于数组、对象以及在 ES6 中引入的可迭代对象(如字符串、Set、Map等)。

11. 简写属性方法

在对象中使用函数的简写形式,只写函数名,省略冒号和 function 关键字。

在对象中使用函数的简写形式可以让代码更简洁。在 ES6 中,我们可以直接在对象字面量中使用函数名来定义函数属性,省略冒号和 function 关键字。下面是一个示例代码:

const obj = {name: 'John',age: 30,greet() {console.log(`Hello, my name is ${this.name}. I'm ${this.age} years old.`);}
};obj.greet(); // 输出:Hello, my name is John. I'm 30 years old.

在上面的示例中,我们定义了一个对象 obj,其中包含名为 greet 的函数属性。这里直接使用了函数名 greet 来定义函数,而省略了冒号和 function 关键字。函数可以像普通函数一样被调用。

通过使用函数的简写形式,我们可以更清晰地在对象中定义和使用函数,避免了传统的冗长语法,使代码更易读、易写。

12. 使用箭头函数的简写语法

当只有一个参数时,可以省略括号;当函数体只有一条返回语句时,可以省略大括号和 return

当函数只有一个参数时,可以省略参数外的括号。当函数体只有一条返回语句时,也可以省略大括号和 return 关键字。下面是一些示例代码来说明这两种情况:

1. 省略参数括号:

const square = x => x * x;console.log(square(5)); // 输出:25

在上面的示例中,square 函数只有一个参数 x,因此我们可以省略参数的括号。

2. 省略大括号和 return

const greet = name => `Hello, ${name}!`;console.log(greet('John')); // 输出:Hello, John!

在上面的示例中,greet 函数只有一条返回语句,即返回一个字符串,并且没有其他逻辑需要执行。因此,我们可以省略大括号和 return 关键字。

这种简写形式可以使单参数函数和简单的返回语句更为简洁,提高代码的可读性和简洁性。请注意,这种简写形式适用于特定的情况,如果函数需要多个参数或包含复杂的逻辑,还是需要使用完整的语法形式来定义函数。

13. 数组解构赋值和函数默认参数的结合

将默认参数与数组解构赋值结合,简化函数参数的初始化和赋值。

通过将默认参数与数组解构赋值结合使用,我们可以简化函数参数的初始化和赋值。下面是一个示例代码:

function printUser({ name = 'John', age = 30, city = 'New York' }) {console.log(`Name: ${name}`);console.log(`Age: ${age}`);console.log(`City: ${city}`);
}printUser({ name: 'Alice', age: 25 }); 
// 输出:
// Name: Alice
// Age: 25
// City: New YorkprintUser({}); 
// 输出:
// Name: John
// Age: 30
// City: New York

在上面的示例中,我们定义了一个名为 printUser 的函数,它接受一个对象作为参数,并使用对象解构赋值将属性值赋给变量 nameagecity。我们还使用了默认参数来指定在调用函数时未提供对应属性的默认值。

通过这种方式,我们可以在函数内部直接使用解构赋值的变量,而无需手动进行参数初始化和赋值的步骤。这样可以简化代码,尤其是在处理多个参数的函数时,使代码更清晰易读。如果调用函数时未提供对应属性,将使用默认值进行初始化。

14. 简写的对象方法定义

在对象中使用方法的简写形式,省略 function 关键字和冒号。

在对象中使用方法的简写形式是一种省略 function 关键字和冒号的语法。下面是一个示例代码:

const person = {name: 'John',age: 30,sayHello() {console.log(`Hello, my name is ${this.name}.`);}
};person.sayHello(); 
// 输出:Hello, my name is John.

在上面的示例中,我们定义了一个 person 对象,其中包含 nameage 属性,以及一个 sayHello 方法。注意到 sayHello 方法的定义没有使用冒号和 function 关键字,而是直接写方法的函数体。

这种简写形式可使对象中的方法定义更加简洁。在对象字面量中,如果我们要定义一个简单的函数作为方法,我们可以直接省略冒号和 function 关键字,并将函数体写在方法的位置上。这样可以减少冗余代码,使代码更清晰易读,特别是当我们同时定义多个方法时。

15. 使用Array.fromArray.of

使用 Array.from 将可迭代对象(如字符串和类数组对象)转换为数组,使用 Array.of 创建具有固定参数的新数组。

使用 Array.from 可以将可迭代对象(如字符串和类数组对象)转换为一个新的数组。而 Array.of 可以创建具有固定参数的新数组。下面是两个示例代码:

// 使用 Array.from 将字符串转换为数组
const str = 'Hello';
const arr = Array.from(str);
console.log(arr); 
// 输出:[ 'H', 'e', 'l', 'l', 'o' ]// 使用 Array.from 将类数组对象转换为数组
const arrayLike = { 0: 'a', 1: 'b', 2: 'c', length: 3 };
const arr2 = Array.from(arrayLike);
console.log(arr2); 
// 输出:[ 'a', 'b', 'c' ]// 使用 Array.of 创建具有固定参数的新数组
const newArr = Array.of(1, 2, 3, 4, 5);
console.log(newArr); 
// 输出:[ 1, 2, 3, 4, 5 ]

在上面的示例代码中,首先使用 Array.from 将字符串 'Hello' 转换为一个新的字符数组 arr。然后,我们使用 Array.from 将一个类数组对象 arrayLike 转换为一个数组 arr2

接下来,我们使用 Array.of 创建了一个新的数组 newArr,并将参数 1, 2, 3, 4, 5 作为数组的元素传递进去。

这两个方法可以方便地进行数据转换和创建新的数组。Array.from 可以处理可迭代对象,而 Array.of 可以创建具有固定参数的新数组,使代码更加简洁和可读。

这些简写技巧可以使代码更简洁、易读和高效,但在使用时请确保你和你的团队对这些技巧有清晰的理解,以避免出现难以理解或维护的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

依靠继承与聚合,实现maven搭建分布式项目

简介聚合 对于复杂的Maven项目,一般建议采用多模块的方式来设计开发,便于后期维护管理。但是构建项目时,如果每次都需要按模块一个一个进行构建会十分麻烦,而Maven的聚合功能就可以很好的解决这个问题,当用户对聚合模…

Ubuntu22.04安装,SSH无法连接

Ubuntu初始化安装后,系统默认不允许root通过ssh连接,因此需要完成三个设置 1.修改ssh配置文件 vim /etc/ssh/sshd_config 将PermitRootLogin注释打开,并将值改为yes 保存修改并退出 :wq 2.重启ssh服务 sudo service ssh restart 3.重新打…

UG\NX二次开发 设置视图中心 UF_VIEW_set_center

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 a1794902437 订阅本专栏,非常感谢。 简介 UG\NX二次开发 设置视图中心 UF_VIEW_set_center。如果视图NULL_TAG,则使用工作视图。 效果 代码 #include &qu…

Android12 启动页适配

印象中,在2022年末接到了一个针对Android12启动页适配的需求,当时也使用了一些适配方案,也写了一个Demo,但是最终没有付诸适配行动;当然并不是适配失败,而是根据官方适配方案适配后太丑了… 1024纪念文章&a…

SpringBoot整合Activiti7——任务监听器(七)

文章目录 一、任务监听器事件类型配置方式(选)代码实现xml文件创建监听器class方式expression方式delegateExpression 测试流程部署流程启动流程完成任务 一、任务监听器 任务监听器可以在任务创建、任务分配、任务完成、任务删除发生时触发,从而执行相应的逻辑。 事…

【微服务保护】初识 Sentinel —— 探索微服务雪崩问题的解决方案,Sentinel 的安装部署以及将 Sentinel 集成到微服务项目

文章目录 前言一、雪崩问题及其解决方案1.1 什么是雪崩问题1.2 雪崩问题的原因1.3 解决雪崩问题的方法1.4 总结 二、初识 Sentinel 框架2.1 什么是 Sentinel2.2 Sentinel 和 Hystrix 的对比 三、Sentinel 的安装部署四、集成 Sentinel 到微服务 前言 微服务架构在现代软件开发…

【Kotlin精简】第6章 反射

1 反射简介 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。 1.1 Kotlin反射 我们对比Kotlin和Java的反射类图。 1.1.1 Kotlin反射常用的数据结…

Unity Profiler 详细解析(一)

Overview: . Profiler简介 . Profiler各模块介绍 . 各平台下Profiler的使用 . 基于Profiler的优化定位 . Profiler的主要参数详解 . Profiler案例 Profiler简介 Profiler 是Unity中分析性能开销的工具 • 各种开销一览无遗 • 可跨平台使用(Web、PC、iOS、Android、…

模拟 Junit 框架

需求 定义若干个方法,只要加了MyTest注解,就可以在启动时被触发执行 分析 定义一个自定义注解MyTest,只能注解方法,存活范围是一直都在定义若干个方法,只要有MyTest注解的方法就能在启动时被触发执行,没有这…

侯捷C++面向对象程序设计笔记(上)-Object Based(基于对象)部分

基于对象就是对于单一class的设计。 对于有指针的:complex.h complex-test.cpp 对于没有指针的: string.h string-test.cpp https://blog.csdn.net/ncepu_Chen/article/details/113843775?spm1001.2014.3001.5501#commentBox 没有指针成员——以复数co…

计算机网络,网络(OSI)七层模型,三次握手四次挥手,get与post请求区别,网络IO(BIO\NIO\AIO),TCP与UDP区别

1.OSI模型? 开放式系统互联通信参考模型(Open System Interconnection Reference Model) OSI网络七层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 TCP/IP协议群简化了OSI七层模型:应用层、传输层、网络层、数据链路…

Ubuntu 安装 npm 和 node

前言 最近学习VUE,在ubuntu 2204 上配置开发环境,涉及到npm node nodejs vue-Cli脚手架等内容,做以记录。 一、node nodejs npm nvm 区别 ? node 是框架,类似python的解释器。nodejs 是编程语言,是js语言的…

DDOS直接攻击系统资源

DDOS ——直接攻击系统资源 思路: 攻击机利用三次握手机制,产生大量半连接,挤占受害者系统资源,使其无法正常提供服务。 1、先体验下受害者的正常网速。在受害者主机上执行以下命令 (1)开启Apache。 systemctl start apache2 (2…

ROCESS SPID 代表什么进程

ROCESS 发出sql命令 所在主机的进程 可以不在数据库主机上发出 SPID 对应数据库的服务进程id select a.PROCESS,b.SPID From v$session a , v$process b where a.PADDRb.ADDR and a.USERNAMESYS SQL> !ps -ef|grep sqlplus oracle 385 2792 0 21:01 pts/…

如何创建前端绘图和图表?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

PHP 预定义超全局变量 笔记/练习

预定义超全局数组变量 $_FILES 练习在最后 其他练习跟在每条笔记后 概述 预定义:预定义变量是 PHP 已定义,可以直接使用超全局:作用域是全局,可以在脚本的任何地方(包括函数内部、外部)都可以进行访问 常…

设计模式之装饰器模式

前言 上一篇文章中,分享了适配器模式的一些相关知识,在本篇文章将为大家分享装饰器模式,乍一听,适配器和装饰器,是不是有点类似的感觉?其实这两种模式,完全是两种不同的设计模式,下…

GoLong的学习之路(一)语法之变量与常量

目录 GoLang变量批量声明变量的初始化类型推导短变量声明匿名变量 常量iota(特殊)(需要重点记忆) GoLang go的诞生为了解决在21世纪多核和网络化环境越来越复杂的变成问题而发明的Go语言。 go语言是从Ken Thomepson发明的B语言和…

外网nat+nat server,内网做路由过滤,以及ppp CHAR认证 企业网搭建

作业 网络拓扑图如下所示: 要求:做适当的截图,表示完成相应的操作。 按照网络拓扑要求搭建网络结构,按照个人学号配置每个节点的IP地址,其中X为班级号,Y为学号末尾2位;Y1为学号末尾2位1&#…

Seata学习

Seata Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 官网地址:https://seata.io/zh-cn/index.html 为什么会产生分布式事务? 示例:用户下单后需要创建订单,同时…