JavaScript中的几种常用循环方式对比

JavaScript中的几种循环方式

  • 1. for 循环
    • 1.1 使用方式
    • 1.2 不支持遍历对象(但不会报错)
  • 2. for-of 循环
    • 2.1 使用方式
    • 2.2 for-of 和 for 循环比较(不允许修改原数组元素)
      • 2.2.1 相同点
        • 2.2.1.2 都可以遍历数组,但不允许遍历对象
        • 2.2.1.2 都支持 break 和 continue 结束整个/单次循环
      • 2.2.2 不同点
        • 2.2.2.1 for-of 强行遍历对象,会报错
        • 2.2.2.2 不允许直接修改数组内容
        • 2.2.2.3 允许修改数组元素的属性(如果元素是对象的话)
  • 3. for-in 循环(支持并且建议用来遍历对象,而非数组)
    • 3.1 使用方式
      • 3.1.1 遍历对象
      • 3.1.2 遍历数组
    • 3.2 for-in 和 for 循环比较
      • 3.2.1 相同点
        • 3.2.1.1 都可以遍历数组
        • 3.2.1.2 都支持 break 和 continue 结束整个/单次循环,但是for-in还支持对对象进行操作
      • 3.2.2 不同点
        • 3.2.2.1 可以遍历对象
        • 3.2.2.1 不建议用来遍历数组,key值是string类型
  • 4. forEach 循环(Array.prototype 数组原型上的方法)
    • 4.1 使用方式
    • 4.2 和 for 循环比较
      • 4.2.1 相同点:都可以遍历数组,并且直接通过数组下标改变元素值
      • 4.2.2 不同点
        • 4.2.2.1 无法直接通过第一个参数修改元素值
        • 4.2.2.2 数组的元素是对象的话,可以直接修改对象属性的方式
        • 4.2.2.3 不能遍历对象,强行调用会报错
        • 4.2..2.4 不能使用 break 和 continue,会导致语法错误
  • 5. map 循环(Array.prototype 数组原型上的方法)
    • 5.1 使用方式:遍历原数组,通过映射生成新数组(元素数量不变,值变化)
    • 5.2 和 forEach 循环进行比较
      • 5.2.1 相同点
        • 5.2.1.1 都有3个参数,都是(currentValue, index , arr)
        • 5.2.1.2 都无法直接通过currentValue修改原数组
        • 5.2.1.3 都可以通过 index 配合 arr(或者原数组)直接修改元素值
      • 5.2.2 不同点
        • 5.2.2.1 map 循环会返回一个新的数组,forEach不会
  • 6. filter 循环(Array.prototype 数组原型上的方法)
    • 6.1 使用方式:遍历原数组,筛选元素,组成新的数组(元素个数变化,值不变)
    • 6.2 和 map 循环进行比较
      • 6.2.1 相同点
        • 6.2.1.1 都有3个参数,都是(currentValue, index , arr)
      • 6.2.2 不同点
        • 6.2.2.1 功能侧重不同,filter筛选元素(新数组元素个数变化,值不变),map是映射元素(新数组元素个数不变,值变化)
  • 7. some 循环(Array.prototype 数组原型上的方法)
    • 7.1 使用方式:遍历数组,只要有一个元素符合条件,返回true,否则返回false
    • 7.2 和 forEach、map 、filter 循环进行比较
      • 7.2.1 相同点
        • 7.2.1.1 都有3个参数,都是(currentValue, index , arr)
        • 7.2.1.2 都无法直接通过currentValue修改原数组
        • 7.2.1.3 都可以通过 index 配合 arr(或者原数组)直接修改元素值
      • 7.2.2 不同点
        • 7.2.2.1 功能侧重不同:some循环是寻找数组中是否有元素符合条件
  • 8. every 循环(Array.prototype 数组原型上的方法)
    • 8.1 使用方式:遍历数组,只有当所有元素都符合条件返回true,否则返回false
    • 8.2 和 some 循环比较(大家都懂,就不说了吧)
  • 9. reduce 循环(Array.prototype 数组原型上的方法)
    • 9.1 使用方式
      • 9.1.1 遍历数组,作为累加器使用
      • 9.1.2 支持传入初始值(例子:去重函数)
    • 9.2 和其他数组原型链循环方式比较
      • 9.2.1 相同点
        • 9.2.1.1 都有当前元素、当前索引、数组 3个参数
      • 9.2.2 不同点
        • 9.2.2.1 作为累加器,增加了 total 和 initialValue 两个参数
        • 9.2.2.1 可以函数中处理新数组的元素个数和元素值(基于原数组创建一个元素个数和值都有变化的新数组时,非常好用)
  • 10. reduceRight 循环(Array.prototype 数组原型上的方法)
    • 10.1 使用方式:和reduce功能一样,只是遍历顺序相反
  • 11. while 循环
    • 11.1 使用方式
    • 11.2 和其他循环比较
      • 11.2.1 相同点
        • 11.2.1.1 都可以遍历数组
      • 11.2.2 不同点
        • 11.2.2.1 可以自定义遍历条件,更加灵活
        • 11.2.2.2 可以随意对数组进行处理
        • 11.2.2.3 作为遍历条件的参数大多数情况下会成为全局变量,需要注意命名,避免重名影响其他变量
  • 12. do while 循环
    • 12.1 使用方式
    • 12.2 和 while 循环比较 :无论如何都会执行第一次循环
  • 13. 综合上述
    • 13.1 遍历数组,for 循环功能最完善
    • 13.2 遍历对象,使用 for-in 循环(不建议遍历数组)
    • 13.3 遍历对象数组,需要break或者continue时,可使用 for-of 循环
    • 13.4 遍历对象数组,不需要break或者continue时,使用 array.forEach 循环
    • 13.5 筛选元素,使用array.filter 循环
    • 13.6 修改元素生成新数组,使用 array.map 循环
    • 13.7 累加数值,或者处理元素个数和内容时,使用 array.reduce 循环

