百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

JavaScript中必须了解的3种创建数组的方式

toyiye 2024-08-29 00:34 6 浏览 0 评论

JavaScript备忘录 —— 创建数组的3种方式

1 # 直接声明

JavaScript是弱类型语言,因此你可以直接将一个数组赋值给一个变量,即创建了一个数组:

let arr = [1, 2, 3];


绝大多数情况下使用的都会使用这种语法创建/声明数组。其中数组使用中括号 [...] 包裹,元素之间用逗号 , 分隔。

有时为了代码优雅,遇到数组元素很长很多时,也可以采用换行方式编写:

let fruit - [
    "apple",
    "banana",
    "orange",
    "..."
]


2 # 以对象方式创建数组

这是创建数组的另一种语法,即使用构造函数 Arrary():

let arr = new Array();
let arr = Array();


备注: 调用 Array() 时可以使用或不使用 new。两者都会创建一个新的 Array 实例。但出于编程规范,建议使用 new 关键字。

用这种方式创建数组是,里面的参数有两种使用情况:

1. 仅一个Number类型参数

let arr = new Array(6);


当只传入一个 Number类型 的参数时,传入的参数则会被认定为是所创建数组的长度,而非元素。且这个数组仅有长度没有任何元素,若访问则是undefined。

补充知识:

含空槽的数组又被称作为稀疏数组。稀疏数组在使用数组迭代方法时,空槽元素都将被跳过。如果访问空槽元素,结果会是 undefine。

let arr = new Array(6);
console.log(arr); // [ <6 empty items> ]
console.log(arr[0]); // undefined
console.log(arr.length); // 6


2. 有一个非Number类型参数 或 有多个参数

续上回,如只有一个参数但不是 Number类型,则参数会被正常认定为是数组的一个元素

let arr = new Array("hello");
console.log(arr); // [ 'hello' ]
console.log(arr[0]); // hello
console.log(arr.length); // 1


有多个参数,则效果就如同使用[...]声明数组一样,所有参数都被视作数组的元素。

let arr = new Array("hello", "world", "!");
console.log(arr); // [ 'hello', 'world', '!' ]
console.log(arr.length); // 3


此种方式一般不会使用,不但有可能会引起一些误会,也没有中括号[...]方式简洁。

3 # 使用 Array.from() 方法创建

上面两种创建数组的基础方式都无法创建一个初始化的数组,这在一些情况下无法满足我们的需求,例如创建哈希数组等等。这便是 Array.from() 能解决的第一个问题。

Array.from() 是一个全局下的静态方法,其作用是从可迭代或类数组对象创建一个新的浅拷贝的数组实例。不仅如此,还可以附带一个映射函数为数组内部的元素进行初始化操作。

首先我们先搞明白Array.from()要求传入的第一个参数 —— 一个 类数组对象可迭代对象

1. 由类数组对象创建数组

该方法会根据类数组对象创建一个长度为length的数组,其中的元素key是合理下标值的元素。

什么是类数组对象?

顾名思义,就是形似数组的对象。对象的属性都含有key与value,而这个关系也可以看作是数组的下标的关系——key为下标,value为值。此外还有一个特别的key是length,用于表示数组长度。

类数组对象还有个别名叫arguments对象。

所以一个形似数组的对象是:

javascript

复制代码

let arguments = { 0: 1, 1: 2, 2: 3, 3: 4, length: 4 }

同时,这里举几个用不符合规则的类数组对象创建数组的样例:

  • 长度与元素数量不符

元素数量会严格按照length的值执行。如果没有length,则默认为0——即一个空数组。

let arguments = {
    0: 1,
    1: 2,
    2: 3,
    length: 4
}

let arr = Array.from(arguments);
console.log(arr); // [1, 2, 3, undefined]


let arguments = {
    0: 1,
    1: 2,
    2: 3,
    length: 0
}

let arr = Array.from(arguments);
console.log(arr); // []


  • 键值不符合下标规范

如键值不符合下标规范,则这个键值对会被直接忽略。其它符合规则的键值对则被当作数组元素。

let arguments = {
    0: 1,
    1: 2,
    3: 3,
    length: 4
}

let arr = Array.from(arguments);
console.log(arr); // [1, 2, undefined]


2. 由可迭代对象创建数组

除了从类数组对象创建数组,Array.from()也可以从任何可迭代对象创建数组。

什么是可迭代对象?

可迭代对象是实现了[Symbol.iterator]方法的对象,这个方法返回一个迭代器。这个迭代器对象又具有next()方法,每次调用next()方法就会返回一个包含value和done属性的对象,用于遍历该可迭代对象。

常见的内置可迭代对象有:

String Array TypedArray(例如 Uint8Array) NodeList HTMLCollection arguments对象 用户自定义的可迭代对象

比如从String创建数组:

