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

JavaScript数组

目录

1. 基本概念

2. 创建数组对象

2.1 字面量创建

2.2 构造函数创建

2.3 静态方法Array.of()

2.4 静态方法Array.from()

2.5 空槽位

3. 常用实例方法

3.1 修改方法

3.11 push 和 unshift

3.12 shift 和 pop

3.13 fill

3.14 cpoyWithin

3.15 reverse

3.16 sort  

 3.17 splice

3.2 非修改方法【1】

3.21 forEach

3.22 map

3.23 filter

3.24 find / findLast

3.25 findIndex / findLastIndex

3.26 some

3.27 every

3.3 非修改方法【2】

3.31 indexOf / lastIndexOf

3.32 reduce / reduceRight

3.33 slice

3.34 flat

3.35 includes

3.36 toSpliced

3.37  join

3.38 contact

4. 其他方法

4.1 Array.isArray

4.2 Math对象方法


1. 基本概念

在JavaScript中,数组(Array)是一种特殊的对象类型,它提供了一种高效的方式来组织和管理数据元素。

JS 数组是可以动态调整大小的,并且可以包含任何数据类型的,如果不需要这个特征,可使用类型化数组。

JS数组不是关联数组,不能使用任意字符串作为索引访问数组元素,必须使用非负整数(或它们各自的字符串形式)作为索引访问。


2. 创建数组对象

JS提供了多种数组创建的方式

2.1 字面量创建

const arr = [1, 2, 3, 'four', true]

2.2 构造函数创建

const arr = new Array(1, 2, 3, 'four', true)
//也可以指定数组的长度(但这种方法不初始化数组元素)
const arr = new Array(5) // 创建一个长度为5的空数组

2.3 静态方法Array.of()

这种方法与构造函数 new Array() 创建数组一样,但如果只传入单个元素,new Array()会将其解释为数组长度,所以只能是非负整数,创建出来的数组也是空数组。而 Array.of()会将其解释为元素内容,即创建一个只有一个元素的数组。总的来说,这与数组字面量相似,但提供了一种函数式的方式来创建数组。

const arr = Array.of(-6)
console.log(arr) //[-6]

2.4 静态方法Array.from()

// 创建一个长度为5的数组,每个元素是其索引的两倍:
const arr = Array.from({ length: 5 }, (v, i) => i * 2)
console.log(arr) //[0, 2, 4, 6, 8]

它常用于将将类数组或可迭代对象(如 Map、Set、String、arguments 、NodeList 等)转换为数组,但这种方式是浅拷贝创建新数组。

Array.from(arrayLike, mapFn, thisArg)
arrayLike:类数组或可迭代对象
mapFn(可选):新数组中的每个元素会执行该回调函数
thisArg(可选):执行 mapFn 函数时 this 的值
----------------------------------------------
处理arguments伪数组:
function foo() {  let args = Array.from(arguments);  console.log(args);  
}  foo(1, 2, 3); // 输出: [1, 2, 3]----------------------------------------------
字符串转数组:
let str = 'hello';  
let strArray = Array.from(str);  
console.log(strArray); // ['h', 'e', 'l', 'l', 'o']
---------------------------------------------
Set 转换为数组
let set = new Set([1, 2, 3, 4, 5]);  
let arrayFromSet = Array.from(set);  console.log(arrayFromSet); // [1, 2, 3, 4, 5]

2.5 空槽位

在JavaScript中,数组的空槽位(也称为“空洞”或“稀疏数组”)是指数组中那些存在但未被赋值的索引位置。这些空槽位在数组的length属性中被计算在内,但实际上并不包含任何值。

那么空槽位主要是如何产生的呢?

JS数组是动态的,同时它的长度与length属性数值是关联的,这意味着,我们可以通过显示的增加或者减少length属性值来扩展或缩减数组:

const arr = [1, 2, 3, 4]
//数组长度,元素个数
console.log(arr.length) //4
//减少length
arr.length -= 3
//删除了数组末尾的3个元素
console.log(arr) //[1]
//增加 length
arr.length += 3
console.log(arr) //[1,空*3]

可以看见,当我们增加length属性值的时候,数组会使用空槽来扩展数组,而不是创建任何新元素—— 甚至不会是 undefined。与之相同的:

使用构造函数传入一个非负整数作为数组长度创建数组时,通过空槽位扩展数组
coconst arr = new Array(5)
console.log(arr)//[空 x5]直接赋值时,也可能产生空槽位
let arr = []
arr[2] = 'three' // 索引0和1现在是空槽位  
console.log(arr)//[空 x2,'three']字面量创建,
let array = [1, 2, 3, 4, , , , , 8]
console.log(array.reverse()) //['8', 空 ×4, 4, 3, 2, 1]