1. for 循环

for循环是数组循环中最简单,也是最常用的循环方式。

1.1 使用方式

// 方式一:for循环
let arr1 = ['red','yellow','blue']
for(let i = 0; i < arr1.length; i++) {console.log(arr1[i])
}

在这里插入图片描述

1.2 不支持遍历对象(但不会报错)

注意:for循环对对象不生效,但是如果强行使用for循环对对象进行遍历,也不会报错,因为根本不会进入循环,相当于一段垃圾代码。

2. for-of 循环

2.1 使用方式

在这里插入图片描述
可以看到,如果数组循环中只使用到了数值(没使用索引),VSCode会建议我们使用更简单的循环方式for-of

// 方式二:for of 循环 
let arr1 = ['red','yellow','blue']
for(const element of arr1) {console.log(element)
}

在这里插入图片描述

2.2 for-of 和 for 循环比较(不允许修改原数组元素)

2.2.1 相同点

2.2.1.2 都可以遍历数组,但不允许遍历对象

2.2.1.2 都支持 break 和 continue 结束整个/单次循环

(1)break

let arr1 = ['red','yellow','blue']
for(let element of arr1) {console.log('element', element)if(element === 'yellow') {break}
}
console.log('arr1', arr1)

在这里插入图片描述

(2)continue

let arr1 = ['red','yellow','blue']
for(let element of arr1) {console.log('element', element)if(element === 'yellow') {continue}console.log('continue', element)
}
console.log('arr1', arr1)

在这里插入图片描述

2.2.2 不同点

2.2.2.1 for-of 强行遍历对象,会报错

for-of强行遍历对象,会报错

let obj1 = {name: 'Sheldon',age: 26,sex: 'male'
}
for(const element of obj1) {console.log(element)
}

在这里插入图片描述

2.2.2.2 不允许直接修改数组内容

for(let element of arr1) {element = 'test'console.log('element', element)
}
console.log('arr1', arr1)

在这里插入图片描述

可以看到,即使在for-of修改了元素的值,原数组的值仍然不受任何影响。可以理解为,for-of循环的element只是复制了一份数组的元素提供使用。

2.2.2.3 允许修改数组元素的属性(如果元素是对象的话)

let objArr = [{name: 'Sheldon',age: 26,sex: 'male'}, {name: 'Jane',age: 20,sex: 'female'}, {name: 'Mick',age: 24,sex: 'male'},
]
for(let element of objArr) {element.name = 'me'console.log('element', element)
}
console.log('objArr', objArr)

在这里插入图片描述

3. for-in 循环(支持并且建议用来遍历对象,而非数组)

3.1 使用方式

3.1.1 遍历对象

let obj1 = {name: 'Sheldon',age: 26,sex: 'male'
}
// 方式三:for-in 循环
for (const key in obj1) {console.log(key, obj1[key])
}