let str = 'hello';
let arr = Array.from(str);
console.log(arr); // ["h", "e", "l", "l", "o"]


再比如从Set创建数组:

let set = new Set([1, 2, 3]);
let arr = Array.from(set);
console.log(arr); // [1, 2, 3]


3. 映射函数

除此之外,Array.from()还可以接受第二个参数,作为一个映射函数,用于对每个元素进行处理后再放入新数组,达到初始化的效果:

let set = new Set([1, 2, 3]);
let arr = Array.from(set, x => x * x);
console.log(arr); // [1, 4, 9]


这个映射函数类似于数组的 map() 方法:

关于 map() 方法

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

map()包含两个参数:

callbackFn:为数组中的每个元素执行的函数。它的返回值作为一个元素被添加为新数组中。

thisArg(可选):执行 callbackFn 时用作 this 的值。

其中的callbackFn被调用时将传入 3 个参数:

currentValue: 正在处理的当前元素。 index(可选): 正在处理的当前元素的索引。 array(可选): 调用了 map() 的数组本身。

但是Array.from()中的映射函数被调用时只传入 2 个参数(element、index),不接受 map() 中callbackFn的第三个参数array。因为Array.from()的执行过程中数组仍然在构建

除此之外,Array.from() 方法还接受第三个可选参数,这个参数被称为"this 值",与map()的thisArg参数一致。

let person = {
  name: 'John',
  sayHello: function() {
    return `Hello, my name is ${this.name}`;
  }
};

let nameArr = Array.from([1, 2, 3], function() {
  return this.sayHello();
}, person);

console.log(nameArr); // ["Hello, my name is John", "Hello, my name is John", "Hello, my name is John"]


所以可以说Array.from(obj, mapFn, thisArg) 和 Array.from(obj).map(mapFn, thisArg) 会具有相同的结果。只是Array.from()不会创建中间数组,而是直接构建一个新数组。

Array.from() 映射函数使用案例

  • 初始化哈希函数
let hash = Array.from({length: 26}, (item) => item = 0);


  • 将字符串转换为大写
let str = 'hello';
let arr = Array.from(str, (char) => char.toUpperCase());
console.log(arr); // ["H", "E", "L", "L", "O"]


  • 平方数组元素
let numbers = [1, 2, 3, 4, 5];
let squaredNumbers = Array.from(numbers, (x) => x * x);
console.log(squaredNumbers); // [1, 4, 9, 16, 25]


  • 获取元素及其索引
let colors = ['red', 'green', 'blue'];
let colorDetails = Array.from(colors, (color, index) => `${index}. ${color}`);
console.log(colorDetails); // ["0. red", "1. green", "2. blue"]


  • 使用箭头函数作为映射函数
let set = new Set([1, 2, 3]);
let doubledSet = Array.from(set, x => x * 2);
console.log(doubledSet); // [2, 4, 6]


总结

在JavaScript中,创建数组3 种主要方式,每种方式都有其独特的特点和适用场景,选择合适的数组创建方式可以提高代码的可读性和性能。

直接声明

  • 特点:语法简洁、直观,适用于大部分场景。
  • 使用场景:适合绝大多数的数组创建需求,尤其是需要创建包含已知元素的数组。
  • 案例

let arr = [1, 2, 3];

let fruits = [

"apple",

"banana",

"orange",

"..."

];

以对象方式创建数组

  • 特点:使用Array()构造函数,可以创建空数组或指定长度的数组。适用于一些特殊情况。
  • 使用场景:适合需要创建特定长度的空数组或从单个非数字参数创建数组的情况。
  • 案例

let arr = new Array(6); // 创建一个长度为6的空数组

let singleElementArray = new Array("hello"); // 创建一个包含单个元素的数组

let multipleElementsArray = new Array("hello", "world", "!"); // 创建一个包含多个元素的数组

使用Array.from()方法创建:

  • 特点:从类数组对象或可迭代对象创建数组,同时可以使用映射函数对数组元素进行初始化操作。
  • 使用场景:适合从类数组对象(如arguments对象)、可迭代对象(如Set、String)创建数组,或需要对元素进行初始化操作时使用。
  • 案例

// 从类数组对象创建数组

let arguments = {

0: 1,

1: 2,

2: 3,

length: 4

};

let arr = Array.from(arguments);

console.log(arr); // [1, 2, 3, undefined]

// 从字符串创建数组

let str = 'hello';

let strArray = Array.from(str);

console.log(strArray); // ["h", "e", "l", "l", "o"]

// 使用映射函数

let numbers = [1, 2, 3, 4, 5];

let squaredNumbers = Array.from(numbers, x => x * x);

console.log(squaredNumbers); // [1, 4, 9, 16, 25]


作者:Dikkoo
链接:https://juejin.cn/post/7376575006535237669

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码