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

探索 JavaScript 新增声明命令与解构赋值的魅力:从 ES5 迈向 ES6


在这里插入图片描述



个人主页:学习前端的小z

个人专栏:JavaScript 精粹

本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论!
在这里插入图片描述


ES5、ES6介绍


文章目录

  • 💯声明命令 let、const
    • 🍟1 let声明符
      • 🎲1.1 基础特性
      • 🎲1.2 不进行变量提升
      • 🎲1.3 致死域(暂时性死区)
      • 🎲1.4 无法重复声明
      • 🎲1.5 块作用域 (block scope)
      • 🎲1.6 块作用域下的函数声明
    • 🍟2 const声明符
      • 🎲2.1 声明时必须赋值
      • 🎲2.2 值为对象
  • 💯解构赋值
    • 🍟1 数组解构
      • 🎲1.1 基础变量赋值
      • 🎲1.2 声明分别赋值
      • 🎲1.3 解构默认值
      • 🎲1.4 交换变量值
      • 🎲1.5 解析函数返回的数组
      • 🎲1.6 忽略返回值/跳过某项
      • 🎲1.7 赋值数组剩余值给一个变量
      • 🎲1.8 嵌套数组解构
    • 🍟2 对象解构
      • 🎲2.1 基础对象解构
      • 🎲2.2 无声明解构
      • 🎲2.3 赋值给新变量名
      • 🎲2.4 解构默认值
      • 🎲2.5 赋值给新变量名的同时提供默认值
      • 🎲2.6 嵌套对象和数组解构
      • 🎲2.7 可计算对象属性名与解构
      • 🎲2.8 同时使用数组和对象解构
      • 🎲2.9 注意点
    • 🍟3 函数参数的解构赋值
    • 🍟4 解构的用途
      • 🎲4.1 交换变量的值
      • 🎲4.2 从函数返回多个值
      • 🎲4.3 函数参数的定义
      • 🎲4.4 提取 JSON 数据
      • 🎲4.5 函数参数的默认值


在这里插入图片描述


💯声明命令 let、const

🍟1 let声明符

ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。

🎲1.1 基础特性

if(true){let a = 'let';var b = 'var';
}console.log(b); //var
console.log(a); //Uncaught ReferenceError: a is not defined---------------------------------------------------------//使用let,声明的变量仅在块级作用域内({ })有效,最后输出的是 6。
for(let i = 0; i < 10; i++){}
console.log(i); //Uncaught ReferenceError: i is not defined

上面代码在代码块之中,分别用letvar声明了两个变量。然后在代码块之外调用这两个变量,结果let声明的变量报错,var声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。

// 在循环体表达式中let声明迭代变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量
var a = [];
for (let i = 0; i < 10; i++) {a.push(function () {console.log(i);});
}
a[5](); // 5
// 在循环体表达式中let声明 和循环体中let 声明同名变量是不冲突的 设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。相当于每次循环{}内部都会单独开一个局部作用域
for (let i = 0; i < 3; i++) {let i = 'abc';console.log(i);
}

🎲1.2 不进行变量提升

var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined

let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。 这一点需要特殊注意

// var 的情况
console.log(num); // 输出undefined
var num = 2;-------------------------// let 的情况
console.log(age); // 报错ReferenceError
let age = 16;

🎲1.3 致死域(暂时性死区)

只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。

//正常调用
let num = 10;
if (true) {console.log(num); //10
}------------------//if { }内部let为独立局部作用域 访问为 20
let num = 10;
if (true) {let num = 20;console.log(num); //20
}------------------//发生致死 因为fn局部作用域中有let声明num 所以在作用域内 不能先调用再使用let声明。
let num = 10;
function fn() {console.log(num); //Uncaught ReferenceError: Cannot access 'num' before initializationlet num = 20;
}
fn();------------------//typeof操作影响typeof num;
let num; //Uncaught ReferenceError: Cannot access 'num' before initialization