在这里插入图片描述

3.1.2 遍历数组

let arr1 = ['red','yellow','blue']
for (const key in arr1) {console.log(key, arr1[key])
}

在这里插入图片描述

3.2 for-in 和 for 循环比较

3.2.1 相同点

3.2.1.1 都可以遍历数组

3.2.1.2 都支持 break 和 continue 结束整个/单次循环,但是for-in还支持对对象进行操作

(1)break

let obj1 = {name: 'Sheldon',age: 26,sex: 'male'
}
for (const key in obj1) {console.log(key, obj1[key])if(key === 'age') {break}
}

在这里插入图片描述
(2)continue

let obj1 = {name: 'Sheldon',age: 26,sex: 'male'
}
for (const key in obj1) {console.log(key, obj1[key])if(key === 'age') {continue}console.log('continue', key)
}

在这里插入图片描述

3.2.2 不同点

3.2.2.1 可以遍历对象

3.2.2.1 不建议用来遍历数组,key值是string类型

虽然for-in也可以遍历数组,但是从遍历的结果可以看出,其实for-in是把数组当成对象去遍历的。

通常谷歌浏览器在控制台输出数字时,是蓝色的。而在输出字符串时,是绿色的。从这一点也能佐证。

for (const key in arr1) {console.log(key, arr1[key], typeof key)
}

在这里插入图片描述
因此,不建议遍历数组使用for-in,或者在需要使用key时,包一层Number(key),避免一些特殊判断时报错。

4. forEach 循环(Array.prototype 数组原型上的方法)

在这里插入图片描述
在这里插入图片描述

4.1 使用方式

let arr1 = ['red','yellow','blue']
// 方式四:forEach 循环
arr1.forEach((val, index, arr) => {console.log(val, index, arr)
});

在这里插入图片描述

4.2 和 for 循环比较

4.2.1 相同点:都可以遍历数组,并且直接通过数组下标改变元素值

let objArr = [
{name: 'Sheldon',age: 26,sex: 'male'}, {name: 'Jane',age: 20,sex: 'female'}, {name: 'Mick',age: 24,sex: 'male'},
]
objArr.forEach((item, index, arr) => {objArr[index] = 'Bruce'
});
console.log('objArr', objArr)

在这里插入图片描述

4.2.2 不同点

4.2.2.1 无法直接通过第一个参数修改元素值

第一个参数和第三个参数只是复制元素和数组,并非本身。所以直接修改,不会影响数组本身。

let arr1 = ['red','yellow','blue']
arr1.forEach((val, index, arr) => {console.log(val)val = 'green'arr = []
});
console.log('arr1', arr1)

在这里插入图片描述

4.2.2.2 数组的元素是对象的话,可以直接修改对象属性的方式

不过如果元素值是对象的话,可以通过修改对象属性的方式修改(因为复制的是元素是该对象的引用,相当于复制了房间号,房间里的东西可以改变,但是房间号仍然不变)。

let objArr = [
{name: 'Sheldon',age: 26,sex: 'male'}, {name: 'Jane',age: 20,sex: 'female'}, {name: 'Mick',age: 24,sex: 'male'},
]
objArr.forEach((item, index, arr) => {item.name = 'Bruce'
});
console.log('objArr', objArr)

在这里插入图片描述

4.2.2.3 不能遍历对象,强行调用会报错

let obj1 = {name: 'Sheldon',age: 26,sex: 'male'
}
obj1.forEach((item, index, arr) => {console.log(item, index, arr)
});

在这里插入图片描述

4.2…2.4 不能使用 break 和 continue,会导致语法错误

在这里插入图片描述
在这里插入图片描述

5. map 循环(Array.prototype 数组原型上的方法)

5.1 使用方式:遍历原数组,通过映射生成新数组(元素数量不变,值变化)

let arr1 = ['red','yellow','blue']
arr1.map((item, index, arr) => {console.log(item, index, arr)
})

在这里插入图片描述

5.2 和 forEach 循环进行比较

因为都是Array原型链上的方法,所以直接与 forEach 循环方式进行比较更为合适。

5.2.1 相同点

5.2.1.1 都有3个参数,都是(currentValue, index , arr)

5.2.1.2 都无法直接通过currentValue修改原数组

5.2.1.3 都可以通过 index 配合 arr(或者原数组)直接修改元素值

5.2.2 不同点