不过,虽然没有创建为undefined数据,但在JS中未被操作或赋值的变量本就代表着undefined

const arr = new Array(10)
console.log(arr[9] === undefined) //true

那么,既然其可以等价于undefined,又为何需要专门提及呢?

因为,不同的数组方法在遇到空槽时可能有不同的行为

通常,较旧的方法(例如 forEach)处理空槽的方式与处理包含 undefined 索引的方式不同。

const arr = [1, undefined, undefined]
arr[5] = 5
console.log(arr) // [1, undefined, undefined, 空 ×2, 5]//forEach并不会把空槽位当作undefined处理,甚至根本不会访问空槽
arr.forEach((e) => console.log(e))
//输出:1 undefined undefined 5

对空槽进行特殊处理的方法包括:concat()、copyWithin()、every()、filter()、flat()、flatMap()、forEach()、indexOf()、lastIndexOf()、map()、reduce()、reduceRight()、reverse()、slice()、some()、sort() 和 splice()。诸如 forEach 之类的迭代方法根本不会访问空槽。其他方法,如 concat、copyWithin 等,在进行复制时会保留空槽,因此最终数组依然是稀疏的。

const arr = [undefined]
arr[3] = 3
console.log(arr) //[undefined, 空 ×2, 3]
console.log(arr.concat(arr)) // [undefined, 空 ×2, 3, undefined, 空 ×2, 3]
console.log(arr.reverse()) //[3, 空 ×2, undefined]

较新的方法(例如 keys)不会对空槽进行特殊处理,而是将它们视为包含 undefined。将空槽合并为 undefined 元素方法有:entries()、fill()、find()、findIndex()、findLast()、findLastIndex()、includes()、join()、keys()、toLocaleString()、values() 和 with(),以及[....array]扩展运算符

const arr = []
arr[3] = 3
console.log(arr) //[ 空 ×3, 3]
console.log(arr.findIndex((e) => e === undefined)) // 0
console.log([...arr]) //[undefined, undefined, undefined, 3]

3. 常用方法

与其它标准内置对象一样,Array也提供了许多方便好用的属性方法来操作其实例,它们主要定义在Array.prototype上。

3.1 修改方法

这些方法会对原数组进行修改

3.11 push 和 unshift

push,向数组末尾添加一个或多个元素,并返回新的数组长度

unshift,向数组开头添加一个或多个元素,并返回新的数组长度

const array = [1, 2, 3]
console.log(array.push(777)) // 4
console.log(array) //  [1, 2, 3, 777]
console.log(array.unshift(666)) // 5
console.log(array) // [666, 1, 2, 3, 777]

3.12 shift 和 pop

pop,删除并返回数组的最后一个元素,如果数组为空,则返回undefined

shift,删除并返回数组的第一个元素,如果数组为空,则返回undefined

const array = [666, 2, 3, 4, 777]
console.log(array.pop()) // 777
console.log(array) // [666, 1, 2, 3]
console.log(array.shift()) // 666
console.log(array) // [2, 3, 4]

3.13 fill

fill,将数组中的元素替换为指定的值,可以指定索引范围,如果传入索引,那么将会默认替换全部元素。同时,fill会访问空槽位,将其视为undefined,所以也可以替换它

const array = new Array(5).fill('null', 2, 4)
console.log(array) //[空 ×2, 'null', 'null', 空]

3.14 cpoyWithin

cpoyWithin,浅拷贝数组的一部分到同一数组中的另一个位置,并返回它,会修改原数组的内容,但不会改变原数组的长度。

copyWithin(target, start, end)
参数描述选值
target序列开始替换的目标位置target < 0,则使用 target + array.length
target < -array.length,则使用 0
target >= array.length,则不会拷贝任何内容
target > start ,则复制只会持续到 array.length 结束,永远不会扩展数组
start可选,要复制的元素序列的起始位置start < 0,则使用 start + array.length
如果省略 start 或 start < -array.length,则默认为 0
如果 start >= array.length,则不会拷贝任何内容
end可选,要复制的元素序列的结束位置,但不包括 end 这个位置的元素end < 0,则实际是 end + array.length
end < -array.length,则使用0
如果省略 end 或 end >= array.length,则默认为 array.length,这将导致直到数组末尾的所有元素都被复制
如果 end 位于 start 之前,则不会拷贝任何内容
let array = [0, 1, 2, 3, 4, 5]
console.log(array) //[0, 1, 2, 3, 4, 5]
// 将索引3-4(不包括4)之间的元素,从索引0开始依次复制
console.log(array.copyWithin(0, 3, 4)) //[3, 1, 2, 3, 4, 5]

 copyWithin不会视空槽位为undefined,但会访问复制它