当程序的控制流程在新的作用域(module function 或 block 作用域)进行实例化时,在此作用域中用let/const声明的变量会先在作用域中被创建出来,但因此时还未进行词法绑定,所以是不能被访问的,如果访问就会抛出错误。因此,在这运行流程进入作用域创建变量,到变量可以被访问之间的这一段时间,就称之为暂时死区。

es6规定 let/const 会使区域形成封闭的作用域 若在声明之前使用变量就会发生错误, 在代码块内使用let命令声明变量之前 该变量都无法使用,称为“暂时性死区”(temporal dead zone,简称 TDZ)。总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。使用let 确保先 声明 再 使用 变量 不要混用let和var在同一个作用域链上 避免死区

🎲1.4 无法重复声明

let不允许在相同作用域内,重复声明同一个变量。

//发生致死 因为var会变量提升。
let num = 10;
if (true) {var num = 20; //Uncaught SyntaxError: Identifier 'num' has already been declaredconsole.log(num);
}

🎲1.5 块作用域 (block scope)

在ES5中,只全局作用域和函数作用域。这会导致函数作用域覆盖了全局作用域;亦或者循环中的变量泄露为全局变量。

EcmaScript 6引入了块级作用域(block scope),块级作用域只能在块中被访问,以下两种情况可以创建块级作用域的变量。

  • 在函数中

  • 在被{}包裹的块中

{var x = 10;
}
console.log(x); //10------------------{let x = 10;
}
console.log(x);//x is not defined------------------//函数有两个代码块,都声明了变量num,运行后输出 3。这表示外层代码块不受内层代码块的影响。如果两次都使用var定义变量num,最后输出的值才是 6。
function fn() {let num = 3;if (true) {let num = 6;}console.log(num); // 3
}

🎲1.6 块作用域下的函数声明

ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。

ES6 的块级作用域必须有大括号,如果没有大括号,JavaScript 引擎就认为不存在块级作用域。

function a() {console.log('我是全局作用域内声明的函数a');
}(function () {if (false) {function a() {console.log('我是块级作用域内声明的函数a');}}a();
})();----------------------function a() {console.log('我是全局作用域内声明的函数a');
}
(function () {var a;if (false) {a = function () {console.log('我是块级作用域内声明的函数a');}}a();
})();

为了减轻因此产生的不兼容问题,ES6 在附录 B里面规定,浏览器的实现可以不遵守上面的规定,有自己的行为方式。

  • 允许在块级作用域内声明函数。
  • 函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
  • 同时,函数声明还会提升到所在的块级作用域的头部。

🍟2 const声明符

const声明一个只读的常量。一旦声明,常量的值就不能改变。 const与let在 块作用域 重复声明 致死域的问题上是一致的 const的作用域与let命令相同:只在声明所在的块级作用域内有效。

const DATA = '我是常量 不能改变哦';
DATA //  '我是常量 不能改变哦'DATA = '改一个试试看';
// TypeError: Assignment to constant variable.

const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。

🎲2.1 声明时必须赋值

const X;
//Uncaught SyntaxError: Missing initializer in const declaration

🎲2.2 值为对象

const KEY_MAP = {a:1,b:2
}KEY_MAP['a'] = 2; //不报错-----------const ARRAY = [];
ARRAY.push('something'); // 可执行
ARRAY.length = 0;    // 可执行
ARRAY = ['something'];    // 报错

在这里插入图片描述


💯解构赋值

ES6提供了更简洁的赋值模式, 从数组和对象中提取值. 这被称为解构(Destructuring)。

[a, b] = [50, 100];console.log(a);
// expected output: 50console.log(b);
// expected output: 100[a, b, ...rest] = [10, 20, 30, 40, 50];console.log(rest);
// expected output: [30, 40, 50]

我们有很多种不同的方式使用 JavaScript 解构。

🍟1 数组解构

数组解构是极为简单整洁的,在复制表达式的左侧使用数组字面量。数组字面量中的每个变量名称映射为解构数组的相同索引项。

🎲1.1 基础变量赋值

let foo = ['one', 'two', 'three'];let [red, yellow, green] = foo;
console.log(red); // "one"
console.log(yellow); // "two"
console.log(green); // "three"

