【JavaScript】数组 Array 总结(202404)

2024-04-19 00:20

本文主要是介绍【JavaScript】数组 Array 总结(202404),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🥰 数组 Array (202404)

数组 🔗

❤️‍🔥 数组是一种有序的多个变量值的集合,可以通过索引来获取元素。

❤️‍🔥 数组是一种特殊的对象类型。

1、创建数组

字面量

// a. 有元素
let arr = ['a', 'b', 'c'];
console.log(arr);
// b. 空数组
let arr1 = [];
console.log(arr1);
// c. 创建初始长度为10的数组
let arr2 = [];
arr2.length = 10;
console.log(arr2);
// 元素为空,访问为 undefined
console.log(arr2[1]); // undefined

构造函数 🔗 Array

Array() 构造函数用于创建 Array 对象。

// 语法
// elementN : 用于创建数组的元素。new Array();
new Array(element0);
new Array(element0, element1);
new Array(element0, element1, /* … ,*/ elementN);
new Array(arrayLength);Array();
Array(element0);
Array(element0, element1);
Array(element0, element1, /* … ,*/ elementN);
Array(arrayLength);

🔹 调用 Array() 时可以使用或不使用 new。两者都会创建一个新的 Array 实例。

let arr3 = new Array('a', 'b', 'c');
console.log(arr3);
let arr4 = Array('a', 'b', 'c');
console.log(arr4);
let arr5 = new Array(10);
console.log(arr5);
console.log(arr5[1]); // undefined

❤️‍🔥 推荐字面量的方式创建数组

创建多维数组

let arr = [[1, 1],[1, 2],[1, 3],[2, 1],[2, 2],[2, 3],
];
console.table(arr);
console.log(arr[0]); // (2) [1, 1]

Array.of 🔗

Array.of() 静态方法通过可变数量的参数创建一个新的 Array 实例,而不考虑参数的数量或类型。

// 语法
// elementN : 用于创建数组的元素。
Array.of();
Array.of(element0);
Array.of(element0, element1);
Array.of(element0, element1, /*… ,*/ elementN);
let arr = Array.of();
console.log(arr); // []arr[10] = 'a';
console.log(arr); // (11) [empty × 10, 'a']console.log(arr[1]); // undefinedlet arr1 = Array.of('a', 'b', 'c');
console.log('arr1:', arr1); // (3) ['a', 'b', 'c']
arr1[10] = '10';
console.log(arr1); //(11) ['a', 'b', 'c', empty × 7, '10']

🆙 Array.of vs Array()
设置一个参数时不会创建空元素数组

let arr = Array.of(10);
console.log(arr); // [10]
console.log(arr.length); // 1
console.log(arr[0]); // 10let arr1 = new Array(10);
console.log(arr1); // (10) [empty × 10]
console.log(arr1.length); // 10
console.log(arr1[0]); // undefined

类型检测 Array.isArray() 🔗

检测当前变量的数据类型是否为数组。
Array.isArray() 静态方法用于确定传递的值是否是一个数组。

// value:需要检测的值。
// 返回值:如果 value 是 Array,则为 true;否则为 false。
Array.isArray(value);
console.log(Array.isArray([])); // true
console.log(Array.isArray(new Array())); //true
console.log(Array.isArray(Array())); //trueconsole.log(Array.isArray(new Array(3))); // true
console.log(Array.isArray(new Array(3, 4))); // trueconsole.log(Array.isArray(Array.of(3))); //trueconsole.log(Array.isArray({})); // false
console.log(Array.isArray(1)); // false
console.log(Array.isArray(1, 2)); // false
console.log(Array.isArray(1, [1, 2])); // false
console.log(Array.isArray('a')); //false

2、类型转换

可以将数组转换为字符串也可以将其他类型转换为数组。

字符串

toString() 🔗

toString() 方法返回一个字符串,表示指定的数组及其元素。

// 1.1 toString()
console.log(['a', 'b', 'c'].toString()); // a,b,c
console.log([1, 2, 3].toString()); // 1,2,3
console.log([1, , , 3].toString()); // 1,,,3
console.log([undefined, null].toString()); // ,let obj1 = {name: 'obj1',
};
let obj2 = {name: 'obj2',
};
console.log([obj1, obj2].toString()); //[object Object],[object Object]
🔗 String()
console.log(String(['a', 'b', 'c'])); // a,b,c
console.log(String([1, 2, 3])); //  1,2,3
console.log(String([1, , , 3])); //  1,,,3
console.log(String([undefined, null])); // ,
console.log(String([obj1, obj2])); // [object Object],[object Object]
🔗 Array.prototype.join()
join();join(separator);
// 指定一个字符串来分隔数组的每个元素。
//   如果需要,将分隔符转换为字符串。
//   如果省略,数组元素用逗号(,)分隔。
//   如果 separator 是空字符串(""),则所有元素之间都没有任何字符。
console.log(['a', 'b', 'c'].join()); // a,b,c
console.log(['a', 'b', 'c'].join('-')); //a-b-c'
console.log([1, 2, 3].join()); // 1,2,3
console.log([1, 2, 3].join('')); // 123
console.log([1, , , 3, , ,].join('.')); // 1...3..
console.log([undefined, null].join()); // ,
console.log([obj1, obj2].join('-')); //[object Object]-[object Object]

