js--数组的 Array.of() 和 Array.from() 方法的使用总结

前言
JavaScript 中数组的本质是一个对象,它存在的 length 属性值随数组元素的长度变化,但是开发中经常会遇到拥有 length 属性和若干索引属性的对象,被称为类数组对象,类数组对象和数组类似,但是不能调用数组的方法。Array.from()方法解决了这一问题,将类数组转化为数组,本文就来总结一下 Array.of() 和Array.from() 的相关知识。
正文
1、Array.of()
首先来对比一下普通创建数组的方法:
var ar1 = new Array(2)
console.log(ar1.length, ar1) //2 [empty,empty] (empty表示空位)
var ar2 = new Array(1, 2, 3, 4)
console.log(ar2.length, ar2) //4 [1,2,3,4]
var ar3 = new Array("2")
console.log(ar3.length, ar3) //1 ["2"]
上面的代码中当使用单个数值参数来调用构造函数创建数据的时候,该数值会默认成为数组的长度;如果使用多项数据作为参数,这些参数会成为数组的项;而使用单个非数值类型的参数来调用,该参数会成为数组的唯一项。通过调用构造函数来创建数组,无法确定传入的参数是数组的长度还是具体的每一项,因此,ES6 针对这一点做了优化,提供了 Array.of () 方法。
Array.of() 方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。使用方法与构造函数类似,如下:
var ar1 = Array.of(3)
console.log(ar1); //[3]
var ar2 = Array.of("3")
console.log(ar2); //["3"]
var ar3 = Array.of(undefined)
console.log(ar3); //undefined
区别:Array.of() 和 Array 构造函数之间的区别在于处理整数参数:Array.of(3) 创建一个具有单个元素 3 的数组,而 Array(3) 创建一个长度为 3 的空数组(注意:这是指一个有 3 个空位 ( empty ) 的数组,而不是由 3 个 undefined 组成的数组)。
2、Array.from()
Array.from() 方法从一个类似数组或可迭代对象(内部有Symbol.iterator迭代器)创建一个新的,浅拷贝的数组实例并返回。
语法:Array.from ( arrayLike [, mapFn [, thisArg ] ] ),Array.from() 方法接收三个参数,其中第一个arrayLike 表示想要转化成数组的伪数组对象或者可迭代对象,第二个参数 mapFn 为可选参数,指定新数组中每个元素都执行的回调函数,相当于执行了一边map遍历,第三个参数 thisArg 为可选参数,表示执行第二个回调函数时的 this 对象。
(1)Array.from 转化 arguments类数组对象为数组
首先对比一下没有Array.from() 方法之前的转化方法:
function makeArray(arrayLike) {
var resultArr = []
for (let i = 0; i < arrayLike.length; i++) {
resultArr.push(arrayLike[i])
}
return resultArr
//或者return Array.prototype.slice.call(arrayLike);
}
function doSomething() {
console.log(arguments);
var args = makeArray(arguments)
console.log(args);
}
doSomething("a", "b")
// Arguments(2)["a","b",length:2...]
// ["a","b"]
基于上面的问题,ES6 优化后的便利方法如下:同样,除了arguments对象类似数组外,常用的还有 DOM 节点类数组 nodeList 等。
function doSomething() {
var args = Array.from(arguments)
console.log(args);
}
doSomething("a", "b")//["a","b"]
(2)Array.from() 不仅可以用于类数组对象,也可以用于迭代对象,这意味着该方法可以将任意Symbol.iterator 属性的对象转化为数组。
var numbers = {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
}
};
var numbers2 = Array.from(numbers, (value) => value + 1);
console.log(numbers2); // [2,3,4]
(3)除此之外,Array.from() 还有其他使用方法,如下:
// 将字符串转化为数组
var str = 'foo'
console.log(Array.from(str)); //['f','o','o']
// 将Set集合转化为数组
var set = new Set([1, 1, 2, 3, 4])
console.log(Array.from(set));// [1, 2, 3, 4] 数组去重
// 将map 集合转化为数组
var map = new Map([['1', 'a'], ['2', 'b']])
console.log(Array.from(map)); // [['1', 'a'], ['2', 'b']]
console.log(Array.from(map.keys()));// ['1','2']
console.log(Array.from(map.values())); // ['a','b']
// 传入第二个参数
var arr = [1, 2, 3]
console.log(Array.from(arr, x => x * 2));//[2, 4, 6]
// 数组浅复制(拷贝)
var arr1 =[{name:"name"},{age:"age"}]
var arr2 = Array.from(arr1)
console.log(arr2);//[{name:"name"},{age:"age"}]
arr1[0].name = "new Nmae"
console.log(arr1);// [{name:"new Nmae"},{age:"age"}]
console.log(arr2);// [{name:"new Nmae"},{age:"age"}]
写在最后
以上就是本文的全部内容,希望给读者带来些许的帮助和进步,方便的话点个关注,小白的成长之路会持续更新一些工作中常见的问题和技术点。