🎲1.2 声明分别赋值

你可以通过变量声明分别解构赋值。举例:首先,声明变量,然后分别赋值。

// 声明变量
let a, b;
// 然后分别赋值
[a, b] = [1, 2];
console.log(a); // 1
console.log(b); // 2

🎲1.3 解构默认值

如果解构取出的值是 undefined,可以设置默认值:

let a, b;
// 设置默认值
[a = 5, b = 7] = [1];
console.log(a); // 1
console.log(b); // 7

在上面的例子中,我们给 ab 设置了默认值。这种情况下,如果 ab 的值是 undefined,它将赋值默认值 5a 7b

🎲1.4 交换变量值

解构可以在一个解构表达式中交换两个变量值

let a = 1;
let b = 3;[a, b] = [b, a];
console.log(a); // 3
console.log(b); // 1

如果你想不使用解构交换变量值,将必须提供一个缓存变量或者同解构一起使用

🎲1.5 解析函数返回的数组

可以解构函数返回的数组。

function c() {return [10, 20];
}let a, b;
[a, b] = c();
console.log(a); // 10
console.log(b); // 20

在上面的例子中,c() 的返回值 [10, 20] 可以在单独的一行代码中使用解构解析。

🎲1.6 忽略返回值/跳过某项

你也可以跳过一些没有用的返回值。

function c() {return [1, 2, 3];
}let [a, , b] = c();
console.log(a); // 1
console.log(b); // 3

在罕见的情况下,你想忽略所有的值。

[, ,] = c();

当然,这是不会发生的。

🎲1.7 赋值数组剩余值给一个变量

当你使用数组解构,你可以赋值数组剩余部分给一个单独的变量。

let [a, ...b] = [1, 2, 3];
console.log(a); // 1
console.log(b); // [2, 3]

小心结尾的逗号语法错误,它将爆发如果在剩余元素的左侧使用结尾逗号:

let [a, ...b,] = [1, 2, 3];
// SyntaxError: rest element may not have a trailing comma

🎲1.8 嵌套数组解构

像对象一样,你也可以使用数组嵌套解构。这里有一个例子:

const color = ['#FF00FF', [255, 0, 255], 'rgb(255, 0, 255)'];// Use nested destructuring to assign red, green and blue
// 使用嵌套解构赋值 red, green, blue
const [hex, [red, green, blue]] = color;console.log(hex, red, green, blue); // #FF00FF 255 0 255

🍟2 对象解构

🎲2.1 基础对象解构

let x = { y: 22, z: true };
let { y, z } = x; // let {y:y,z:z} = x;的简写console.log(y); // 22
console.log(z); // true

🎲2.2 无声明解构

你可以使用解构分别从它的声明赋值变量。这意味着在上面的例子中不需要创建变量 x

let y, z;({ y, z } = { y: 1, z: 2 });

注意:圆括号 (...) 包裹赋值声明是必须的当使用对象字面量解构赋值无声明变量。

{a, b} = {a: 1, b: 2} 不是有效的独立语法,左侧的 {a, b} 被考虑为代码块而不是一个对象字面量。

因此,({a, b} = {a: 1, b: 2}) 是有效的, 等价于 var {a, b} = {a: 1, b: 2}

(...) 表达式需要前置分号或者它可能用于在前一行执行函数。

🎲2.3 赋值给新变量名

当使用对象解构时你也可以改变变量的名称,如下例子:

let o = { p: 22, q: true };
let { p: foo, q: bar } = o;console.log(foo); // 22
console.log(bar); // true

例子中,var {p: foo} = o 获取对象 o 的属性名 p,然后赋值给一个名称为 foo 的变量。

🎲2.4 解构默认值

如果解构取出的对象值是 undefined 你也可以设置默认值。

let { a = 10, b = 5 } = { a: 3 };console.log(a); // 3
console.log(b); // 5

🎲2.5 赋值给新变量名的同时提供默认值

let { a: aa = 10, b: bb = 5 } = { a: 3 };console.log(aa); // 3
console.log(bb); // 5

🎲2.6 嵌套对象和数组解构

