深入浅出ES6中Array.from()方法


前言

        Array构造函数中有一个ES6新增的创建数组的静态方法from()用于将类数组结构或可迭代对象转换为数组实例

一、类数组是啥?

        顾名思义,就是类似于数组,但又不完全是数组,我们亲切的称它为和数组有相同结构的对象,注意再强调一遍它是对象!

        那它和数组有什么本质的区别嘞?我们引入JavaScript中最常见的类数组:arguments,废话不多说,上代码:

function fn() {
    console.log(arguments);
}
fn('I','love','u');

        我们定义一个函数fn用来打印函数的参数,返回arguments对象,在控制台我们可以看到以下输出结果:

        

        于是乎,我们在控制台打印个数组 ['I', 'love', 'u'] 查看它的结构:

                                                              

         经过一系列的比较我们发现:类数组和数组一样都具有键、值对以及length属性,不同之处在于类数组不具有数组原型上定义的丰富的形如concat()、map()等操作数组的方法。

下面我们来总结一下:

  1.      类数组是一个对象                                                                                                       
  2.      类数组具有length属性                                                                                                 
  3.      类数组使用数字作为key值

        JavaScript中还有许多类数组,由于今天的内容不在这儿,所以就不再一一赘述,有补充的老铁可以在评论区留言鸭!

二、Array.from()

1.语法

 Array.from(arraylLike, MapFn, thisArg)

  • arrayLike:第一个参数,指定一个类数组对象or可迭代对象
  • MapFn(可选):第二个参数,新数组中的每一个元素执行该回调函数
  • thisArg(可选):第三个参数,执行回调函数MapFn时的this对象

返回值:一个新数组实例

2.浅拷贝

下面以一个简单的例子使用Array.from()方法进行数组的浅拷贝

浅拷贝:只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。

示例如下:

const arr = [1, 2, 3];
// 浅拷贝,只复制指向对象的指针,不复制对象本身
const arrCopy = Array.from(arr);
console.log(arrCopy);    // [1, 2, 3]
console.log(arr === arrCopy);    // false

3.从类数组结构生成数组

根据上栏类数组的特性可以知道字符串是类数组的结构

下面我们通过两个小例子使用Array.from()方法进行以下操作

  • 将字符串对象拆分成单字符数组实例
  • 将arguments对象转化为数组实例

示例如下:

let str = "FFPrincess";
console.log(Array.from(str));
// ['F','F','P','r','i','n','c','e','s','s']
function arrayLike() {
    console.log(Array.from(arguments));
}
arrayLike('a','b','c');
// ['a', 'b', 'c']

4.从可迭代对象生成数组

对ES6新增集合类型Map与Set(后续文章详细介绍),对于其可迭代的特性

下面我们通过两个小例子使用Array.from()方法进行以下操作:

  • 从Set集合中生成数组实例
  • 从Map集合中分别迭代键、值生成各自的数组实例

示例如下:

const s = new Set(["one", "two", "three"]);
console.log(Array.from(s));
// ["one", "two", "three"]
const m = new Map([['1','red'], ['2','yellow'], ['3','green']]);
console.log(Array.from(m.keys()));
// [1, 2, 3]
console.log(Array.from(m.values()));
// ["red", "yellow", "green"]

5.增强新数组

当我们为Array.from()指定了第二个参数以后,我们便不用再像此前以Array.from().map()的形式通过创建中间数组来增强新数组了,只需要通过第二个参数作为映射函数直接增强新数组的值。

下面我们通过一个小例子使用Array.from()方法进行以下操作实现原数组数组的二次幂:

  • 使用箭头函数(后续文章介绍)表达式作为参数传入增强数组

示例如下:

const arr_1 = [2,4,6,8];
const arr_2 = Array.from(arr_1, x => x**2);
console.log(arr_2);   
// [4, 16, 32, 64]

当我们为Array.from()指定了第三个参数以后,表示映射函数的this值,this用来指向该函数的调用者(具体含义后续文章详细介绍)

下面我们通过一个小例子使用Array.from()方法进行以下操作实现原数组的增量为1:

  • 通过对象字面量创建对象obj并在其内部定义操作新数组的函数add
  • 将函数作为Array.from()第二个参数传入
  • 指定Array.from()第三个参数将this指向调用该函数的对象

示例如下:

let obj = {
    add(value) {
        return value + 1;
    }
}
const arr_1 = [2,4,6,8];
const arr_2 = Array.from(arr_1, obj.add, obj);
console.log(arr_2);
// [3, 5, 7, 9]

总结

        以上就是今天介绍主要内容,本文介绍了ES6新增Array.from()的基本使用,我言简意赅地将它的一系列操作称为“转正”,基于类数组(也可称作伪数组)对象及可迭代对象最终通过它转换为数组对象,从而实现了“转正”后的数组对象可以使用其内建的丰富的操作数组的方法。                       

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
ES6Array.from()和Array.of()都是用于创建新数组的方法,但它们的功能和使用方式有所不同。 1. Array.from(): - Array.from()方法用于从类数组对象或可迭代对象创建一个新的数组实例。 - 它接受一个类数组对象或可迭代对象作为第一个参数,并可选地接受一个映射函数和一个上下文对象作为第二个和第三个参数。 - 它将类数组对象或可迭代对象的每个元素转换为数组的对应元素。 - 映射函数可以在转换过程对每个元素进行处理。 - 返回一个新的数组实例。 示例: ```javascript // 从字符串创建数组 const str = 'hello'; const arr = Array.from(str); console.log(arr); // ['h', 'e', 'l', 'l', 'o'] // 从集合创建数组 const set = new Set([1, 2, 3]); const arr2 = Array.from(set, num => num * 2); console.log(arr2); // [2, 4, 6] ``` 2. Array.of(): - Array.of()方法用于创建一个包含任意数量参数的新数组实例。 - 它接受任意数量的参数,并将这些参数作为数组的元素,返回一个新的数组实例。 - 它解决了使用Array构造函数创建单个元素数组时的一些问题。 示例: ```javascript const arr1 = Array.of(1, 2, 3, 4); console.log(arr1); // [1, 2, 3, 4] const arr2 = Array.of(5); console.log(arr2); // [5] const arr3 = Array.of(undefined); console.log(arr3); // [undefined] ``` 总结: - Array.from()方法用于从类数组对象或可迭代对象创建一个新数组,并提供映射功能。 - Array.of()方法用于创建一个包含任意数量参数的新数组实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JV_32

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值