const array = new Array(5).fill('null', 2, 3)
console.log(array) //[空 ×2, 'null', 空 ×2]
console.log(array.copyWithin(2, 4)) //[ 空 × 5]

copyWithin() 方法的工作原理类似于 C 和 C++ 的 memmove,是一种移动数组数据的高性能方法。序列在一次操作中被复制和粘贴;即使复制和粘贴区域重叠,粘贴的序列也将具有复制值。


3.15 reverse

reverse,就地反转数组中的元素顺序并返回它。与copyWithin一样,会访问空槽位并复制保留它

let array = [1, 2, 3, 4, , , , , 8]
console.log(array.reverse()) //['8', 空 ×4, 4, 3, 2, 1]

3.16 sort  

sort,就地排序数组并返回它。默认情况下,会将数组元素(即使是数字)转换为字符串,然后按照字符串的Unicode码点顺序进行排序。这可能会导致非直观的排序结果

const arr = ['a', 3, '11', 'ab', '2', 1, '15']
arr.sort()
console.log(arr) // 输出:[1, '11', '15', '2', 3, 'a', 'ab']

对于空槽位和undefined,sort会先将它移动到数组的末尾,再进行排序。不过undefined会被放在空槽位之前。

console.log(['a', , , 'b'].sort()) // ['a', 'b', 空x 2]
console.log([, undefined, 'a', 'b'].sort()) // ["a", "b", undefined, 空]

我们也可以使用一个比较函数做参数,来改变默认排序。比较函数接受两个参数,而sort则根据比较的返回值来确定排序顺序。比如:

比较函数接收a,b两个参数,当比较函数的返回值 <  0时,a排在b之前;返回值 > 0,b排在a之前。 返回值 === 0时,a和b的相对位置不变。由此可实现数组的升序和降序排列

const numbers = [40, 100, 1, 5, 25]
numbers.sort((a, b) => b - a)
console.log(numbers) // 输出: [100, 40, 25, 5, 1]

 也可以设置复杂的比较函数,注意,在比较函数,是访问不到空槽位和undefined的

const arr = [, , 1, 2, '3', undefined, null]
arr.sort((a, b) => {if (typeof a == typeof b) return 1 //升序else if (a == null || b == null) return 0else return -1 //降序
})
console.log(arr) // ['3', 1, 2, null, undefined, 空 ×2]

 3.17 splice

splice,就地移除或者替换已存在的元素和/或添加新的元素。会返回一个包含被删除的元素的新数组,如果没有删除元素,则返回一个空数组。

会保留数组的稀疏性,即同 copyWithin,会访问并复制空槽位

splice(start, deleteCount, item1, item2, /* …, */ itemN)
start,从该索引处开始删除元素
deleteCount,删除元素的数量(如果省略,则默认start开始删删完)
item1, item2, /* …, */ itemN:删除后,从start开始插入的元素
-------------------------------------------------------------// 删除
let testArray = [1, 2, 3, 4, 5, 6]
console.log(testArray.splice(2, 3)) //[3, 4, 5]  从2开始删除3个元素
console.log(testArray) // [1, 2, 6]// 插入
let testArray = [1, 2, 3, 4, 5, 6]
console.log(testArray.splice(2, 0, 'a', 'b')) //[]  从2开始删除0个,插入'a', 'b'
console.log(testArray) // [1, 2, 'a', 'b', 3, 4, 5, 6]// 替换
let testArray = [1, 2, 3, 4, 5, 6]
console.log(testArray.splice(2, 1, 'a', 'b')) //[3]  从2开始删除1个,插入'a', 'b'
console.log(testArray) // [1, 2, 'a', 'b', 4, 5, 6]

3.2 非修改方法【1】

1. 这些方法不会对原数组进行修改,

2. 这些方法接收一个回调函数作为参数,且回调函数可接受三个参数,分别是当前访问元素,当前访问元素索引,访问的数组。

3. 这些方法可以使用函数提供的改变this指向的方法来遍历非数组对象中,属性为整数的属性值。

注意这些非数组对象需要有length属性

3.21 forEach

forEach,遍历数组,并对数组的每个元素执行一次给定的函数。

不访问空槽位,无返回值

arr.forEach((item, index, array) => {console.log(item) //item元素当亲元素console.log(index) //index数组索引console.log(array) //array数组本身
})
//通常只用于遍历访问元素
const array = [1, 2, , , , 3, 4]
array.forEach((e) => console.log(e))//1  2  3  4//在非数组对象上使用forEach
const obj = {length: 2,0: '6',1: '6',2: '6',3: '6'
}
// forEach() 方法读取 this 的 length 属性,然后访问每个整数索引。
Array.prototype.forEach.call(obj, (e) => console.log(e)) //6 6