const metadata = {title: 'Scratchpad',translations: [{locale: 'de',localization_tags: [],last_edit: '2014-04-14T08:43:37',url: '/de/docs/Tools/Scratchpad',title: 'JavaScript-Umgebung',},],url: '/en-US/docs/Tools/Scratchpad',
};let {title: englishTitle, // 重命名translations: [{title: localeTitle, // 重命名},],
} = metadata;console.log(englishTitle); // "Scratchpad"
console.log(localeTitle); // "JavaScript-Umgebung"

🎲2.7 可计算对象属性名与解构

当使用解构改变对象属性的名称时,可以使用对象计算属性名。

let key = 'z';
let { [key]: foo } = { z: 'bar' };console.log(foo); // "bar"

在上面的例子中,我们计算变量键值并改变它的名称为 foo

🎲2.8 同时使用数组和对象解构

在解构中数组和对象可以联合使用:

const props = [{ id: 1, name: 'Fizz' },{ id: 2, name: 'Buzz' },{ id: 3, name: 'FizzBuzz' },
];const [, , { name }] = props;console.log(name); // "FizzBuzz"

所有的解构赋值语法是相同的,是在赋值符号左侧声明从源变量取出的值。举例来说:

let x = [1, 2, 3, 4, 5];
let [y, z] = x;
console.log(y); // 1
console.log(z); // 2

🎲2.9 注意点

(1)如果要将一个已经声明的变量用于解构赋值,必须非常小心。

// 错误的写法
let x;
{x} = {x: 1};
// SyntaxError: syntax error

上面代码的写法会报错,因为 JavaScript 引擎会将{x}理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免 JavaScript 将其解释为代码块,才能解决这个问题。

// 正确的写法
let x;
({x} = {x: 1});

上面代码将整个解构赋值语句,放在一个圆括号里面,就可以正确执行。

(2)解构赋值允许等号左边的模式之中,不放置任何变量名。因此,可以写出非常古怪的赋值表达式。

({} = [true, false]);
({} = 'abc');
({} = []);

上面的表达式虽然毫无意义,但是语法是合法的,可以执行。

(3)由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。

let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
first // 1
last // 3

上面代码对数组进行对象解构。数组arr0键对应的值是1[arr.length - 1]就是2键,对应的值是3。方括号这种写法,属于“属性名表达式”

🍟3 函数参数的解构赋值

函数的参数也可以使用解构赋值。

function add([x, y]){return x + y;
}add([1, 2]); // 3

上面代码中,函数add的参数表面上是一个数组,但在传入参数的那一刻,数组参数就被解构成变量xy。对于函数内部的代码来说,它们能感受到的参数就是xy

下面是另一个例子。

[[1, 2], [3, 4]].map(([a, b]) => a + b); 
// [ 3, 7 ]

函数参数的解构也可以使用默认值。

function move({x = 0, y = 0} = {}) {return [x, y];
}move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
move(); // [0, 0]

上面代码中,函数move的参数是一个对象,通过对这个对象进行解构,得到变量xy的值。如果解构失败,xy等于默认值。

注意,下面的写法会得到不一样的结果。

function move({x, y} = { x: 0, y: 0 }) {return [x, y];
}move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, undefined]
move({}); // [undefined, undefined]
move(); // [0, 0]

上面代码是为函数move的参数指定默认值,而不是为变量xy指定默认值,所以会得到与前一种写法不同的结果。

undefined就会触发函数参数的默认值。

[1, undefined, 3].map((x = 'yes') => x);
// [ 1, 'yes', 3 ]

🍟4 解构的用途

变量的解构赋值用途很多。

🎲4.1 交换变量的值

let x = 1;
let y = 2;[x, y] = [y, x];

上面代码交换变量xy的值,这样的写法不仅简洁,而且易读,语义非常清晰。

🎲4.2 从函数返回多个值

函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。

// 返回一个数组function example() {return [1, 2, 3];
}
let [a, b, c] = example();// 返回一个对象function example() {return {foo: 1,bar: 2};
}
let { foo, bar } = example();