🔗 Array.from()

Array.from() 静态方法从🔗 可迭代或🔗 类数组对象创建一个新的浅拷贝的数组实例。

Array.from(arrayLike);
Array.from(arrayLike, mapFn);
Array.from(arrayLike, mapFn, thisArg);
  • arrayLike : 想要转换成数组的类数组或可迭代对象。
    • JavaScript 中的“类(似)数组对象”是指一个有 length 属性,具体说是大于等于 0 的整数值的对象。
    • 如果你把类数组对象作为第一个参数传给 Array.from(…),它的行为方式和 slice() (没有参数)或者 apply(…) 是一样的,就是简单地按照数字命名的属性从 0 开始直到 length 值在这些值上循环。
    • 第一个参数是否为 iterable ,如果是的话,就使用迭代器来产生值并“复制”进入返回的数组。因为真正的数组有一个这些值之上的迭代器,所以 会自动使用这个迭代器。
  • mapFn : 【可选】第二个参数是一个映射 回调(和一般的 Array#map(…) 所期望的几乎一样),这个函数会被调用,来把来自于源的 每个值映射/转换到返回值。
  • thisArg : 这个参数为作为第二个参数传入的回调指定 this 绑定。否则,this 将会是 undefined。
console.log('Array.from()');
let str = 'hello world';
console.log(Array.from(str)); 
//(11) ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
let num = 10;
console.log(Array.from(num)); // []
❇️ 将类数组转换为数组
// 类数组对象 转为 数组
let likeArr = {length: 3,
};
console.log(Array.from(likeArr)); // (3) [undefined, undefined, undefined]
console.log(new Array(3)); // (3) [empty × 3]let likeArr1 = {0: 'a',1: 'b',length: 2,
};
console.log(Array.from(likeArr1)); //(2) ['a', 'b']
为对象设置 length 属性后也可以转换为数组,但要下标为数值或数值字符串
let obj = {0: 'zhangsan',1: 19,2: 1.88,length: 3,
};console.log(obj);
console.log(Array.from(obj)); //(3) ['zhangsan', 19, 1.88]
DOM 元素转换为数组后来使用数组函数,第二个参数类似于 map 函数的方法,可对数组元素执行函数处理
<button message="a">button</button> <button message="b">button</button>
const btns = document.querySelectorAll('button');
console.log(btns); // NodeList(2) [button, button] 有length属性
console.log(Array.isArray(btns)); //false// btns.map((item)=>item.style.color = 'yellow') // btns.map is not a functionArray.from(btns, (item, index) => {item.style.background = 'red';item.style.color = 'yellow';
});Array.from(btns).map((item) => (item.style.margin = '40px'));

展开语法:使用展开语法将 NodeList 转换为数组操作

.hidden {display: none;
}
<!-- 展开语法 -->
<div>aaa</div>
<div>bbb</div>
const divs = document.querySelectorAll('div');
console.log(divs); //NodeList(2) [div, div]
[...divs].map((item) => {item.style.backgroundColor = '#ccc';item.style.margin = '40px';item.style.height = '40px';item.style.width = '200px';item.style.lineHeight = '40px';item.style.textAlign = 'center';console.log(this);item.addEventListener('click', function () {console.log(this);this.classList.toggle('hidden');});
});

3、 展开语法 🔗 Spread syntax

数组合并

const arr1 = ['a', 'b', 'c'];
const arr2 = [1, 2, 3];console.log([...arr1, ...arr2]); //(6) ['a', 'b', 'c', 1, 2, 3]const obj = {name: 'info',
};
console.log([...arr1, obj]); //(4) ['a', 'b', 'c', {name:"info"}]// 复制数组 浅拷贝
const arr3 = ['c', 'o', 'p', 'y', { name: 'copy' }];
const copyArr3 = [...arr3];
console.log(copyArr3); //(4) ['c', 'o', 'p', 'y',{name: 'copy'}]console.log(arr3 === copyArr3); //falseconsole.log(arr3[4] === copyArr3[4]); //true