3.22 map

map,创建一个由原数组中的每个元素都调用一次提供的函数后的返回值组成的新数组,并返回。

不访问空槽位,但空槽的索引在返回的数组中仍然为空

const array = [1, 2, , , , 3, 4]
const doubled = array.map((e) => e * 2)
console.log(doubled) // [2, 4, 空 ×3, 6, 8]//因为不会访问空槽位,所以使用map初始化,空槽数组时通常需要借助fill
new Array(n).fill(0).map(()=>{})

由于其回调函数会接受三个参数(元素,索引,数组),由此有一个值得注意的问题,当map与parseInt一起使用时:

const array = ['1', '2', '3', '4']
console.log(array.map(parseInt)) //[1, NaN, NaN, NaN]
console.log(array.map((e) => parseInt(e))) //[1, 2, 3, 4]

当我们直接用parseInt等函数作map的回调函数时,map会将元素,索引,数组等三个参数一起传入回调函数parseInt,而恰好parseInt可以接收两个参数(参数是表达式,解析该表达式的基数)。所以就变成了以index为基数来解析element,并返回解析结果......其结果当然不是一个数字

这一点对于forEach,filter和find,findIndex等方法与其他类似函数结合使用时,一样值得注意


3.23 filter

filter,创建并返回给定数组一部分的浅拷贝,其包含通过所提供函数实现的测试的所有元素

不访问空槽位。

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

3.24 find / findLast

find,返回数组中满足提供的测试函数的第一个元素的值。否则返回undefined

findLast,与find使用相同,但它是反向迭代数组

空槽会被访问的,并被视为 undefined

const array = [, , 5, 12, 8, 130, 44]
console.log(array.find((e) => e > 10)) // 12
console.log(array.find((e) => e === undefined)) //undefined

3.25 findIndex / findLastIndex

findIndex,返回数组中满足提供的测试函数的第一个元素的索引。若没有找到对应元素则返回 -1

findLastIndex,与findIndex使用相同,但它是反向迭代数组

空槽会被访问的,并被视为 undefined

const array = [, , 5, 12, 8, 130, 44]
console.log(array.findIndex((e) => e > 10)) // 3
console.log(array.findIndex((e) => e === undefined)) //0

3.26 some

some,测试数组中是否至少有一个元素通过了由提供的函数实现的测试。返回一个布尔值

不会在空槽上运行它的断言函数

const numbers = [1, 2, 3, 4, 5];  
const hasEven = numbers.some(function(number) {  return number % 2 === 0;  
});  
console.log(hasEven); //  trueconsole.log([1, , 3].some((x) => x === undefined)) // falseconst obj = {length: 3,0: 'a',1: 'b',2: 'c',3: 'd'
}
const r = Array.prototype.some.call(obj, (e) => e == 'a')
console.log(r) //true

3.27 every

every,测试一个数组内的所有元素是否都能通过指定函数的测试 。如果有一个元素不满足条件,就会立即返回false,并且停止遍历数组。

不会在空槽上运行它的断言函数,但对于空数组,不管测试条件如何,都会返回true

const numbers = [2, 4, 6, 8, 10]
const allEven = numbers.every(function (number) {return number % 2 === 0
})
console.log(allEven) //  trueconsole.log([].every(() => {})) // true
//不会在空槽上运行假言判断,故相当于只有undefined一个元素
console.log([, , , undefined].every((x) => x === undefined)) // trueconst obj = {length: 3,0: 'a',1: 'b',2: 'c',3: 'd'
}
const r = Array.prototype.every.call(obj, (e) => e == 'a')
console.log(r) //false


3.3 非修改方法【2】

1. 这些方法不会对原数组进行修改,

3.31 indexOf / lastIndexOf

indexOf,返回数组中第一次出现给定元素的下标(可指定开始索引),如果不存在则返回 -1。

lastIndexOf,与indexOf使用相同,但它是反向迭代数组

不会访问空槽

let fruits = ['Apple', 'Banana', 'Mango', 'Orange', 'Banana']
console.log(fruits.indexOf('Banana')) //  1
console.log(fruits.indexOf('Banana', 2)) //  4,因为从索引 2 开始查找console.log(fruits.lastIndexOf('Banana')) //  4
console.log(fruits.lastIndexOf('Banana', 2)) //  1,因为从索引 2 开始向前搜

3.32 reduce / reduceRight

reduce,对数组中的每个元素按序执行一个提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。       

会跳过空槽,但不会跳过 undefined 