🎲4.3 函数参数的定义

解构赋值可以方便地将一组参数与变量名对应起来。

// 参数是一组有次序的值
function f([x, y, z]) { ... }
f([1, 2, 3]);// 参数是一组无次序的值
function f({x, y, z}) { ... }
f({z: 3, y: 2, x: 1});

🎲4.4 提取 JSON 数据

解构赋值对提取 JSON 对象中的数据,尤其有用。

let jsonData = {id: 42,status: "OK",data: [867, 5309]
};let { id, status, data: number } = jsonData;console.log(id, status, number);
// 42, "OK", [867, 5309]

上面代码可以快速提取 JSON 数据的值。

🎲4.5 函数参数的默认值

jQuery.ajax = function (url, {async = true,beforeSend = function () {},cache = true,complete = function () {},crossDomain = false,global = true,// ... more config
} = {}) {// ... do stuff
};

指定参数的默认值,就避免了在函数体内部再写var foo = config.foo || 'default foo';这样的语句。


在这里插入图片描述


JavaScript: https://developer.mozilla.org/en-US/docs/Web/JavaScript

在这里插入图片描述


相关文章:

探索 JavaScript 新增声明命令与解构赋值的魅力:从 ES5 迈向 ES6

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; ES5、ES6介绍 文章目录 &#x1f4af;声明命令 let、const&#x1f35f;1 let声明符&a…...

HTML5 历史、地理位置处理、全屏处理

目录 历史HistoryAPI地理位置处理GeolocationAPI全屏处理FullscreenAPIHistoryAPI window.history 对象 window.history 是浏览器提供的一个内置对象,它提供了对浏览器历史记录的访问和操作能力。通过这个对象,开发者可以实现无刷新页面跳转、添加新的浏览历史条目等,从而提…...

打印机驱动程序安装后位置以及注册表中的位置

文件系统中的位置 驱动程序文件&#xff1a;通常位于以下目录&#xff1a; C:\Windows\System32\spool\driversC:\Windows\System32\DriverStore\FileRepository 打印机配置文件&#xff1a;这些文件存储了特定打印机的配置信息&#xff1a; C:\Windows\System32\spool\PRINTER…...

oracle数据库解析过高分析

解析非常高&#xff0c;通过时间模型可以看到解析占比非常高 解析大致可以分为硬解析&#xff08; hard parse&#xff09;、软解析&#xff08; soft parse&#xff09;和软软解析&#xff08; soft soft parse&#xff09;。如&#xff0c;执行一条 SQL 的时候&#xff0c;如…...

Python解析网页-XPath

目录 1、什么是XPath 2、安装配置 3、XPath常用规则 4、快速入门 5、浏览器XPath工具 1.什么是XPath XPath&#xff08;XML Path Language&#xff09;是一种用于在XML文档中定位和选择节点的语言。 它是W3C&#xff08;World Wide Web Consortium&#xff09;定义的一种标…...

Vue 3入门指南

title: Vue 3入门指南 date: 2024/5/23 19:37:34 updated: 2024/5/23 19:37:34 categories: 前端开发 tags: 框架对比环境搭建基础语法组件开发响应式系统状态管理路由配置 第1章&#xff1a;Vue 3简介 1.1 Vue.js的历史与发展 Vue.js由前谷歌工程师尤雨溪&#xff08;Eva…...

Arcpy安装和环境配置

一、前言 ArcPy 是一个以成功的arcgisscripting 模块为基础并继承了arcgisscripting 功能进而构建而成的站点包。目的是为以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化创建基础。该包提供了丰富纯正的 Python 体验&#xff0c;具有代码自动…...

Swagger2 和 Swagger3 的不同

Swagger2 和 Swagger3 的不同 SpringBoot 整合 Swagger3 和 Swagger2 的主要区别如下&#xff1a; 区别一&#xff1a;引入不同的依赖 如果使用的是 Swagger 3 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter<…...

基于Tensorflow+Keras的卷积神经网络(CNN)人脸识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 人脸识别是计算机视觉领域的一个重要研究方向&#xff0c;广泛应用于安全监控、身份验证、人机…...