5.2.2.1 map 循环会返回一个新的数组,forEach不会

let objArr = [{name: 'Sheldon',age: 26,sex: 'male'}, {name: 'Jane',age: 20,sex: 'female'}, {name: 'Mick',age: 24,sex: 'male'},
]
let nameArr = objArr.map(item => {return item.name
})
console.log('nameArr:', nameArr)let ageArr = objArr.map(item => item.age + 1
)
console.log('ageArr:', ageArr)console.log('objArr:', objArr)

在这里插入图片描述

虽然使用 .map 方法可以帮助我们基于原数组快速生成一个新的数组,但是仍然要注意,当原数组元素是对象时,仍然会有修改原数组的风险。

let objArr = [{name: 'Sheldon',age: 26,sex: 'male'}, {name: 'Jane',age: 20,sex: 'female'}, {name: 'Mick',age: 24,sex: 'male'},
]
let ageArr = objArr.map(item => item.age = item.age + 1
)
console.log('ageArr:', ageArr)console.log('objArr:', objArr)

在这里插入图片描述
建议使用.map方法生成新数组时,不要对原数组元素进行新的赋值操作,

let ageArr = objArr.map(item => item.age + 1
)

等价于

let ageArr = objArr.map(item => {return item.age + 1
})

建议初学者不要使用省略写法,避免理解上的误差。

6. filter 循环(Array.prototype 数组原型上的方法)

6.1 使用方式:遍历原数组,筛选元素,组成新的数组(元素个数变化,值不变)

let objArr = [{name: 'Sheldon',age: 26,sex: 'male'}, {name: 'Jane',age: 20,sex: 'female'}, {name: 'Mick',age: 24,sex: 'male'},
]
// 方式五: filter 循环
let newArr = objArr.filter((item, index, arr) => {return item.age > 20
})
console.log('newArr', newArr)

在这里插入图片描述

6.2 和 map 循环进行比较

6.2.1 相同点

6.2.1.1 都有3个参数,都是(currentValue, index , arr)

6.2.2 不同点

6.2.2.1 功能侧重不同,filter筛选元素(新数组元素个数变化,值不变),map是映射元素(新数组元素个数不变,值变化)

(1)filter是在通过条件筛选出原数组的部分元素,复制到新数组中,因此新数组的元素个数小于等于原数组,并且返回的元素值不变。
(2)map是遍历原数组,取每个元素或者元素中的属性,进行或者不进行处理,获得新的元素,之后再一一填充到新数组。因此新数组的元素个数等于原数组,但是返回的元素值通常会发生变化。

7. some 循环(Array.prototype 数组原型上的方法)

7.1 使用方式:遍历数组,只要有一个元素符合条件,返回true,否则返回false

let objArr = [{name: 'Sheldon',age: 26,sex: 'male'}, {name: 'Jane',age: 20,sex: 'female'}, {name: 'Mick',age: 24,sex: 'male'},
]
// 方式七:some 循环
let checkAge = objArr.some((item, index, arr) => {return item.age > 26
})
console.log('checkAge', checkAge)let checkName = objArr.some((item, index, arr) => {return item.name === 'Mick'
})
console.log('checkName', checkName)

在这里插入图片描述

7.2 和 forEach、map 、filter 循环进行比较

7.2.1 相同点

7.2.1.1 都有3个参数,都是(currentValue, index , arr)

7.2.1.2 都无法直接通过currentValue修改原数组

7.2.1.3 都可以通过 index 配合 arr(或者原数组)直接修改元素值

7.2.2 不同点

7.2.2.1 功能侧重不同:some循环是寻找数组中是否有元素符合条件

8. every 循环(Array.prototype 数组原型上的方法)

8.1 使用方式:遍历数组,只有当所有元素都符合条件返回true,否则返回false

et objArr = [{name: 'Sheldon',age: 26,sex: 'male'}, {name: 'Jane',age: 20,sex: 'female'}, {name: 'Mick',age: 24,sex: 'male'},
]
// 方式八:every循环
let allAdult = objArr.every((item, index, arr) => {return item.age >= 20
})
console.log('allAdult', allAdult)let allMale = objArr.every((item, index, arr) => {return item.sex === 'male'
})
console.log('allMale', allMale)

在这里插入图片描述

8.2 和 some 循环比较(大家都懂,就不说了吧)

9. reduce 循环(Array.prototype 数组原型上的方法)