reduceRight,与reduce使用相同,但它是反向迭代数组

arr.reduce(reducer(),initialValue)
reducer:回调函数可接收四个参数:acc, cur, index(可选), array(可选)acc:累加器累加回调的返回值,它是上一次调用回调时返回的累积值,或initialValuecur:正在处理的元素index(可选):正在处理元素的索引。如果提供initialValue,起始index为0,否则为1array(可选):调用reduce的数组initialValue(可选):作为第一次调用reducer时第一个参数的值
-------------------------------------------------------------
const array = [1, 2, 3, 4]
const reducer = (acc, cur) => acc + cur
// 1 + 2 + 3 + 4
console.log(array.reduce(reducer)) // 10
// 初始值为 100
console.log(array.reduce(reducer, 100)) //110
-------------------------------------------------------------
const array = [[0, 1],[2, 3],[4, 5]]
const flatten = (acc, cur) => acc.concat(cur)
console.log(array.reduce(flatten, [])) //[0, 1, 2, 3, 4, 5]
//  reduceRight,反向迭代数组
console.log(array.reduceRight(flatten, [])) // [4, 5, 2, 3, 0, 1]

3.33 slice

slice,返回一个由 起始索引start 和到 结束索引 end (不包括 end)的浅拷贝新数组

它接受负整数作为索引,具体选值情况和 cpoyWithin 方法的相似

不会跳过空槽,如果源数组是稀疏数组(有空槽的数组),返回的数组也会是稀疏数组

和 非修改方法【1】中的方法一样,可以改变this指向来提取伪数组的元素

let sliceArr = [1, 2, 3, 4, 5]
let sliced1 = sliceArr.slice(0, 3) //[1,2, 3]
let sliced2 = sliceArr.slice(1) //[2, 3, 4, 5]
let sliced4 = sliceArr.slice(-4, -1) //[2, 3, 4]
let sliced3 = sliceArr.slice(-4) //[2, 3, 4, 5]const obj = {length: 3,0: 'a',1: 'b',2: 'c',3: 'd'
}
const r = Array.prototype.slice.call(obj, 1, 3)
console.log(r) // ['b', 'c']

3.34 flat

flat,根据指定深度递归地将所有子数组元素拼接到新的数组中并返回。

如果传递给 flat 的参数是 Infinity,则无论多少层嵌套的数组都会被扁平化为一维数组。

如果扁平化的层数大于实际嵌套的层数,当扁平化的层数大于实际嵌套的层数时,flat 方法会在完全扁平化数组后立即停止并返回结果而不会继续无意义地调用扁平化函数

该方法会删除数组中的空槽

const arr = [1, , [2, , [3, [4, , , ,]]]]
console.log(arr.flat()) //[1, 2, [3, [4,空x3]]]
console.log(arr.flat(2)) //[1, 2, 3, [4, 空 ×3]]
console.log(arr.flat(Infinity)) //[1, 2, 3, 4]

3.35 includes

includes,判断一个数组是否包含一个指定的值

将稀疏数组中的空位槽视为undefined

arr.includes(searchElement, fromIndex)
searchElement:检索的元素
fromIndex:检索起始索引,默认为 0。接受负索引
-------------------------------------------------
const arr = [1, 1, 2, 3, 4, 4, 3];
console.log(arr.includes(2));//trueconsole.log(arr.includes(2, 3));      //falseconsole.log([1, , 3].includes(undefined)); // true

3.36 toSpliced

toSpliced,是splice的复制版本,区别在于它不会返回删除的元素,而是返回经过删除、插入操作后的一个新数组,而不会更改原数组。

且,它会删除空槽位,并将其替换为undefined

// 删除
let testArray = [1, 2, 3, 4, 5, 6, , ,]
console.log(testArray.toSpliced(2, 3)) //[1, 2, 6, undefined, undefined]
// 插入
console.log(testArray.toSpliced(2, 0, 'a', 'b'))
//[1, 2, 'a', 'b', 3, 4, 5, 6, undefined, undefined]
// 替换
console.log(testArray.toSpliced(2, 1, 'a', 'b'))
//[1, 2, 'a', 'b', 4, 5, 6, undefined, undefined]
//原数组没改变
console.log(testArray) // [1, 2, 3, 4, 5, 6,空 ×2]]

3.37  join

join,将数组的元素连接成一个字符串,以指定的分隔符进行分隔。默认的分隔符是逗号。

将空槽视为 undefined,并产生额外的分隔符

和 非修改方法【1】中的方法一样,可以改变this指向来连接伪数组的元素成为字符串