electron学习记录

1.下载electron electron/electron-quick-start: Clone to try a simple Electron app (github.com) 下载实例模板 2.安装依赖 npm源改成中国镜像 npm config set registry https://registry.npmmirror.com 然后用cnpm i 来安装 npm换官方源 npm config set registry https:…...

【若依框架】学习

验证码 登录...

JavaScript运算符的二义性

在JavaScript中&#xff0c;运算符的二义性&#xff08;或称为运算符重载&#xff09;通常不是直接支持的特性&#xff0c;与某些其他语言&#xff08;如C或Python&#xff09;不同&#xff0c;这些语言允许开发者为自定义类型定义运算符的行为。然而&#xff0c;JavaScript的某…...

一次搞懂常见Banner尺寸,像素标准全解析!

在现代数字营销中&#xff0c;横幅banner广告是一种常见的形式&#xff0c;也是许多网站、博客和在线广告平台上常见的广告类型。然而&#xff0c;正确的横幅banner尺寸是至关重要的&#xff0c;因为它可以影响广告的可见性和效果。在本文中&#xff0c;我们将探讨横幅banner尺…...

短视频矩阵管理系统:高效运营的智能解决方案

在数字化时代&#xff0c;短视频已成为内容传播和品牌推广的重要渠道。随着短视频平台的不断涌现&#xff0c;如何高效管理和运营多个账号&#xff0c;成为了许多企业和个人面临的问题。短视频矩阵管理系统应运而生&#xff0c;它通过一系列智能化功能&#xff0c;为短视频的创…...

ubuntu执行apt-get upgrade时卡住,无法获得锁 /var/lib/dpkg/lock-frontend,无法获取 dpkg 前端锁

执行apt-get upgrade或apt-get dist-upgrade卡住&#xff0c;无法完成更新&#xff0c;中断后再执行更新命令出现如下提示 E: 无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 xxxx&#xff08;unattended-upgr&#xff09;持有。 N: 请注意&#xff0c;直接移除锁文件不一…...

和程序员de 相处之道

1、不要"一遇到问题就去找程序员" 通常&#xff0c;技术问题通过阅读使用说明就可以解决。比如你刚买了一个新的播放器&#xff0c;想要把它连接到你的电视&#xff0c;你只需要找到使用手册里关于如何连接接口的那一页即可。 错误信息通常会被很清晰地列出来。通过…...

图解Java数组的内存分布

我们知道&#xff0c;访问数组元素要通过数组索引&#xff0c;如&#xff1a; arr[0]如果直接访问数组&#xff0c;比如&#xff1a; int[] arr1 {1}; System.out.println(arr1);会发生什么呢&#xff1f; 打印的是一串奇怪的字符串&#xff1a;[I16b98e56。 这个字符串是J…...

前端项目使用docker编译发版和gitlab-cicd发版方式

项目目录 app/ ├── container/ │ ├── init.sh │ ├── nginx.conf.template ├── src/ ├── .gitlab-ci.yml └── deploy.sh └── Dockerfile └── Makefilecontainer目录是放nginx的配置文件&#xff0c;给nginx镜像使用 .gitlab-ci.yml和Makefile是c…...

18kw 机架式液冷负载的使用方法有哪些?

机架式液冷负载是一种高效、节能的散热设备&#xff0c;广泛应用于数据中心、服务器房等场所。它通过将冷却液循环流动&#xff0c;将热量从负载设备带走&#xff0c;实现设备的稳定运行。以下是18kw机架式液冷负载的使用方法&#xff1a; 1. 安装前准备&#xff1a;在安装机架…...

Linux liloconfig命令教程:创建和配置LILO引导加载器(附实例详解和注意事项)

Linux liloconfig命令介绍 liloconfig&#xff08;Linux Loader Configuration&#xff09;是一个用于创建新的lilo.conf文件的简单程序。在创建新的配置文件后&#xff0c;你必须执行/sbin/lilo。liloconfig使用lilo.example.conf文件作为模板。 Linux liloconfig命令适用的…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...