9.1 使用方式

9.1.1 遍历数组,作为累加器使用

// 方式九:reduce循环
let numArr = [11, 13, 15, 17, 19]
let totalNum = numArr.reduce((total, item, index , arr) => {console.log(total, item, index, arr)return total + item
})
console.log('totalNum', totalNum)

在这里插入图片描述
reduce方法一共有4个参数,total:初始值,item:当前元素,index:当前索引,arr:遍历的数组
可以看到,我们第一次累加时,初始值为第一个元素,当前元素和索引是第二个。因此在处理时,如果元素是对象,注意累加时记得处理。

9.1.2 支持传入初始值(例子:去重函数)

array.reduce(function(total, item, index, arr), initialValue)
let repeatArr = [{ id: 1, name: 'Tom'},{ id: 2, name: 'Jack'},{ id: 1, name: 'Tom'},{ id: 3, name: 'Mike'},{ id: 3, name: 'Mike'},{ id: 2, name: 'Jack'},
]function getUniqueArr(array) {let idObj = {}return array.reduce((pre, item, index ,arr) => {if(!idObj[item.id]) {idObj[item.id] = truereturn [...pre, item]} else {return pre}}, [])
}
console.log('uniqueArr', getUniqueArr(repeatArr))

在这里插入图片描述
传入初始值 [ ],第一次的 total, item, index 就变成了[], { id: 1, name: 'Tom'}, 0

9.2 和其他数组原型链循环方式比较

9.2.1 相同点

9.2.1.1 都有当前元素、当前索引、数组 3个参数

9.2.2 不同点

9.2.2.1 作为累加器,增加了 total 和 initialValue 两个参数

9.2.2.1 可以函数中处理新数组的元素个数和元素值(基于原数组创建一个元素个数和值都有变化的新数组时,非常好用)

10. reduceRight 循环(Array.prototype 数组原型上的方法)

10.1 使用方式:和reduce功能一样,只是遍历顺序相反

array.reduceRight(function(total, item, index, arr), initialValue)
let arr1 = ['red','yellow','blue', 'green']
let namesStr = arr1.reduceRight((total, item, index, arr) => {console.log(total, item, index)return total + ',' + item
})console.log('namesStr', namesStr)

在这里插入图片描述

11. while 循环

11.1 使用方式

let arr1 = ['red','yellow','blue', 'green']
let i = 0
while(i < arr1.length) {console.log(arr1[i])i++
}

在这里插入图片描述

11.2 和其他循环比较

11.2.1 相同点

11.2.1.1 都可以遍历数组

11.2.2 不同点

11.2.2.1 可以自定义遍历条件,更加灵活

11.2.2.2 可以随意对数组进行处理

11.2.2.3 作为遍历条件的参数大多数情况下会成为全局变量,需要注意命名,避免重名影响其他变量

12. do while 循环

12.1 使用方式

let i = 0
do {console.log(arr1[i])i++
} while(i < arr1.length)

在这里插入图片描述

12.2 和 while 循环比较 :无论如何都会执行第一次循环

13. 综合上述

不同循环方式都有其优势和劣势,我们应该根据具体场景使用。

13.1 遍历数组,for 循环功能最完善

遍历数组,最经典也是最好用的就是 for 循环,功能最全。如果觉得记忆太麻烦,记住这一种遍历方式即可。

13.2 遍历对象,使用 for-in 循环(不建议遍历数组)

遍历对象,使用 for-in 循环,虽然for-in也支持遍历数组,但是更加适合遍历对象;

let obj1 = {name: 'Sheldon',age: 26,sex: 'male'
}
// 方式三:for-in 循环
for (const key in obj1) {console.log(key, obj1[key])
}

13.3 遍历对象数组,需要break或者continue时,可使用 for-of 循环

遍历对象数组,并且当数组数据量过大,需要从循环中break或者continue释放出来时,使用 for-of 循环;

let arr1 = ['red','yellow','blue']
for(let element of arr1) {console.log('element', element)if(element === 'yellow') {break}
}
console.log('arr1', arr1)

13.4 遍历对象数组,不需要break或者continue时,使用 array.forEach 循环

let arr1 = ['red','yellow','blue']
// 方式四:forEach 循环
arr1.forEach((val, index, arr) => {console.log(val, index, arr)
});

13.5 筛选元素,使用array.filter 循环