函数参数

  • 等价于 apply 的方式
  • 使用展示语法可以替代 arguments 🔗来接收任意数量的参数
  • 剩余参数🔗Rest parameters
function fn(...args) {console.log(args); // (6) [1, 2, 3, 4, 'a', 'b']console.log(Array.isArray(args)); // true
}
fn(1, 2, 3, 4, 'a', 'b');function bar(a, ...args) {console.log(a, args); // hello (4) [1, 2, 3, 4]
}
bar('hello', 1, 2, 3, 4);

节点转换

将 DOM 节点转为数组 NodeList 🔗

<button>aaa</button> <button>bbb</button>
const btns = document.querySelectorAll('button');
console.log(btns); // NodeList(2) [button, button]
// btns.filter((item)=>item.innerHtml = '按钮') // btns.filter is not a functionconsole.log([...btns]); //(2) [button, button][...btns].filter((item, index) => (item.innerHTML = `按钮${index}`));

4、解构赋值

Destructuring assignment 🔗
解构赋值语法是一种 Javascript 表达式。
可以将数组中的值或对象的属性取出,赋值给其他变量。

// 数组
const [name, age] = ['张三', 18];
console.log(name, age); //张三 18let [[p1], [p2, p3]] = [['a'], ['b', 3]];
console.log(p1, p2, p3); // a b 3let [obj] = [{name: 'obj',},
];
console.log(obj); // {name: 'obj'}
// 解构赋值数组
function getData() {return ['李四', 19];
}
const [name1, age1] = getData();
console.log(name1, age1);// 剩余解构
let [num1, ...nums] = [1, 2, 3, 4, 5];
console.log(num1, nums); // 1 (4)[2, 3, 4, 5]// 只赋值部分变量
let [num2, , ...num3] = [1, 2, 3, 4, 5];
// 索引为1的数组元素将被跳过
console.log(num2, num3); // 1 (3) [3, 4, 5]// 字符串解构
let [...str] = 'hello world';
console.log(str); // (11) ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']// 默认值
let [a = 'name', b] = ['王五'];
console.log(a); //王五// 函数参数
function foo([a, b]) {console.log(a, b);
}
foo(['hello', 'world']); // hello worldconst result = [[1, 2],[3, 4],
].map(([a, b]) => a + b);
console.log(result); //[3,7]

5、💠 管理元素

基本使用

通过索引改变数组

// 1.通过索引添加元素
let arr = [];
arr[1] = '1';
console.log(arr); // (2) [empty, '1']arr[4] = '4';
console.log(arr); // (5) [empty, '1', empty × 2, '4']// 2.通过索引改变元素
console.log('更改前:', arr[0]); // 更改前: undefined
arr[0] = '0';
console.log('更改后:', arr[0]); // 更改后: 0

通过 length 改变

// 2. 通过length
let arr = [];
console.log(arr.length); // 0
// 2.1. 通过 length的值 创建数组
arr.length = 5;
console.log(arr); // (5) [empty × 5]
console.log(arr[0]); // undefined// 2.2 通过length 向数组最后追加一个元素 5
arr[arr.length] = '5';
console.log(arr); // (6) [empty × 5, '5']
console.log(arr.length); // 6

扩展语法 - 展开语法批量添加元素

// 3. 通过扩展语法 形成新数组let arr1 = ['0', '1'];
let arr2 = ['2', '3'];// 给数组首位添加元素 形成新数组
let arr3 = ['a', ...arr1];
console.log(arr3); // (3) ['a', '0', '1']// 给数组末尾添加元素
let arr4 = [...arr2, 'd'];
console.log(arr4); //  ['2', '3', 'd']// 合并数组
let arr = [...arr1, ...arr2];
console.log(arr); //(4) ['0', '1', '2', '3']// arr1 除了 arr1[0] 元素,其余元素与 arr2 合并
let [, x1] = arr1;
let arrEx = [x1, ...arr2];
console.log('arrEx', arrEx);

Array.prototype.push()🔗

push() 方法将指定的元素添加到数组的末尾并返回新的数组长度

🔸 语法

push();
// elementN : 添加到数组末尾的元素。
push(element0);
push(element0, element1);
push(element0, element1, /*… ,*/ elementN);
// 原数组
const animals = ['pigs', 'goats', 'sheep'];// 1.push 改变原数组 返回值为数组长度
let count <

这篇关于【JavaScript】数组 Array 总结(202404)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/916180

相关文章

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug

Java中Object类的常用方法小结

《Java中Object类的常用方法小结》JavaObject类是所有类的父类,位于java.lang包中,本文为大家整理了一些Object类的常用方法,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. public boolean equals(Object obj)2. public int ha

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插