JS Array.from()将伪数组转换成数组的方法示例


Posted in Javascript onMarch 23, 2020

Array.from 方法用于将两类对象转换为真正的数组:

1、类似数组的对象,可以理解为“伪数组”

2、可遍历对象(比如字符串)

什么是伪数组?

伪数组都有一个基本的特点:必须有 length 属性。

let arrayLike = {
 "0": "a",
 "1": "b",
 "2": "c",
 "length": 3
}

像上面的 arrayLike 对象,有 length 属性,key 也是有序序列。

所以可以遍历,也可以查询长度。但却不能调用数组的方法。比如 push、pop 等方法。

在 ES6 之前,还有一个常见的伪数组:arguments。

arguments 看上去也很像一个数组,但它没有数组的方法。

比如 arguments.push(1) ,这样做一定会报错。

ES5 的做法

在 ES6 问世之前,开发者通常需要用以下的方法把伪数组转换成数组。

方法1:遍历
// 通过 makeArray 方法,把数组转成伪数组
function makeArray(arrayLike) {
 let result = [];
 for (let i = 0, len = arrayLike.length; i < len; i++) {
  result.push(arrayLike[i]);
 }
 return result;
}

function doSomething () {
 let args = makeArray(arguments);
 console.log(args);
}
doSomething(1, 2, 3);

// 输出: [1, 2, 3]

这个方法虽然有效,但要多写很多代码。

方法2:Array.prototype.slice.call

function doSomething () {
 let args = Array.prototype.slice.call(arguments);
 console.log(args);
}
doSomething(1, 2, 3);

// 输出: [1, 2, 3]

这个方法的功能和 方法1 是一样的,虽然代码量减少了,但不能很直观的让其他开发者觉得这是在转换。

ES6的做法

直到 ES6 提供了 Array.from 方法完美解决以上问题。

function doSomething () {
 let args = Array.from(arguments);
 console.log(args);
}

doSomething('一', '二', '三');

// 输出: ['一', '二', '三']

Array.from 的主要作用就是把伪数组和可遍历对象转换成数组的。

说“主要作用”的原因是因为 Array.from 还提供了2个参数可传。这样可以延伸很多种小玩法。

Array.from 的第二个参数是一个函数,类似 map遍历 方法。用来遍历的。

Array.from 的第三个参数接受一个 this 对象,用来改变 this 指向。

第三个参数的用法(不常用)

let helper = {
 diff: 1,
 add (value) {
  return value + this.diff; // 注意这里有个 this
 }
};

function translate () {
 return Array.from(arguments, helper.add, helper);
}

let numbers = translate(1, 2, 3);

console.log(numbers); // 2, 3, 4

其他玩法

创建长度为5的数组,且初始化数组每个元素都是1

let array = Array.from({length: 5}, () => 1)
console.log(array)

// 输出: [1, 1, 1, 1, 1]

第二个参数的作用和 map遍历 差不多的,所以 map遍历 有什么玩法,这里也可以做相同的功能。就不多赘述了。

把字符串转成数组

let msg = 'hello';
let msgArr = Array.from(msg);
console.log(msgArr);
// 输出: ["h", "e", "l", "l", "o"]

最后一个问题:如果传一个真正的数组给 Array.from 会返回什么结果?

答案是:会返回一个一模一样的数组。

到此这篇关于JS Array.from()将伪数组转换成数组的方法示例的文章就介绍到这了,更多相关JS Array.from伪数组转换成数组内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Javascript 相关文章推荐
使用基于jquery的gamequery插件做JS乒乓球游戏
Jul 31 Javascript
jQuery控制cookie过期时间的方法
Apr 07 Javascript
jquery实现弹出层登录和全屏层注册特效
Aug 28 Javascript
Vue实现动态显示textarea剩余字数
May 22 Javascript
javascript实现延时显示提示框效果
Jun 01 Javascript
js图片放大镜实例讲解(必看篇)
Jul 17 Javascript
vue中各选项及钩子函数执行顺序详解
Aug 25 Javascript
vue中,在本地缓存中读写数据的方法
Sep 21 Javascript
Vue项目打包部署到iis服务器的配置方法
Oct 14 Javascript
Vue 实现把表单form数据 转化成json格式的数据
Oct 29 Javascript
详解利用eventemitter2实现Vue组件通信
Nov 04 Javascript
vue计算属性+vue中class与style绑定(推荐)
Mar 30 Javascript
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
Mar 23 #Javascript
小程序使用分包的示例代码
Mar 23 #Javascript
用JS实现选项卡
Mar 23 #Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
Mar 23 #Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
Mar 23 #Javascript
vue ssr+koa2构建服务端渲染的示例代码
Mar 23 #Javascript
详解webpack-dev-middleware 源码解读
Mar 23 #Javascript
You might like
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
golang与php实现计算两个经纬度之间距离的方法
2016/07/22 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
Prototype 工具函数 学习
2009/07/23 Javascript
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
两种不同的方法实现js对checkbox进行全选和反选
2014/05/13 Javascript
javascript实现锁定网页、密码解锁效果(类似系统屏幕保护效果)
2014/08/15 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
Javascript快速实现浏览器系统通知
2017/08/26 Javascript
浅谈使用React.setState需要注意的三点
2017/12/18 Javascript
jQuery实现动态生成年月日级联下拉列表示例
2019/05/11 jQuery
微信小程序加载机制及运行机制图解
2019/11/27 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
浅谈JavaScript中的“!!”作用
2020/08/03 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
[03:34]2014DOTA2西雅图国际邀请赛 淘汰赛7月15日TOPPLAY
2014/07/15 DOTA
Python中使用dom模块生成XML文件示例
2015/04/05 Python
实例讲解python中的协程
2018/10/08 Python
python学生信息管理系统(初级版)
2018/10/17 Python
Python类中self参数用法详解
2020/02/13 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
Python截图并保存的具体实例
2021/01/14 Python
实列教程 一款基于jquery和css3的响应式二级导航菜单
2014/11/13 HTML / CSS
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
外企求职信范文分享
2013/12/31 职场文书
求职信写作要突出重点
2014/01/01 职场文书
心理咨询承诺书
2014/05/20 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
课外活动实习计划
2015/01/19 职场文书
高三数学复习备考教学反思
2016/02/18 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技