(5)筛选符合条件的元素生成新数组时,使用 array.filter 循环

let objArr = [{name: 'Sheldon',age: 26,sex: 'male'}, {name: 'Jane',age: 20,sex: 'female'}, {name: 'Mick',age: 24,sex: 'male'},
]
// 方式五: filter 循环
let newArr = objArr.filter((item, index, arr) => {return item.age > 20
})
console.log('newArr', newArr)
## 13.6 

13.6 修改元素生成新数组,使用 array.map 循环

基于原数组修改数据生成新数组时,使用 array.map 循环

let objArr = [{name: 'Sheldon',age: 26,sex: 'male'}, {name: 'Jane',age: 20,sex: 'female'}, {name: 'Mick',age: 24,sex: 'male'},
]
let nameArr = objArr.map(item => {return item.name
})
console.log('nameArr:', nameArr)let ageArr = objArr.map(item => item.age + 1
)
console.log('ageArr:', ageArr)console.log('objArr:', objArr)

13.7 累加数值,或者处理元素个数和内容时,使用 array.reduce 循环

作为累加器或者需要对数组的个数和值进行处理时,使用 array.reduce 循环

// 方式九:reduce循环
let numArr = [11, 13, 15, 17, 19]
let totalNum = numArr.reduce((total, item, index , arr) => {console.log(total, item, index, arr)return total + item
})
console.log('totalNum', totalNum)
array.reduce(function(total, item, index, arr), initialValue)
let repeatArr = [{ id: 1, name: 'Tom'},{ id: 2, name: 'Jack'},{ id: 1, name: 'Tom'},{ id: 3, name: 'Mike'},{ id: 3, name: 'Mike'},{ id: 2, name: 'Jack'},
]function getUniqueArr(array) {let idObj = {}return array.reduce((pre, item, index ,arr) => {if(!idObj[item.id]) {idObj[item.id] = truereturn [...pre, item]} else {return pre}}, [])
}
console.log('uniqueArr', getUniqueArr(repeatArr))

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

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

相关文章

灰度非线性变换之c++实现(qt + 不调包)

本章介绍灰度非线性变换&#xff0c;具体内容包括&#xff1a;对数变换、幂次变换、指数变换。他们的共同特点是使用非线性变换关系式进行图像变换。 1.灰度对数变换 变换公式&#xff1a;y a log(1x) / b&#xff0c;其中&#xff0c;a控制曲线的垂直移量&#xff1b;b为正…

快速解决IDEA中类的图标变成J,不是C的情况

有时候导入新的项目后&#xff0c;会出现如下情况&#xff0c;类的图标变成J&#xff0c;如图&#xff1a; 直接上解决方法: 找到项目的pom.xml&#xff0c;右键&#xff0c;在靠近最下方的位置找到Add as Maven Project&#xff0c;点击即可。 此时&#xff0c;一般类的图标就…

Wlan——射频和天线基础知识

目录 射频的介绍 射频和Wifi 射频的相关基础概念 射频的传输 信号功率的单位 射频信号传输行为 天线的介绍 天线的分类 天线的基本原理 天线的参数 射频的介绍 射频和Wifi 什么是射频 从射频发射器产生一个变化的电流&#xff08;交流电&#xff09;&#xff0c;通过…

【信号生成器】从 Excel 数据文件创建 Simulink 信号生成器块研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Linux 文件基本属性

Linux 文件基本属性 Linux 系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。 为了保护系统的安全性&#xff0c;Linux 系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做了不同的规定。 在 Linux 中我…

【项目学习1】如何将java对象转化为XML字符串

如何将java对象转化为XML字符串 将java对象转化为XML字符串&#xff0c;可以使用Java的XML操作库JAXB&#xff0c;具体操作步骤如下&#xff1a; 主要分为以下几步&#xff1a; 1、创建JAXBContext对象&#xff0c;用于映射Java类和XML。 JAXBContext jaxbContext JAXBConte…

8.10CPI决战日来临,黄金会意外走高吗?

近期有哪些消息面影响黄金走势&#xff1f;黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周四(8月10日)亚市早盘&#xff0c;美元指数在102.50维持多头走势&#xff0c;黄金避险情绪消散&#xff0c;金价跌至1916美元&#xff0c;下破1900美元前景深化。周三黄…

分布式 - 服务器Nginx:一小时入门系列之静态网页配置