js--数组的 Array.of() 和 Array.from() 方法的使用总结的更多相关文章
- js数组和字符串去重复几种方法
js数组去重复几种方法 第一种:也是最笨的吧. Array.prototype.unique1 = function () { var r = new Array(); label:for(var i ...
- js数组遍历的常用的几种方法以及差异和性能优化
<script type="text/javascript"> /*对比: 1.map速度比foreach快 2.map会返回一个新数组,不对原数组产生影响,forea ...
- JS数组中every(),filter(),forEach(),map(),some()方法学习笔记!
ES5中定义了五种数组的迭代方法:every(),filter(),forEach(),map(),some(). 每个方法都接受两个参数:要在每一项运行的函数(必选)和运行该函数的作用域的对象-影响 ...
- js 数组取出最大值最小值和平均值的方法
1.直接遍历数组 ,,,,,,,]; ]; ;i<arr.length;i++){ if(max<arr[i]) max=arr[i]; } 2.借用Math的方法 ,,,,,,,]; v ...
- Js数组代替写循环的几个方法
简介 循环是个不可避免的结构,而且不好复用,同时循环还很难加入其他操作中.更麻烦的是,使用循环就意味着在每一个新的迭代中有更多变化需要响应. 上了循环的控制结构会使代码看起来变得复杂,故而这里提几个替 ...
- Js数组的map,filter,reduce,every,some方法
var arr=[1,2,3,4,5,6]; res = arr.map(function(x){return x*x}) [1, 4, 9, 16, 25, 36] res = arr.filter ...
- JS 数组去重(数组元素是对象的情况)
js数组去重有经典的 几种方法 但当数组元素是对象时,就不能简单地比较了,需要以某种方式遍历各值再判断是否已出现. 因为: 1.如果是哈希判断法,对象作哈希表的下标,就会自动转换成字符型类型,从而导致 ...
- js数组,字符串,json互相转换函数有哪些
js数组,字符串,json互相转换函数有哪些 一.总结 一句话总结: JSON.stringify(arr) JSON.parse(jsonString) str.split('') array.jo ...
- JS数组方法汇总 array数组元素的添加和删除
js数组元素的添加和删除一直比较迷惑,今天终于找到详细说明的资料了,先给个我测试的代码^-^ var arr = new Array(); arr[0] = "aaa"; arr[ ...
- 【转】 js数组 Array 交集 并集 差集 去重
原文:http://blog.csdn.net/ma_jiang/article/details/52672762 最劲项目需要用到js数组去重和交集的一些运算,我的数组元素个数可能到达1000以上, ...
随机推荐
- html table 固定列
css固定列: .td1{ position: sticky; z-index: 1; left:0; }
- 【转载】在Windows终端中显示UTF-8字符
一直苦恼于如何在Windows终端中显示UTF-8字符的问题.比如,在MySQL命令行下,如果数据库的编码是UTF-8,那么,在查询数据库的时候,里面的中文都会变成乱码.今天半无意的搜索了一下,结果发 ...
- [转载]用redis实现跨服务器session
地址:http://blog.chinaunix.net/uid-11121450-id-3284875.html 这个月我们新开发了一个项目,由于使用到了4台机器做web,使用dns做负载均衡, 上 ...
- 对OOP的理解
OOP是面向对象编程Object Oriented Programming,特征分别是封装.继承.多态.抽象. 封装:封装是指将对象信息状态通过访问权限修饰符隐藏在对象内部,不允许外部程序直接访问,如 ...
- spring Data Jpa的依赖+配置
spring data jpa 是spring基于的orm框架,jpa规范的基础上封装的一套JPA应用框架 添加的相关依赖: <properties> <spring.version ...
- CF622F-The Sum of the k-th Powers【拉格朗日插值】
正题 题目链接:https://www.luogu.com.cn/problem/CF622F 题目大意 给出\(n,k\),求 \[\sum_{i=1}^ni^k \] 解题思路 很经典的拉格朗日差 ...
- CF280C-Game on Tree【数学期望】
正题 题目链接:https://www.luogu.com.cn/problem/CF280C 题目大意 \(n\)个点的一棵树,每次选择一个没有染色的点把它和它的子树染黑,求期望全部染黑的步数. 解 ...
- Windows下Vim插件管理器Vundle的安装以及使用简介
Vundle下载 从GitHub clone仓库 cd %USERPROFILE% git clone git@github.com:VundleVim/Vundle.vim.git %USERPRO ...
- 分布式锁Redission
Redisson 作为分布式锁 官方文档:https://github.com/redisson/redisson/wiki 引入依赖 <dependency> <groupId&g ...
- Conda 命令
Conda 命令 1 检验当前conda的版本 conda -V 2 conda常用的命令 查看已有的虚拟环境 conda env list 创建虚拟环境和删除虚拟环境 anaconda命令创建pyt ...