const joinArr = [1,2,3,4,5]
console.log(joinArr.join());  //'1,2,3,4,5'
console.log(joinArr.join('|')) //1|2|3|4|5console.log([, , 666, undefined, undefined].join('|')) //||666||const obj = {length: 3,0: 'a',1: 'b',2: 'c',3: 'd'
}
const r = Array.prototype.join.call(obj, '')
console.log(r) // abc

3.38 contact

concat,合并两个或多个数组。而是返回被合并数组的一个新数组。

如果任何源数组是稀疏的,则结果数组也将是稀疏的

var array1 = ['a', 'b', 'c']
var array2 = ['d', 'e', 'f']
var array3 = array1.concat(array2)
console.log(array3)
// 输出: ["a", "b", "c", "d", "e", "f"]
console.log(array1)
// 输出: ["a", "b", "c"] (原数组不会被修改)

4. 其他方法

4.1 Array.isArray

该方法用于确定一个值是否是一个数组,对于检测数组类型非常有用。

const testArray= []
console.log(Array.isArray(testArray)) //true

4.2 Math对象方法

虽然Math对象的方法不是直接用于数组操作的,但你可以使用它们来处理数组中的数值

  • Math.max(...array) 和 Math.min(...array):使用扩展运算符(...)将数组元素作为单独的参数传递给Math.max()Math.min(),以找到数组中的最大值和最小值。
  • Math.floor()Math.ceil()Math.round()等:用于对数组中的数值进行四舍五入、向下取整或向上取整操作。
let numbers = [3.14, 4.99, -1.56, -2.45]
console.log(Math.max(...numbers)) //4.99
console.log(Math.min(...numbers)) //-2.45
console.log(numbers.map(Math.floor)) //  [3, 4, -2, -3]
console.log(numbers.map(Math.ceil)) //  [4, 5, -1, -2]
console.log(numbers.map(Math.round)) //  [3, 5, -2, -2]

 如有不足或遗漏,烦请私信或评论留言😊

相关文章:

JavaScript数组

目录 1. 基本概念 2. 创建数组对象 2.1 字面量创建 2.2 构造函数创建 2.3 静态方法Array.of() 2.4 静态方法Array.from() 2.5 空槽位 3. 常用实例方法 3.1 修改方法 3.11 push 和 unshift 3.12 shift 和 pop 3.13 fill 3.14 cpoyWithin 3.15 reverse 3.16 sort …...

产品经理如何使用项目管理软件推进复杂项目按时上线

前言 相信很多产品同学或多或少都有过这样的经历&#xff1a;平时没有听到任何项目延期风险&#xff0c;但到了计划时间却迟迟无法提测……评审时没有任何argue&#xff0c;提测后发现开发的功能不是自己想要的……费劲九牛二虎之力终于让项目上线了&#xff0c;然而发现成果达…...

构建基于 DCGM-Exporter, Node exporter,PROMETHEUS 和 GRAFANA 构建算力监控系统

目录 引言工具作用概述DCGM-ExporterNode exporterPROMETHEUSGRAFANA小结 部署单容器DCGM-ExporterNode exporterPROMETHEUSGRAFANANode exporterDCGM-Exporter 多容器Node exporterDCGM-ExporterDocker Compose 参考 引言 本文的是适用对象&#xff0c;是希望通过完全基于Doc…...

第13章 聚合函数

一、聚合函数介绍 实际上 SQL 函数还有一类&#xff0c;叫做聚合&#xff08;或聚集、分组&#xff09;函数&#xff0c;它是对一组数据进行汇总的函数&#xff0c;输入的是一组数据的集合&#xff0c;输出的是单个值。&#xff08;可以是一个字段的数据&#xff0c;也可以是通…...

【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】试卷(4)

前言 大家好吖&#xff0c;欢迎来到 YY 滴计算机网络 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 本博客主要内容&#xff0c;收纳了一部门基本的计算机网络题目&#xff0c;供yy应对期中考试复习。大家可以参考 本章是去答案版本。带答案的版本在下…...

C# 中 LibraryImport 和 DllImport有什么不同

libraryimport 和 dllimport 是两个与动态链接库&#xff08;DLL&#xff09;相关的术语&#xff0c;它们在不同的编程语言和上下文中有不同的含义和用途。 在 C# 中&#xff0c;DllImportAttribute 是一个特性&#xff0c;用于指示一个方法声明是作为对非托管 DLL 中函数的 P…...

PDF编辑工具Adobe Acrobat DC 2023安装教程(附安装包)

Adobe Acrobat DC 2023 是 Adobe 公司推出的一款功能强大的 PDF 文档处理软件。它不仅支持创建、编辑和签署 PDF 文件&#xff0c;还提供了丰富的工具来管理和优化这些文件。以下是 Acrobat DC 2023 的一些主要特点&#xff1a; 1.PDF 创建与编辑&#xff1a;用户可以直接从多…...