文章目录 1. 静态文件配置2. nginx listen 命令解析3. nginx server_name 命令解析4. nginx server 端口重复5. nginx location 命令 1. 静态文件配置 在 /home 文件下配置一个静态的AdminLTE后台管理系统&#xff1a; [rootnginx-dev conf.d]# cd /home [rootnginx-dev home…

「2024」预备研究生mem-论证推理强化:评价类

一、论证推理强化&#xff1a;评价类 二、课后题

0基础学习VR全景平台篇 第81篇:全景相机-临云镜如何直播推流

临云镜全景相机是阿里巴巴定制全景设备&#xff0c;实现空间三维信息的快速采集&#xff0c;与阿里云三维空间重建平台搭配&#xff0c;帮助品牌商与平台以较低的成本完成空间的快速采集&#xff0c;并支持对室内/室外空间的三维全景展示及空间漫游&#xff0c;同时支持VR浏览、…

jmeter创建一个压测项目

1.jemeter新建一个项目&#xff1a; 2.接下来对Thread进行描述&#xff0c;也可以先使用默认的Thread进行操作。 3.添加http请求头的信息。按照如图所示操作 4.在请求头里面添加必要的字段&#xff0c;可以只填必要字段就可以 5.添加Http请求信息&#xff0c;如下图&#xff…

LeetCode练习习题集【4月 - 7 月】

LEETCODE习题集【4月-7月总结】 简单 数组部分 1.重复数 题目&#xff1a; 在一个长度u为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中…

【Java设计模式】建造者模式 注解@Builder

概念 将一个复杂对象的构造与它的表示分离&#xff0c;使同样的构建过程可以创建不同的表示。它使将一个复杂的对象分解成多个简单的对象&#xff0c;然后一步步构建而成。 每一个具体建造者都相对独立&#xff0c;而与其它的具体建造者无关&#xff0c;因此可以很方便地替换具…

nginx 负载均衡

1.环境准备 我使用的说centos7的系统 1.20版本的nginx 另外还有3台虚拟机 主机&#xff1a;192.168.163.142 两台服务器&#xff1a;服务器A--192.168.163.140 服务器B---192.168.163.141 2.配置服务器A和B 找到nginx下的html目录&#xff0c;编辑其中的index.html(在此…

nginx负载均衡

目录 负载均衡 nginx的七层代理和四层代理 四层代理与七层代理之间的区别 四层和七层谁的速度快&#xff1f; 正向代理与反向代理 负载均衡 upstream 算法 算法总结 stream 负载均衡 通过反向代理来实现 nginx的七层代理和四层代理 七层是最常用的反向代理方式&am…

实践指南-前端性能提升 270% | 京东云技术团队

一、背景 当我们疲于开发一个接一个的需求时&#xff0c;很容易忘记去关注网站的性能&#xff0c;到了某一个节点&#xff0c;猛地发现&#xff0c;随着越来越多代码的堆积&#xff0c;网站变得越来越慢。 本文就是从这样的一个背景出发&#xff0c;着手优化网站的前端性能&a…

JS逆向系列之猿人学爬虫第8题-验证码-图文点选

题目地址 https://match.yuanrenxue.cn/match/8本题的难点就在于验证码的识别,没啥js加密,只要识别对了携带坐标就给返回数据 回过头来看验证码 这里复杂的字体比较多,人看起来都有点费劲(感觉可能对红绿色盲朋友不太又好)&#x

PS 2023 安装选项页面显示不全

文章目录 PS 2023 安装选项页面显示不全解决办法 PS 2023 安装选项页面显示不全 解决办法 按住Tab键&#xff0c;点击该安装选项页面即可&#xff0c;如下如所示&#xff1a;

仓储10、20代电子标签接口文档

标签注册 仓储10代注册 右下角左下角组合按键触发注册 注册成功&#xff1a;右上角绿灯变红灯&#xff0c;并显示信号强度的数值 ​ 仓储20代注册 右下角左下角组合按键触发注册 注册成功&#xff1a;右上角绿灯变红灯&#xff0c;并显示信号强度的数值 ​ 查询电子标签信息…

node笔记——调用免费qq的smtp发送html格式邮箱

文章目录 ⭐前言⭐smtp授权码获取⭐nodemailer⭐postman验证接口⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于node调用免费qq的smtp发送邮箱。 node系列往期文章 node_windows环境变量配置 node_npm发布包 linux_配置node node_nvm安装配置 node笔记_h…