系动词、表语和主语补足语

系动词、表语和主语补足语 1. The classification of English verbs (英语动词的分类)2. 系动词 (连系动词)2.1. Grammatical function (语法功能) 3. 表语和主语补足语3.1. Predicative expression (表语)3.2. Subject complement (主语补足语) 4. Copula-like words4.1. List…...

【网络安全 | 并发问题】Nginx重试机制与幂等性问题分析

未经许可,不得转载。 文章目录 业务背景Nginx的错误重试机制proxy_next_upstream指令配置重试500状态码非幂等请求的重试问题幂等性和非幂等性请求non_idempotent选项的使用解决方案业务背景 在现代互联网应用中,高可用性(HA)是确保系统稳定性的关键要求之一。为了应对服务…...

Java 详解 接口

文章目录 一、概述1.1、何为接口1.2、接口的定义 二、特点2.1、接口的成员变量2.2、接口的成员方法2.3、接口中不可以含有构造器和代码块2.4、接口不可以实例化对象2.5、接口和类之间使用implements关键字进行连接2.6、当类在重写接口中的方法时&#xff0c;不可以使用默认的访…...

wordpress搬家迁移后怎么修改数据库用户名

在WordPress中修改数据库用户名&#xff0c;你需要更新WordPress的配置文件wp-config.php。以下是步骤和示例代码&#xff1a; 使用FTP客户端或文件管理器登录到你的网站的主机账户。 找到wp-config.php文件&#xff0c;它通常位于WordPress安装的根目录中。 打开wp-config.…...

C# 用于将一个DataTable转换为Users对象的列表

1&#xff1a;第一种例子&#xff1a; /// <summary> /// 用户名循环赋值 /// </summary> /// <param name"dt"></param> /// <returns></returns> public List<Users> FenPeiFillModelUsers(DataTable dt) { …...

Spark中的shuffle

Shuffle的本质基于磁盘划分来解决分布式大数据量的全局分组、全局排序、重新分区【增大】的问题。 1、Spark的Shuffle设计 Spark Shuffle过程也叫作宽依赖过程&#xff0c;Spark不完全依赖于内存计算&#xff0c;面临以上问题时&#xff0c;也需要Shuffle过程。 2、Spark中哪…...

网络安全SQL初步注入2

六.报错注入 mysql函数 updatexml(1,xpath语法,0) xpath语法常用concat拼接 例如: concat(07e,(查询语句),07e) select table_name from information_schema.tables limit 0,1 七.宽字节注入(如果后台数据库的编码为GBK) url编码:为了防止提交的数据和url中的一些有特殊意…...

使用Go语言编写一个简单的NTP服务器

NTP服务介绍 NTP服务器【Network Time Protocol&#xff08;NTP&#xff09;】是用来使计算机时间同步化的一种协议。 应用场景说明 为了确保封闭局域网内多个服务器的时间同步&#xff0c;我们计划部署一个网络时间同步服务器&#xff08;NTP服务器&#xff09;。这一角色将…...

注意力机制篇 | YOLO11改进 | 即插即用的高效多尺度注意力模块EMA

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。与传统的注意力机制相比&#xff0c;多尺度注意力机制引入了多个尺度的注意力权重&#xff0c;让模型能够更好地理解和处理复杂数据。这种机制通过在不同尺度上捕捉输入数据的特征&#xff0c;让模型同时关注局部细节和全局…...

昇思大模型平台打卡体验活动:项目3基于MindSpore的GPT2文本摘要

昇思大模型平台打卡体验活动&#xff1a;项目3基于MindSpore的GPT2文本摘要 1. 环境设置 本项目可以沿用前两个项目的相关环境设置。首先&#xff0c;登陆昇思大模型平台&#xff0c;并进入对应的开发环境&#xff1a; https://xihe.mindspore.cn/my/clouddev 接着&#xff0…...

web——[GXYCTF2019]Ping Ping Ping1——过滤和绕过

0x00 考点 0、命令联合执行 ; 前面的执行完执行后面的 | 管道符&#xff0c;上一条命令的输出&#xff0c;作为下一条命令的参数&#xff08;显示后面的执行结果&#xff09; || 当前面的执行出错时&#xff08;为假&#xff09;执行后面的 & 将任…...

婚礼纪 9.5.57 | 解锁plus权益的全能结婚助手,一键生成结婚请柬

婚礼纪是一款结婚服务全能助手&#xff0c;深受9000万新人信赖的一站式结婚服务平台。解锁plus权益后&#xff0c;用户可以享受部分VIP会员功能。应用提供了丰富的结婚筹备工具和服务&#xff0c;包括一键生成结婚请柬、婚礼策划、婚纱摄影、婚宴预订等。婚礼纪旨在为新人提供全…...

M1M2 MAC安装windows11 虚拟机的全过程

M1/M2 MAC安装windows11 虚拟机的全过程 这两天折腾了一下windows11 arm架构的虚拟机&#xff0c;将途中遇到的坑总结一下。 1、虚拟机软件&#xff1a;vmware fusion 13.6 或者 parallel 19 &#xff1f; 结论是&#xff1a;用parellel 19。 这两个软件都安装过&#xff0…...

监控架构-Prometheus-普罗米修斯

目录 1. Prometheus概述 2. Prometheus vs Zabbix 3. Prometheus极速上手指南 3.1 时间同步 3.2 部署Prometheus 3.3 启动Prometheus 3.4 Prometheus监控架构 3.5 补充 配置页面 简单过滤 查看数据 查看图形 http://prometheus.oldboylinux.cn:9090/metrics显示…...

Kylin Server V10 下自动安装并配置Kafka

Kafka是一个分布式的、分区的、多副本的消息发布-订阅系统&#xff0c;它提供了类似于JMS的特性&#xff0c;但在设计上完全不同&#xff0c;它具有消息持久化、高吞吐、分布式、多客户端支持、实时等特性&#xff0c;适用于离线和在线的消息消费&#xff0c;如常规的消息收集、…...

windows环境下cmd窗口打开就进入到对应目录,一般人都不知道~

前言 很久以前&#xff0c;我还在上一家公司的时候&#xff0c;有一次我看到我同事打开cmd窗口的方式&#xff0c;瞬间把我惊呆了。原来他打开cmd窗口的方式&#xff0c;不是一般的在开始里面输入cmd&#xff0c;然后打开cmd窗口。而是另外一种方式。 我这个同事是个技术控&a…...

企微SCRM价格解析及其性价比分析

内容概要 在如今的数字化时代&#xff0c;企业对于客户关系管理的需求日益增长&#xff0c;而企微SCRM&#xff08;Social Customer Relationship Management&#xff09;作为一款新兴的客户管理工具&#xff0c;正好满足了这一需求。本文旨在为大家深入解析企微SCRM的价格体系…...

【SpringMVC】记录一次Bug——mvc:resources设置静态资源不过滤导致WEB-INF下的资源无法访问

SpringMVC 记录一次bug 其实都是小毛病&#xff0c;但是为了以后再出毛病&#xff0c;记录一下&#xff1a; mvc:resources设置静态资源不过滤问题 SpringMVC中配置的核心Servlet——DispatcherServlet&#xff0c;为了可以拦截到所有的请求&#xff08;JSP页面除外&#xf…...

【React】React 生命周期完全指南

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 React 生命周期完全指南一、生命周期概述二、生命周期的三个阶段2.1 挂载阶段&a…...

【NLP】使用 SpaCy、ollama 创建用于命名实体识别的合成数据集

命名实体识别 (NER) 是自然语言处理 (NLP) 中的一项重要任务&#xff0c;用于自动识别和分类文本中的实体&#xff0c;例如人物、位置、组织等。尽管它很重要&#xff0c;但手动注释大型数据集以进行 NER 既耗时又费钱。受本文 ( https://huggingface.co/blog/synthetic-data-s…...

【C++练习】二进制到十进制的转换器

题目&#xff1a;二进制到十进制的转换器 描述 编写一个程序&#xff0c;将用户输入的8位二进制数转换成对应的十进制数并输出。如果用户输入的二进制数不是8位&#xff0c;则程序应提示用户输入无效&#xff0c;并终止运行。 要求 程序应首先提示用户输入一个8位二进制数。…...

Vue功能菜单的异步加载、动态渲染

实际的Vue应用中&#xff0c;常常需要提供功能菜单&#xff0c;例如&#xff1a;文件下载、用户注册、数据采集、信息查询等等。每个功能菜单项&#xff0c;对应某个.vue组件。下面的代码&#xff0c;提供了一种独特的异步加载、动态渲染功能菜单的构建方法&#xff1a; <s…...

云技术基础学习(一)

内容预览 ≧∀≦ゞ 声明导语云技术历史 云服务概述云服务商与部署模式1. 公有云服务商2. 私有云部署3. 混合云模式 云服务分类1. 基础设施即服务&#xff08;IaaS&#xff09;2. 平台即服务&#xff08;PaaS&#xff09;3. 软件即服务&#xff08;SaaS&#xff09; 云架构云架构…...